From 5d44cad40f52d97e17380b30d60c0497fde84b3d Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 5 Oct 2023 09:39:00 -0400 Subject: [PATCH 01/98] Set Kubernetes version in ansible configs --- deploy/ansible/roles/k8s_install/defaults/main.yml | 1 + deploy/ansible/roles/k8s_install/tasks/k3s.yml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/deploy/ansible/roles/k8s_install/defaults/main.yml b/deploy/ansible/roles/k8s_install/defaults/main.yml index 1d9b74c29e..964598184c 100644 --- a/deploy/ansible/roles/k8s_install/defaults/main.yml +++ b/deploy/ansible/roles/k8s_install/defaults/main.yml @@ -14,6 +14,7 @@ k3s_options: - 644 - --disable - traefik +k3s_version: "v1.25.14+k3s1" # Options for installing the microk8s engine microk8s_options: diff --git a/deploy/ansible/roles/k8s_install/tasks/k3s.yml b/deploy/ansible/roles/k8s_install/tasks/k3s.yml index 94d3aac9b6..bbff12ae3b 100644 --- a/deploy/ansible/roles/k8s_install/tasks/k3s.yml +++ b/deploy/ansible/roles/k8s_install/tasks/k3s.yml @@ -6,10 +6,10 @@ ################################################ - name: Install k3s shell: - cmd: curl -sfL https://get.k3s.io | sh -s - {{ k3s_options | join(' ') }} + cmd: curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="{{ k3s_version }}" sh -s - {{ k3s_options | join(' ') }} creates: /usr/local/bin/k3s -# Change KillMode from "process" to "mixed" to eliminate 90 wait for k3s containers +# Change KillMode from "process" to "mixed" to eliminate 90s wait for k3s containers # to exit. This limits the ability to upgrade k3s in-place without stopping the # current containers but that is not needed for the NUC use case. - name: Patch k3s service From 2afb7ef4c80d77f9b91fba8757729f52bcd61efb Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 5 Oct 2023 09:40:26 -0400 Subject: [PATCH 02/98] Add service to write wired ethernet addess to external device --- deploy/ansible/playbook_kube_install.yaml | 4 +++ .../roles/support_tools/defaults/main.yml | 3 ++ .../support_tools/files/display-eth-addr.sh | 29 +++++++++++++++++++ .../roles/support_tools/handlers/main.yml | 10 +++++++ .../roles/support_tools/tasks/main.yml | 20 +++++++++++++ .../templates/display-eth.service.j2 | 10 +++++++ .../templates/display-eth.timer.j2 | 9 ++++++ 7 files changed, 85 insertions(+) create mode 100644 deploy/ansible/roles/support_tools/defaults/main.yml create mode 100755 deploy/ansible/roles/support_tools/files/display-eth-addr.sh create mode 100644 deploy/ansible/roles/support_tools/handlers/main.yml create mode 100644 deploy/ansible/roles/support_tools/tasks/main.yml create mode 100644 deploy/ansible/roles/support_tools/templates/display-eth.service.j2 create mode 100644 deploy/ansible/roles/support_tools/templates/display-eth.timer.j2 diff --git a/deploy/ansible/playbook_kube_install.yaml b/deploy/ansible/playbook_kube_install.yaml index 2dcb2022d7..e11d8150b1 100644 --- a/deploy/ansible/playbook_kube_install.yaml +++ b/deploy/ansible/playbook_kube_install.yaml @@ -50,3 +50,7 @@ name: k8s_config tags: - kubeconfig + + - name: Setup Support Tool + import_role: + name: support_tools diff --git a/deploy/ansible/roles/support_tools/defaults/main.yml b/deploy/ansible/roles/support_tools/defaults/main.yml new file mode 100644 index 0000000000..5a7ed314dc --- /dev/null +++ b/deploy/ansible/roles/support_tools/defaults/main.yml @@ -0,0 +1,3 @@ +--- +eth_update_period: 5s +eth_update_program: /usr/local/bin/display-eth-addr diff --git a/deploy/ansible/roles/support_tools/files/display-eth-addr.sh b/deploy/ansible/roles/support_tools/files/display-eth-addr.sh new file mode 100755 index 0000000000..cd4ead22f5 --- /dev/null +++ b/deploy/ansible/roles/support_tools/files/display-eth-addr.sh @@ -0,0 +1,29 @@ +#! /usr/bin/env bash + +TTY_DEV="${1:-/dev/ttyACM0}" + +if [ -e "$TTY_DEV" ] ; then + ETH_ADD_STR=`ip -4 -br address | grep "^en"` + ETH_IP=`echo ${ETH_ADD_STR} | sed -E -e 's%^[0-9a-z]+\s+[A-Z]+\s+([0-9\.]+)/.*%\1%'` + ETH_STATUS=`echo ${ETH_ADD_STR} | sed -E -e 's%^[0-9a-z]+\s+([A-Z]+)\s+[0-9\.]+/.*%\1%'` + + # Print results + # Clear screen + echo -en \\xfe\\x58 > ${TTY_DEV} + # Move cursor to origin + echo -en \\xfe\\x48 > ${TTY_DEV} + if [[ $ETH_IP == "" && $ETH_STATUS == "" ]] ; then + # set red background + echo -en \\xfe\\xd0\\xff\\x1f\\x1f > ${TTY_DEV} + # 1234567890123456 + echo " NO ETHERNET" > ${TTY_DEV} + echo -n " CONNECTED" > ${TTY_DEV} + else + # set green background + echo -en \\xfe\\xd0\\x3f\\xff\\x7f > ${TTY_DEV} + # Print IP address + echo "IP: ${ETH_IP} " > ${TTY_DEV} + # Print I/F Status + echo -n "Status: ${ETH_STATUS} " > ${TTY_DEV} + fi +fi diff --git a/deploy/ansible/roles/support_tools/handlers/main.yml b/deploy/ansible/roles/support_tools/handlers/main.yml new file mode 100644 index 0000000000..865e2d0722 --- /dev/null +++ b/deploy/ansible/roles/support_tools/handlers/main.yml @@ -0,0 +1,10 @@ +--- +- name: start display eth + systemd: + name: "{{ item }}" + state: started + enabled: true + daemon_reload: true + with_items: + - display-eth.service + - display-eth.timer diff --git a/deploy/ansible/roles/support_tools/tasks/main.yml b/deploy/ansible/roles/support_tools/tasks/main.yml new file mode 100644 index 0000000000..244c47163a --- /dev/null +++ b/deploy/ansible/roles/support_tools/tasks/main.yml @@ -0,0 +1,20 @@ +--- +- name: Install program to write wired ethernet address + copy: + src: display-eth-addr.sh + dest: "{{ eth_update_program }}" + owner: root + group: root + mode: 0755 + +- name: Setup service to update display + template: + src: "{{ item }}.j2" + dest: /usr/lib/systemd/system/{{ item }} + owner: root + group: root + mode: 0644 + with_items: + - display-eth.service + - display-eth.timer + notify: start display eth diff --git a/deploy/ansible/roles/support_tools/templates/display-eth.service.j2 b/deploy/ansible/roles/support_tools/templates/display-eth.service.j2 new file mode 100644 index 0000000000..dd31bfbd1e --- /dev/null +++ b/deploy/ansible/roles/support_tools/templates/display-eth.service.j2 @@ -0,0 +1,10 @@ +[Unit] +Description=Display ethernet address on external device +Wants=display-eth-addr.timer + +[Service] +Type=oneshot +ExecStart={{ eth_update_program }} + +[Install] +WantedBy=multi-user.target diff --git a/deploy/ansible/roles/support_tools/templates/display-eth.timer.j2 b/deploy/ansible/roles/support_tools/templates/display-eth.timer.j2 new file mode 100644 index 0000000000..75ca026a2a --- /dev/null +++ b/deploy/ansible/roles/support_tools/templates/display-eth.timer.j2 @@ -0,0 +1,9 @@ +[Unit] +Description=Display Ethernet Address on support tool display + +[Timer] +OnUnitActiveSec={{ eth_update_period }} +OnBootSec={{ eth_update_period }} + +[Install] +WantedBy=timers.target From 056ab952d216ee12b0e4c08493d550b837c6b2d3 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 5 Oct 2023 09:41:00 -0400 Subject: [PATCH 03/98] Update rancher ui config --- deploy/ansible/roles/wifi_ap/templates/etc_hosts.j2 | 12 ++++++------ deploy/scripts/setup_files/cluster_config.yaml | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/deploy/ansible/roles/wifi_ap/templates/etc_hosts.j2 b/deploy/ansible/roles/wifi_ap/templates/etc_hosts.j2 index 5b2c511514..cebb4294e2 100644 --- a/deploy/ansible/roles/wifi_ap/templates/etc_hosts.j2 +++ b/deploy/ansible/roles/wifi_ap/templates/etc_hosts.j2 @@ -1,9 +1,9 @@ -127.0.0.1 localhost -127.0.1.1 {{ ansible_hostname }} +127.0.0.1 localhost +127.0.1.1 {{ ansible_hostname }} # The following lines are desirable for IPv6 capable hosts -::1 localhost ip6-localhost ip6-loopback -ff02::1 ip6-allnodes -ff02::2 ip6-allrouters +::1 localhost ip6-localhost ip6-loopback +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters -{{ ap_gateway }} {{ ap_hostname }}.{{ ap_domain }} {{ ap_hostname }} +{{ ap_gateway }} {{ ap_hostname }}.{{ ap_domain }} {{ ap_hostname }} rancher.{{ ap_domain }} diff --git a/deploy/scripts/setup_files/cluster_config.yaml b/deploy/scripts/setup_files/cluster_config.yaml index 59f060af00..db6cd382f6 100644 --- a/deploy/scripts/setup_files/cluster_config.yaml +++ b/deploy/scripts/setup_files/cluster_config.yaml @@ -30,7 +30,7 @@ nginx-ingress-controller: name: ingress-controller reference: ingress-nginx/ingress-nginx namespace: ingress-nginx - wait: true + wait: false rancher-ui: repo: @@ -40,10 +40,10 @@ rancher-ui: name: rancher reference: rancher-stable/rancher namespace: cattle-system - version: 2.6.5 + version: 2.7.6 wait: true override: - hostname: rancher.local + hostname: rancher.thecombine.app bootstrapPassword: admin ingress: extraAnnotations: From fdd94ea75bda36eaa6c4c0002668e7bf96b60845 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 5 Oct 2023 09:41:14 -0400 Subject: [PATCH 04/98] Remove backend init container --- .../charts/backend/templates/deployment-backend.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/deploy/helm/thecombine/charts/backend/templates/deployment-backend.yaml b/deploy/helm/thecombine/charts/backend/templates/deployment-backend.yaml index 5b524a5b6b..51e49d93a6 100644 --- a/deploy/helm/thecombine/charts/backend/templates/deployment-backend.yaml +++ b/deploy/helm/thecombine/charts/backend/templates/deployment-backend.yaml @@ -24,14 +24,6 @@ spec: labels: combine-component: backend spec: - initContainers: - - name: chwonit - image: busybox:stable - command: ["sh","-c","chown -R 999:999 /myvol"] - volumeMounts: - - name: backend-data - mountPath: /myvol/combine-files - imagePullPolicy: IfNotPresent containers: - name: backend image: {{ template "backend.containerImage" . }} From 0053d9fa4e5e5873170a4f97277ed2b256d91f89 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 5 Oct 2023 09:41:44 -0400 Subject: [PATCH 05/98] WIP: Script to update running version of The Combine --- maintenance/scripts/combine-version.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 maintenance/scripts/combine-version.sh diff --git a/maintenance/scripts/combine-version.sh b/maintenance/scripts/combine-version.sh new file mode 100755 index 0000000000..85da34570b --- /dev/null +++ b/maintenance/scripts/combine-version.sh @@ -0,0 +1,24 @@ +#! /usr/bin/env bash + +if [ "$#" == "0" ] ; then + # Print versions + for deployment in frontend backend database maintenance ; do + VERSION=`kubectl describe deployment $deployment | grep "Image.*combine_" | sed -Ee "s/^ +Image: .*://"` + echo "$deployment: $VERSION" + done +else + echo "Set version to $1" + # Check to see if we are using public repos or private ones + VERSION_PATTERN='^v[0-9]+\.[0-9]+\.[0-9]+*$' + if [[ $1 =~ $VERSION_PATTERN ]] ; then + REPO="public.ecr.aws/thecombine/" + else + REPO="$AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com" + fi + + REPO=`kubectl describe deployment $deployment | grep "Image.*combine_" | sed -Ee "s/^ +Image: .*://"` + kubectl -n thecombine set image deployment/database database="public.ecr.aws/thecombine/combine_database:$1" + kubectl -n thecombine set image deployment/backend backend="public.ecr.aws/thecombine/combine_backend:$1" + kubectl -n thecombine set image deployment/frontend frontend="public.ecr.aws/thecombine/combine_frontend:$1" + kubectl -n thecombine set image deployment/maintenance maintenance="public.ecr.aws/thecombine/combine_maint:$1" +fi From a9b239121ba31206c0abe9f53b2e0fbbb66cdaa5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 5 Oct 2023 10:01:54 -0400 Subject: [PATCH 06/98] Check for login credentials when a non-released version is requested --- maintenance/scripts/combine-version.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/maintenance/scripts/combine-version.sh b/maintenance/scripts/combine-version.sh index 85da34570b..958d64fd58 100755 --- a/maintenance/scripts/combine-version.sh +++ b/maintenance/scripts/combine-version.sh @@ -14,11 +14,13 @@ else REPO="public.ecr.aws/thecombine/" else REPO="$AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com" + if ! kubectl get secrets aws-login-credentials 2>&1 >/dev/null ; then + echo "The requested version is in a private repo and this device does not have access to it." + exit 1 + fi fi - - REPO=`kubectl describe deployment $deployment | grep "Image.*combine_" | sed -Ee "s/^ +Image: .*://"` - kubectl -n thecombine set image deployment/database database="public.ecr.aws/thecombine/combine_database:$1" - kubectl -n thecombine set image deployment/backend backend="public.ecr.aws/thecombine/combine_backend:$1" - kubectl -n thecombine set image deployment/frontend frontend="public.ecr.aws/thecombine/combine_frontend:$1" - kubectl -n thecombine set image deployment/maintenance maintenance="public.ecr.aws/thecombine/combine_maint:$1" + kubectl -n thecombine set image deployment/database database="$REPO/combine_database:$1" + kubectl -n thecombine set image deployment/backend backend="$REPO/combine_backend:$1" + kubectl -n thecombine set image deployment/frontend frontend="$REPO/combine_frontend:$1" + kubectl -n thecombine set image deployment/maintenance maintenance="$REPO/combine_maint:$1" fi From ab46ec16b7538bd55b36b51cda32b7e7228af712 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 21 Nov 2023 08:24:37 -0500 Subject: [PATCH 07/98] Install on localhost --- deploy/ansible/group_vars/desktop/main.yml | 54 +++++++++++++++++++ deploy/ansible/host_vars/localhost/main.yml | 54 +++++++++++++++++++ deploy/ansible/hosts.yml | 3 ++ .../ansible/roles/wifi_ap/defaults/main.yml | 1 + .../ansible/roles/wifi_ap/tasks/install.yml | 19 +++++-- deploy/ansible/roles/wifi_ap/tasks/main.yml | 6 ++- .../roles/wifi_ap/templates/create_ap.conf.j2 | 2 +- 7 files changed, 131 insertions(+), 8 deletions(-) create mode 100644 deploy/ansible/group_vars/desktop/main.yml create mode 100644 deploy/ansible/host_vars/localhost/main.yml diff --git a/deploy/ansible/group_vars/desktop/main.yml b/deploy/ansible/group_vars/desktop/main.yml new file mode 100644 index 0000000000..e9dff55dfc --- /dev/null +++ b/deploy/ansible/group_vars/desktop/main.yml @@ -0,0 +1,54 @@ +--- +################################################# +# Group specific configuration items +# +# Group: nuc +################################################ + +################################################ +# Configure Kubernetes cluster +################################################ + +# Specify which Kubernetes engine to install - +# one of k3s or none. +k8s_engine: k3s + +image_pull_secret: aws-login-credentials + +# k8s namespaces +app_namespace: thecombine + +k8s_user: sillsdev +k8s_group: sillsdev + +####################################### +# Ingress configuration +ingress_namespace: ingress-nginx + +# For the NUCs we want to use the ansible host name +# since that is how we can connect on the local network +# The server name will direct traffic to the production +# server since it is used to get the certificates for the +# NUC. +k8s_dns_name: "{{ ansible_hostname }}" + +################################################ +# Ethernet settings +################################################ +eth_optional: yes + +################################################ +# WiFi access point settings +################################################ +has_wifi: yes +ap_domain: thecombine.app +ap_ssid: "{{ansible_hostname}}_ap" +ap_passphrase: "Combine2020" +ap_gateway: "10.10.10.1" +ap_hostname: "{{ansible_hostname}}" + +################################################ +# hardware monitoring settings +################################################ +include_hw_monitoring: yes +history_days: 60 diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml new file mode 100644 index 0000000000..ac0cfd9c10 --- /dev/null +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -0,0 +1,54 @@ +--- +################################################# +# Group specific configuration items +# +# Group: nuc +################################################ + +################################################ +# Configure Kubernetes cluster +################################################ + +# Specify which Kubernetes engine to install - +# one of k3s or none. +k8s_engine: k3s + +image_pull_secret: aws-login-credentials + +# k8s namespaces +app_namespace: thecombine + +k8s_user: "{{ ansible_user }}" +k8s_group: "{{ ansible_group }}" + +####################################### +# Ingress configuration +ingress_namespace: ingress-nginx + +# For the NUCs we want to use the ansible host name +# since that is how we can connect on the local network +# The server name will direct traffic to the production +# server since it is used to get the certificates for the +# NUC. +k8s_dns_name: "{{ ansible_hostname }}" + +################################################ +# Ethernet settings +################################################ +eth_optional: yes + +################################################ +# WiFi access point settings +################################################ +has_wifi: yes +ap_domain: thecombine.app +ap_ssid: "{{ansible_hostname}}_ap" +ap_passphrase: "Combine2020" +ap_gateway: "10.10.10.1" +ap_hostname: "{{ansible_hostname}}" + +################################################ +# hardware monitoring settings +################################################ +include_hw_monitoring: no +history_days: 60 diff --git a/deploy/ansible/hosts.yml b/deploy/ansible/hosts.yml index a18e607101..c89f2c5745 100644 --- a/deploy/ansible/hosts.yml +++ b/deploy/ansible/hosts.yml @@ -1,6 +1,9 @@ --- all: hosts: + localhost: + ansible_connection: local + combine_server_name: local.thecombine.app children: nuc: hosts: diff --git a/deploy/ansible/roles/wifi_ap/defaults/main.yml b/deploy/ansible/roles/wifi_ap/defaults/main.yml index 9b943cb034..c12bdb031f 100644 --- a/deploy/ansible/roles/wifi_ap/defaults/main.yml +++ b/deploy/ansible/roles/wifi_ap/defaults/main.yml @@ -5,5 +5,6 @@ ap_gateway: "10.10.10.1" ap_domain: example.com ap_hostname: "{{ ansible_hostname }}" +wifi_if_name: "{{ ansible_interfaces | join(' ') | regex_replace('^.*\\b(wl[a-z0-9]+).*$', '\\1') }}" ap_hosts_config: /etc/create_ap/create_ap.hosts create_ap_config: /etc/create_ap/create_ap.conf diff --git a/deploy/ansible/roles/wifi_ap/tasks/install.yml b/deploy/ansible/roles/wifi_ap/tasks/install.yml index 2ad92970be..74acb744ac 100644 --- a/deploy/ansible/roles/wifi_ap/tasks/install.yml +++ b/deploy/ansible/roles/wifi_ap/tasks/install.yml @@ -51,13 +51,22 @@ mode: 0644 notify: Restart create_ap -- name: Set /etc/hosts to redirect thecombine to WiFi address - template: - src: etc_hosts.j2 - dest: /etc/hosts +- name: Update localhost name + lineinfile: + path: /etc/hosts + regexp: ^127\.0\.1\.1 + state: present + line: 127.0.0.1 {{ ansible_hostname }} owner: root group: root - mode: 0644 + mode: "0644" + +- name: Redirect traffic for The Combine to the AP gateway + lineinfile: + path: /etc/hosts + regexp: ^{{ ap_gateway }} + state: present + line: "{{ ap_gateway }} {{ ap_hostname }}.{{ ap_domain }} {{ ap_hostname }} rancher.{{ ap_domain }}" - name: Install hosts lists for access point template: diff --git a/deploy/ansible/roles/wifi_ap/tasks/main.yml b/deploy/ansible/roles/wifi_ap/tasks/main.yml index 4d2feb07d7..f54f9d5a0a 100644 --- a/deploy/ansible/roles/wifi_ap/tasks/main.yml +++ b/deploy/ansible/roles/wifi_ap/tasks/main.yml @@ -1,10 +1,12 @@ --- - name: Install WiFi Access point - include: install.yml + include_tasks: + file: install.yml tags: - install - meta: flush_handlers - name: Set WiFi Access point - include: test.yml + include_tasks: + file: test.yml tags: - test diff --git a/deploy/ansible/roles/wifi_ap/templates/create_ap.conf.j2 b/deploy/ansible/roles/wifi_ap/templates/create_ap.conf.j2 index 53a22e5156..98af9aa14c 100644 --- a/deploy/ansible/roles/wifi_ap/templates/create_ap.conf.j2 +++ b/deploy/ansible/roles/wifi_ap/templates/create_ap.conf.j2 @@ -21,7 +21,7 @@ FREQ_BAND=2.4 NEW_MACADDR= DAEMONIZE=0 NO_HAVEGED=0 -WIFI_IFACE={{ ansible_interfaces | join(" ") | regex_replace('^.*\\b(wl[a-z0-9]+).*$', '\\1') }} +WIFI_IFACE={{wifi_if_name}} INTERNET_IFACE={{ ansible_interfaces | join(" ") | regex_replace('^.*\\b(e[nt][a-z0-9]+).*$', '\\1') }} SSID={{ ap_ssid }} PASSPHRASE={{ ap_passphrase }} From e0d8cd882c77241cfd910ebbf89e6518723cd2fb Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 21 Nov 2023 09:24:32 -0500 Subject: [PATCH 08/98] Add playbook for wifi access point only --- deploy/ansible/playbook_wifi_ap.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 deploy/ansible/playbook_wifi_ap.yml diff --git a/deploy/ansible/playbook_wifi_ap.yml b/deploy/ansible/playbook_wifi_ap.yml new file mode 100644 index 0000000000..fc9b971ec2 --- /dev/null +++ b/deploy/ansible/playbook_wifi_ap.yml @@ -0,0 +1,29 @@ +--- +############################################################## +# Playbook: playbook_test.yml +# +# playbook_docker.yml installs Docker, Docker Compose and any +# dependency packages. +# +############################################################## + +- name: Run Ansible Tests + hosts: all + gather_facts: yes + become: yes + + vars_files: + - "vars/config_common.yml" + - "vars/packages.yml" + + tasks: + - name: Update packages + apt: + update_cache: yes + upgrade: "yes" + + - name: Setup WiFi Access Point + import_role: + name: wifi_ap + tags: + - install From 3dcb20460f38beeb0e282535cd350b5fa60bc7d5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 21 Nov 2023 15:31:21 -0500 Subject: [PATCH 09/98] Remove microk8s, fix lookup on user/group on localhost --- deploy/ansible/group_vars/desktop/main.yml | 1 - deploy/ansible/group_vars/nuc/main.yml | 1 - deploy/ansible/host_vars/localhost/main.yml | 3 +- deploy/ansible/hosts.yml | 1 + .../roles/k8s_install/defaults/main.yml | 9 --- .../ansible/roles/k8s_install/tasks/k3s.yml | 8 ++- .../roles/k8s_install/tasks/microk8s.yml | 72 ------------------- .../roles/network_config/defaults/main.yaml | 2 +- .../roles/network_config/tasks/main.yml | 2 +- 9 files changed, 11 insertions(+), 88 deletions(-) delete mode 100644 deploy/ansible/roles/k8s_install/tasks/microk8s.yml diff --git a/deploy/ansible/group_vars/desktop/main.yml b/deploy/ansible/group_vars/desktop/main.yml index e9dff55dfc..945e06b1b5 100644 --- a/deploy/ansible/group_vars/desktop/main.yml +++ b/deploy/ansible/group_vars/desktop/main.yml @@ -19,7 +19,6 @@ image_pull_secret: aws-login-credentials app_namespace: thecombine k8s_user: sillsdev -k8s_group: sillsdev ####################################### # Ingress configuration diff --git a/deploy/ansible/group_vars/nuc/main.yml b/deploy/ansible/group_vars/nuc/main.yml index e9dff55dfc..945e06b1b5 100644 --- a/deploy/ansible/group_vars/nuc/main.yml +++ b/deploy/ansible/group_vars/nuc/main.yml @@ -19,7 +19,6 @@ image_pull_secret: aws-login-credentials app_namespace: thecombine k8s_user: sillsdev -k8s_group: sillsdev ####################################### # Ingress configuration diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index ac0cfd9c10..c461e5b046 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -18,8 +18,7 @@ image_pull_secret: aws-login-credentials # k8s namespaces app_namespace: thecombine -k8s_user: "{{ ansible_user }}" -k8s_group: "{{ ansible_group }}" +k8s_user: "{{ ansible_user_id }}" ####################################### # Ingress configuration diff --git a/deploy/ansible/hosts.yml b/deploy/ansible/hosts.yml index c89f2c5745..130768f634 100644 --- a/deploy/ansible/hosts.yml +++ b/deploy/ansible/hosts.yml @@ -3,6 +3,7 @@ all: hosts: localhost: ansible_connection: local + kubecfgdir: local combine_server_name: local.thecombine.app children: nuc: diff --git a/deploy/ansible/roles/k8s_install/defaults/main.yml b/deploy/ansible/roles/k8s_install/defaults/main.yml index 964598184c..560833cd44 100644 --- a/deploy/ansible/roles/k8s_install/defaults/main.yml +++ b/deploy/ansible/roles/k8s_install/defaults/main.yml @@ -15,12 +15,3 @@ k3s_options: - --disable - traefik k3s_version: "v1.25.14+k3s1" - -# Options for installing the microk8s engine -microk8s_options: - addons: - - storage - - dns - - ingress - - helm3 - - rbac diff --git a/deploy/ansible/roles/k8s_install/tasks/k3s.yml b/deploy/ansible/roles/k8s_install/tasks/k3s.yml index bbff12ae3b..d43a9062ed 100644 --- a/deploy/ansible/roles/k8s_install/tasks/k3s.yml +++ b/deploy/ansible/roles/k8s_install/tasks/k3s.yml @@ -27,6 +27,12 @@ register: k8s_user_home changed_when: false +- name: Get user group id for {{ k8s_user }} + shell: > + getent passwd {{ k8s_user }} | awk -F: '{ print $4 }' + register: k8s_user_group_id + changed_when: false + - name: Create .kube directories file: path: "{{ item.home }}/.kube" @@ -37,7 +43,7 @@ loop: - home: "{{ k8s_user_home.stdout }}" owner: "{{ k8s_user }}" - group: "{{ k8s_group }}" + group: "{{ k8s_user_group_id.stdout }}" - home: /root owner: root group: root diff --git a/deploy/ansible/roles/k8s_install/tasks/microk8s.yml b/deploy/ansible/roles/k8s_install/tasks/microk8s.yml deleted file mode 100644 index dacc9b1bce..0000000000 --- a/deploy/ansible/roles/k8s_install/tasks/microk8s.yml +++ /dev/null @@ -1,72 +0,0 @@ ---- -- name: Install microk8s snap - snap: - name: microk8s - classic: yes - -- name: Start microk8s - command: microk8s start - -- name: Add user to microk8s group - user: - name: "{{ k8s_user }}" - groups: microk8s - append: yes - -- name: Enable selected microk8s addons - command: microk8s enable {{ microk8s_options.addons | join(' ') }} - -- name: Add DNS name to microk8s config template - lineinfile: - path: /var/snap/microk8s/current/certs/csr.conf.template - insertafter: "^DNS\\.5" - line: DNS.6 = {{ k8s_dns_name }} - -- name: Get home directory for {{ k8s_user }} - shell: > - getent passwd {{ k8s_user }} | awk -F: '{ print $6 }' - register: k8s_user_home - changed_when: false - -- name: Create .kube directory - file: - path: "{{ k8s_user_home.stdout }}/.kube" - state: directory - owner: "{{ k8s_user }}" - group: "{{ k8s_group }}" - mode: 0700 - -- name: Save kubectl configuration in {{ k8s_user_home.stdout }}/.kube/config - shell: microk8s config > {{ k8s_user_home.stdout }}/.kube/config - -- name: Set permissions on .kube/config - file: - path: "{{ k8s_user_home.stdout }}/.kube/config" - state: file - owner: "{{ k8s_user }}" - group: "{{ k8s_group }}" - mode: 0600 - -- name: Save kubectl configuration in site_files on host - fetch: - src: "{{ k8s_user_home.stdout }}/.kube/config" - dest: "{{ kubecfg }}" - flat: yes - -- name: Restrict permissions to kubeconfig to owner - delegate_to: localhost - become: no - file: - path: "{{ kubecfg }}" - state: file - mode: 0600 - -- name: Replace server IP with DNS name in site_files copy - delegate_to: localhost - become: no - lineinfile: - state: present - path: "{{ kubecfg }}" - regexp: '^(\s+server: https:\/\/)[.0-9]+:16443' - backrefs: yes - line: '\1{{ combine_server_name}}:16443' diff --git a/deploy/ansible/roles/network_config/defaults/main.yaml b/deploy/ansible/roles/network_config/defaults/main.yaml index b39e835312..5b01a024e8 100644 --- a/deploy/ansible/roles/network_config/defaults/main.yaml +++ b/deploy/ansible/roles/network_config/defaults/main.yaml @@ -4,7 +4,7 @@ eth_if_pattern: "en[a-z][0-9]" ############################### # virtual_if device -# This is needed when microk8s is running on a target that +# This is needed when k3s is running on a target that # does not have an ethernet connection plugged-in. ############################### diff --git a/deploy/ansible/roles/network_config/tasks/main.yml b/deploy/ansible/roles/network_config/tasks/main.yml index 3dfd63d828..7c5cf2da2d 100644 --- a/deploy/ansible/roles/network_config/tasks/main.yml +++ b/deploy/ansible/roles/network_config/tasks/main.yml @@ -33,7 +33,7 @@ when: has_wifi ### -# Create a virtual network interface so that microk8s/k3s can run +# Create a virtual network interface so that k3s can run # when no ethernet connection is attached. ### - name: Create virtual network I/F From 17f4f4a7ac9a8c86a8a5248e9d535e42c3eb3167 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 27 Nov 2023 10:05:06 -0500 Subject: [PATCH 10/98] create playbook for desktop installation --- deploy/ansible/playbook_desktop_setup.yaml | 56 +++++++++++++++++++ ...e_install.yaml => playbook_nuc_setup.yaml} | 2 +- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 deploy/ansible/playbook_desktop_setup.yaml rename deploy/ansible/{playbook_kube_install.yaml => playbook_nuc_setup.yaml} (98%) diff --git a/deploy/ansible/playbook_desktop_setup.yaml b/deploy/ansible/playbook_desktop_setup.yaml new file mode 100644 index 0000000000..d7e28160cb --- /dev/null +++ b/deploy/ansible/playbook_desktop_setup.yaml @@ -0,0 +1,56 @@ +--- +############################################################## +# Playbook: playbook_kube_install.yml +# +# playbook_kube_install.yml installs the packages and +# configuration files that are required to run TheCombine +# as Docker containers managed by a Kubernetes cluster. +# +############################################################## + +- name: Configure hardware for The Combine + hosts: localhost + gather_facts: yes + become: yes + + vars_files: + - "vars/config_common.yml" + - "vars/packages.yml" + + tasks: + - name: Update packages + apt: + update_cache: yes + upgrade: "yes" + + - name: Setup WiFi Access Point + import_role: + name: wifi_ap + when: has_wifi + + - name: Enable hardware monitoring + import_role: + name: monitor_hardware + when: include_hw_monitoring + + - name: Configure Network Interfaces + import_role: + name: network_config + + - name: Install Docker Subsystem + import_role: + name: docker_install + + - name: Install Kubernetes Tools + import_role: + name: k8s_install + + - name: Get Kubernetes Configuration + import_role: + name: k8s_config + tags: + - kubeconfig + + - name: Setup Support Tool + import_role: + name: support_tools diff --git a/deploy/ansible/playbook_kube_install.yaml b/deploy/ansible/playbook_nuc_setup.yaml similarity index 98% rename from deploy/ansible/playbook_kube_install.yaml rename to deploy/ansible/playbook_nuc_setup.yaml index e11d8150b1..573f432965 100644 --- a/deploy/ansible/playbook_kube_install.yaml +++ b/deploy/ansible/playbook_nuc_setup.yaml @@ -9,7 +9,7 @@ ############################################################## - name: Configure hardware for The Combine - hosts: all + hosts: nuc gather_facts: yes become: yes From 2fc5f87136e9ee5362af9e2a1d25e5e61d64e7f0 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 27 Nov 2023 10:14:06 -0500 Subject: [PATCH 11/98] Comment out docker installation --- deploy/ansible/playbook_desktop_setup.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/deploy/ansible/playbook_desktop_setup.yaml b/deploy/ansible/playbook_desktop_setup.yaml index d7e28160cb..b2eb8ccd54 100644 --- a/deploy/ansible/playbook_desktop_setup.yaml +++ b/deploy/ansible/playbook_desktop_setup.yaml @@ -37,11 +37,11 @@ import_role: name: network_config - - name: Install Docker Subsystem - import_role: - name: docker_install + # - name: Install Docker Subsystem + # import_role: + # name: docker_install - - name: Install Kubernetes Tools + - name: Install Kubernetes import_role: name: k8s_install From bddcfb6f306992a72f49851466ed20f66ab9d00e Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 4 Dec 2023 10:10:53 -0500 Subject: [PATCH 12/98] Set link_kubeconfige to true for localhost --- deploy/ansible/hosts.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/deploy/ansible/hosts.yml b/deploy/ansible/hosts.yml index 130768f634..74e4a4245b 100644 --- a/deploy/ansible/hosts.yml +++ b/deploy/ansible/hosts.yml @@ -5,6 +5,7 @@ all: ansible_connection: local kubecfgdir: local combine_server_name: local.thecombine.app + link_kubeconfig: true children: nuc: hosts: From 8a80028523e3e9426e41903e2b87205099296d79 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 4 Dec 2023 10:11:50 -0500 Subject: [PATCH 13/98] Fix regex for IP address --- deploy/scripts/setup_target.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/scripts/setup_target.py b/deploy/scripts/setup_target.py index ebf4ebecf8..3bce8d35c7 100755 --- a/deploy/scripts/setup_target.py +++ b/deploy/scripts/setup_target.py @@ -29,7 +29,7 @@ def parse_args() -> argparse.Namespace: def update_hosts_file(tgt_ip: str, tgt_name: str, hosts_filename: Path) -> None: """Map tgt_name to tgt_ip in the specified hosts_filename.""" - match = re.search(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\..(\d{1,3})$", tgt_ip) + match = re.search(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", tgt_ip) if match is not None: ip_pattern = tgt_ip.replace(".", r"\.") else: From 806d0bf64318591e72dab6c90ce138133fade2ce Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 4 Dec 2023 10:15:17 -0500 Subject: [PATCH 14/98] Remove desktop group vars --- deploy/ansible/group_vars/desktop/main.yml | 53 ---------------------- 1 file changed, 53 deletions(-) delete mode 100644 deploy/ansible/group_vars/desktop/main.yml diff --git a/deploy/ansible/group_vars/desktop/main.yml b/deploy/ansible/group_vars/desktop/main.yml deleted file mode 100644 index 945e06b1b5..0000000000 --- a/deploy/ansible/group_vars/desktop/main.yml +++ /dev/null @@ -1,53 +0,0 @@ ---- -################################################# -# Group specific configuration items -# -# Group: nuc -################################################ - -################################################ -# Configure Kubernetes cluster -################################################ - -# Specify which Kubernetes engine to install - -# one of k3s or none. -k8s_engine: k3s - -image_pull_secret: aws-login-credentials - -# k8s namespaces -app_namespace: thecombine - -k8s_user: sillsdev - -####################################### -# Ingress configuration -ingress_namespace: ingress-nginx - -# For the NUCs we want to use the ansible host name -# since that is how we can connect on the local network -# The server name will direct traffic to the production -# server since it is used to get the certificates for the -# NUC. -k8s_dns_name: "{{ ansible_hostname }}" - -################################################ -# Ethernet settings -################################################ -eth_optional: yes - -################################################ -# WiFi access point settings -################################################ -has_wifi: yes -ap_domain: thecombine.app -ap_ssid: "{{ansible_hostname}}_ap" -ap_passphrase: "Combine2020" -ap_gateway: "10.10.10.1" -ap_hostname: "{{ansible_hostname}}" - -################################################ -# hardware monitoring settings -################################################ -include_hw_monitoring: yes -history_days: 60 From d69ed66ab6c9ae7d869f613a5625a82ec9436cd6 Mon Sep 17 00:00:00 2001 From: "D. Ror" Date: Fri, 17 Nov 2023 10:20:09 -0500 Subject: [PATCH 15/98] Update react from 17 to 18 (#2791) Also: * In `src/index.tsx` replace `import { render } from "react-dom";` with `import { createRoot } from "react-dom/client"` (per https://react.dev/blog/2022/03/08/react-18-upgrade-guide#updates-to-client-rendering-apis) * Update `@material-table/core` from 6.2 to 6.3 (not compatible with react 17) * Remove dependency `@mui/styles` (not compatible with react 18); replace with either `import { styled } from "@mui/system";` or direct `sx=` * Remove extra space from between audio components * Update `@microsoft/signalr` from 6 to 8 * Add dev dependency:`@babel/plugin-proposal-private-property-in-object` to deal with legacy warning * Migrate `@testing-library/react-hooks` usage to the corresponding parts in `@testing-library/react` * Remove unnecessary/problematic `await act(...` instances from `@testing-library/react tests` * Use `as any` to handle `TextFieldWithFont` type issues * Replace deprecated `tobeCalled` with `toHaveBeenCalled` and `tobeCalledTimes` with `toHaveBeenCalledTimes` * Remove extra space from between audio components --- .../assets/licenses/frontend_licenses.txt | 656 +- package-lock.json | 9570 ++++++++--------- package.json | 25 +- .../GlossWithSuggestions.tsx | 4 +- .../VernWithSuggestions.tsx | 4 +- .../DataEntryTable/NewEntry/StyledMenuItem.ts | 24 +- .../DataEntry/DataEntryTable/index.tsx | 4 +- .../DataEntryTable/tests/RecentEntry.test.tsx | 4 +- .../DataEntryTable/tests/index.test.tsx | 32 +- .../GoalTimeline/tests/GoalRedux.test.tsx | 12 +- .../GoalTimeline/tests/index.test.tsx | 2 +- .../Login/Redux/tests/LoginActions.test.tsx | 4 +- .../PasswordReset/tests/Request.test.tsx | 14 +- .../PasswordReset/tests/ResetPage.test.tsx | 28 +- .../Project/tests/ProjectActions.test.tsx | 6 +- .../ProjectExport/DownloadButton.tsx | 6 +- .../ProjectScreen/tests/index.test.tsx | 2 +- .../tests/ProjectName.test.tsx | 4 +- .../ProjectUsers/tests/EmailInvite.test.tsx | 10 +- .../ProjectUsers/tests/SortOptions.test.tsx | 2 +- src/components/Pronunciations/AudioPlayer.tsx | 37 +- .../Pronunciations/RecorderIcon.tsx | 18 +- .../tests/AudioRecorder.test.tsx | 16 +- .../SiteSettings/UserManagement/UserList.tsx | 3 +- .../ProgressBar/ProgressBarComponent.tsx | 17 +- src/components/Statistics/Statistics.tsx | 17 +- src/components/Statistics/StyledList.ts | 11 + .../tests/DomainStatistics.test.tsx | 2 +- .../Statistics/tests/Statistics.test.tsx | 4 +- .../Statistics/tests/UserStatistics.test.tsx | 2 +- .../DomainStatistics.test.tsx.snap | 8 +- .../__snapshots__/Statistics.test.tsx.snap | 4 +- .../tests/__snapshots__/index.test.tsx.snap | 4 +- .../TreeView/tests/TreeNavigator.test.tsx | 3 +- .../TreeView/tests/TreeSearch.test.tsx | 17 +- src/components/TreeView/tests/index.test.tsx | 8 +- .../UserSettings/ClickableAvatar.tsx | 31 +- .../UserSettings/tests/UserSettings.test.tsx | 36 +- .../CharacterDetail/tests/index.test.tsx | 4 +- .../CharInv/tests/index.test.tsx | 4 +- .../MergeDupsStep/MergeDragDrop/DragSense.tsx | 12 +- .../MergeDragDrop/SidebarDragSense.tsx | 12 +- .../MergeDuplicates/Redux/MergeDupsReducer.ts | 5 +- .../tests/PronunciationsCell.test.tsx | 36 +- src/index.tsx | 10 +- src/utilities/fontContext.ts | 16 +- src/utilities/tests/dictionaryLoader.test.ts | 2 +- src/utilities/tests/fontCssUtilities.test.ts | 4 +- src/utilities/wordUtilities.ts | 8 +- 49 files changed, 5180 insertions(+), 5584 deletions(-) create mode 100644 src/components/Statistics/StyledList.ts diff --git a/docs/user_guide/assets/licenses/frontend_licenses.txt b/docs/user_guide/assets/licenses/frontend_licenses.txt index df1d3e895f..d5694cca34 100644 --- a/docs/user_guide/assets/licenses/frontend_licenses.txt +++ b/docs/user_guide/assets/licenses/frontend_licenses.txt @@ -24,7 +24,7 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@babel/helper-module-imports 7.18.6 +@babel/helper-module-imports 7.22.15 MIT MIT License @@ -154,7 +154,7 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@babel/types 7.23.0 +@babel/types 7.23.3 MIT MIT License @@ -180,7 +180,7 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@date-io/core 2.16.0 +@date-io/core 2.17.0 MIT MIT License @@ -205,7 +205,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@date-io/date-fns 2.16.0 +@date-io/date-fns 2.17.0 MIT MIT License @@ -230,7 +230,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@date-io/dayjs 2.16.0 +@date-io/dayjs 2.17.0 MIT MIT License @@ -255,7 +255,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@date-io/luxon 2.16.1 +@date-io/luxon 2.17.0 MIT MIT License @@ -280,7 +280,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@date-io/moment 2.16.1 +@date-io/moment 2.17.0 MIT MIT License @@ -682,7 +682,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@floating-ui/react-dom 2.0.2 +@floating-ui/react-dom 2.0.4 MIT MIT License @@ -730,7 +730,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@hello-pangea/dnd 16.2.0 +@hello-pangea/dnd 16.3.0 Apache-2.0 Copyright 2021 Gabriel Santerre @@ -799,7 +799,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@material-table/core 6.2.11 +@material-table/core 6.3.0 MIT MIT License @@ -849,7 +849,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@microsoft/signalr 6.0.7 +@microsoft/signalr 8.0.0 MIT JavaScript and TypeScript clients for SignalR for ASP.NET Core and Azure SignalR Service @@ -871,9 +871,9 @@ yarn add @microsoft/signalr@next ## Usage -See the [SignalR Documentation](https://docs.microsoft.com/aspnet/core/signalr) at docs.microsoft.com for documentation on the latest release. [API Reference Documentation](https://docs.microsoft.com/javascript/api/%40aspnet/signalr/?view=signalr-js-latest) is also available on docs.microsoft.com. +See the [SignalR Documentation](https://learn.microsoft.com/aspnet/core/signalr) at learn.microsoft.com for documentation on the latest release. [API Reference Documentation](https://learn.microsoft.com/javascript/api/%40aspnet/signalr/?view=signalr-js-latest) is also available on learn.microsoft.com. -For documentation on using this client with Azure SignalR Service and Azure Functions, see the [SignalR Service serverless developer guide](https://docs.microsoft.com/azure/azure-signalr/signalr-concept-serverless-development-config). +For documentation on using this client with Azure SignalR Service and Azure Functions, see the [SignalR Service serverless developer guide](https://learn.microsoft.com/azure/azure-signalr/signalr-concept-serverless-development-config). ### Browser @@ -938,7 +938,7 @@ connection.start() ``` -@motionone/animation 10.15.1 +@motionone/animation 10.16.3 MIT MIT License @@ -963,7 +963,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@motionone/dom 10.16.2 +@motionone/dom 10.16.4 MIT MIT License @@ -988,7 +988,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@motionone/easing 10.15.1 +@motionone/easing 10.16.3 MIT MIT License @@ -1013,7 +1013,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@motionone/generators 10.15.1 +@motionone/generators 10.16.4 MIT MIT License @@ -1038,7 +1038,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@motionone/svelte 10.16.2 +@motionone/svelte 10.16.4 MIT MIT License @@ -1063,7 +1063,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@motionone/types 10.15.1 +@motionone/types 10.16.3 MIT MIT License @@ -1088,7 +1088,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@motionone/utils 10.15.1 +@motionone/utils 10.16.3 MIT MIT License @@ -1113,7 +1113,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@motionone/vue 10.16.2 +@motionone/vue 10.16.4 MIT MIT License @@ -1138,7 +1138,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/base 5.0.0-beta.22 +@mui/base 5.0.0-beta.24 MIT The MIT License (MIT) @@ -1163,7 +1163,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/core-downloads-tracker 5.14.16 +@mui/core-downloads-tracker 5.14.18 MIT The MIT License (MIT) @@ -1188,7 +1188,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/icons-material 5.14.11 +@mui/icons-material 5.14.18 MIT The MIT License (MIT) @@ -1213,7 +1213,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/material 5.14.16 +@mui/material 5.14.18 MIT The MIT License (MIT) @@ -1238,7 +1238,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/private-theming 5.14.16 +@mui/private-theming 5.14.18 MIT The MIT License (MIT) @@ -1263,7 +1263,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/styled-engine 5.14.16 +@mui/styled-engine 5.14.18 MIT The MIT License (MIT) @@ -1288,7 +1288,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/styles 5.14.16 +@mui/system 5.14.18 MIT The MIT License (MIT) @@ -1313,7 +1313,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/system 5.14.16 +@mui/types 7.2.9 MIT The MIT License (MIT) @@ -1338,7 +1338,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/types 7.2.8 +@mui/utils 5.14.18 MIT The MIT License (MIT) @@ -1363,32 +1363,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/utils 5.14.16 -MIT -The MIT License (MIT) - -Copyright (c) 2014 Call-Em-All - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -@mui/x-date-pickers 5.0.17 +@mui/x-date-pickers 5.0.20 MIT MIT License @@ -1437,7 +1412,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@redux-devtools/extension 3.2.5 +@redux-devtools/extension 3.2.6 MIT The MIT License (MIT) @@ -1462,7 +1437,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@reduxjs/toolkit 1.9.5 +@reduxjs/toolkit 1.9.7 MIT MIT License @@ -1487,7 +1462,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@remix-run/router 1.9.0 +@remix-run/router 1.11.0 MIT MIT License @@ -1514,7 +1489,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@segment/analytics-core 1.3.1 +@segment/analytics-core 1.3.2 MIT The MIT License (MIT) @@ -1538,7 +1513,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@segment/analytics-next 1.55.0 +@segment/analytics-next 1.60.0 MIT The MIT License (MIT) @@ -1586,7 +1561,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@segment/facade 3.4.9 +@segment/facade 3.4.10 null (The MIT License) @@ -40397,7 +40372,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -@types/chroma-js 2.4.0 +@types/chroma-js 2.4.3 MIT MIT License @@ -40422,11 +40397,11 @@ MIT SOFTWARE -@types/hoist-non-react-statics 3.3.1 +@types/hoist-non-react-statics 3.3.5 MIT MIT License - Copyright (c) Microsoft Corporation. All rights reserved. + Copyright (c) Microsoft Corporation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -40447,11 +40422,11 @@ MIT SOFTWARE -@types/parse-json 4.0.0 +@types/parse-json 4.0.2 MIT MIT License - Copyright (c) Microsoft Corporation. All rights reserved. + Copyright (c) Microsoft Corporation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -40472,7 +40447,7 @@ MIT SOFTWARE -@types/prop-types 15.7.9 +@types/prop-types 15.7.10 MIT MIT License @@ -40497,7 +40472,7 @@ MIT SOFTWARE -@types/react-dom 17.0.17 +@types/react-dom 18.2.15 MIT MIT License @@ -40522,7 +40497,7 @@ MIT SOFTWARE -@types/react-redux 7.1.24 +@types/react-redux 7.1.30 MIT MIT License @@ -40547,7 +40522,7 @@ MIT SOFTWARE -@types/react-transition-group 4.4.8 +@types/react-transition-group 4.4.9 MIT MIT License @@ -40572,7 +40547,7 @@ MIT SOFTWARE -@types/react 17.0.47 +@types/react 18.2.37 MIT MIT License @@ -40597,7 +40572,7 @@ MIT SOFTWARE -@types/scheduler 0.16.2 +@types/scheduler 0.16.6 MIT MIT License @@ -40964,7 +40939,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -convert-source-map 1.8.0 +convert-source-map 1.9.0 MIT Copyright 2013 Thorsten Lorenz. All rights reserved. @@ -40991,7 +40966,7 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -cosmiconfig 7.0.1 +cosmiconfig 7.1.0 MIT The MIT License (MIT) @@ -41017,7 +40992,7 @@ SOFTWARE. -cross-fetch 3.1.6 +cross-fetch 4.0.0 MIT The MIT License (MIT) @@ -41095,18 +41070,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -css-vendor 2.0.8 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Slobodskoi - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - csstype 3.1.2 MIT Copyright (c) 2017-2018 Fredrik Nicol @@ -41130,7 +41093,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -date-fns 2.29.3 +date-fns 2.30.0 MIT MIT License @@ -41155,7 +41118,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -dayjs 1.11.9 +dayjs 1.11.10 MIT MIT License @@ -41251,7 +41214,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -deepmerge 4.2.2 +deepmerge 4.3.1 MIT The MIT License (MIT) @@ -41422,7 +41385,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -dset 3.1.2 +dset 3.1.3 MIT The MIT License (MIT) @@ -41536,7 +41499,7 @@ SOFTWARE. -eventsource 1.1.2 +eventsource 2.0.2 MIT The MIT License @@ -41597,92 +41560,218 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -fetch-cookie 0.11.0 +fetch-cookie 2.1.0 Unlicense -# fetch-cookie [![npm version](https://badge.fury.io/js/fetch-cookie.svg)](https://badge.fury.io/js/fetch-cookie) [![Build Status](https://travis-ci.org/valeriangalliat/fetch-cookie.svg?branch=master)](https://travis-ci.org/valeriangalliat/fetch-cookie) +# 🍪 fetch-cookie [![npm version](https://img.shields.io/npm/v/fetch-cookie?style=flat-square)](https://www.npmjs.org/package/fetch-cookie) [![Build status](https://img.shields.io/github/workflow/status/valeriangalliat/fetch-cookie/Test?style=flat-square)](https://github.com/valeriangalliat/fetch-cookie/actions/workflows/test.yml) + +> Decorator for a `fetch` function to support automatic cookie storage +> and population. -> Decorator for a `fetch` function to support automatic cookie storage and population. +[Migrating from v1](#migrating-from-v1) ## Description -`fetch-cookie` wraps arround a `fetch` function and **intercepts request options and response -objects to store received cookies and populate request with the appropriate cookies**. +fetch-cookie wraps around a `fetch` function and **intercepts request +options and response objects to store received cookies and populate +request with the appropriate cookies**. -This library is developed with Node.Js and fetch polyfill libraries such as [node-fetch] in mind, since -the browser version is supposed to let a way [to include cookies in requests][include]. -Compatibility may not be guaranteed but as long as your library implements the [Fetch Standard] you should be fine. -In case of incompatibilities, please create a new issue. +This library is developed with Node.js and `fetch` polyfill libraries such +as [node-fetch] in mind, since the browser version is supposed to let a +way [to include cookies in requests][include]. Compatibility may not be +guaranteed but as long as your library implements the [Fetch standard] +you should be fine. In case of incompatibilities, please create a new +issue. -[Fetch Standard]: https://fetch.spec.whatwg.org/ +[Fetch standard]: https://fetch.spec.whatwg.org/ [node-fetch]: https://www.npmjs.com/package/node-fetch [include]: http://updates.html5rocks.com/2015/03/introduction-to-fetch#sending-credentials-with-a-fetch-request -Internally the plugin uses a cookie jar. You can insert your own (details below) but [tough-cookie] is preferred. +Internally the plugin uses a cookie jar. You can insert your own +(details below) but [tough-cookie] is preferred. [tough-cookie]: https://www.npmjs.com/package/tough-cookie ## Usage -### Basic +With Node.js 18.3.0 and greater, using the native global `fetch` +function: ```js -const nodeFetch = require('node-fetch') -const fetch = require('fetch-cookie')(nodeFetch) -``` +import makeFetchCookie from 'fetch-cookie' -### Custom cookie jar +const fetchCookie = makeFetchCookie(fetch) +``` -If you want to customize the internal cookie jar instance (for example, with a custom store), you can inject it as a second argument: +Or with node-fetch: ```js -const nodeFetch = require('node-fetch') -const tough = require('tough-cookie') -const fetch = require('fetch-cookie')(nodeFetch, new tough.CookieJar()) -``` +import nodeFetch from 'node-fetch' +import fetchCookie from 'fetch-cookie' -This enables you to create multiple `fetch-cookie` instances that use different cookie jars, -esentially two different HTTP clients with different login sessions on you backend (for example). +const fetch = fetchCookie(nodeFetch) +``` -All calls to `fetch` will store and send back cookies according to the URL. +### Custom cookie jar -> Note: All errors when setting cookies are ignored by default. You can make it to throw errors in cookies by passing a third argument (default is true). +If you want to customize the internal cookie jar instance (for example, +with a custom store), you can inject it as a second argument: ```js -const nodeFetch = require('node-fetch') -const tough = require('tough-cookie') -const fetch = require('fetch-cookie')(nodeFetch, new tough.CookieJar(), false) // default value is true -// false - doesn't ignore errors, throws when an error occurs in setting cookies and breaks the request and execution -// true - silently ignores errors and continues to make requests/redirections +import makeFetchCookie from 'fetch-cookie' + +const fetchCookie = makeFetchCookie(fetch, new makeFetchCookie.toughCookie.CookieJar()) ``` -If you use a cookie jar that is not tough-cookie, keep in mind that it must implement this interface to be compatible: +Here, we expose the tough-cookie version that we depend on internally so +you can just reuse it and don't end up accidentally bundling two +different versions. That being said you can use any version of +tough-cookie here, or even any compatible cookie jar. + +This enables you to create multiple fetch-cookie instances that use +different cookie jars, essentially two different HTTP clients with +different login sessions on you backend (for example). + +All calls to `fetch` will store and send back cookies according to the +URL. + +If you use a cookie jar that is not tough-cookie, keep in mind that it +must implement this interface to be compatible: ```ts interface CookieJar { - getCookieString(currentUrl: string, cb: (err: any, cookies: string) => void): void; - setCookie(cookieString: string, currentUrl: string, cb: (err: any) => void, opts: { ignoreError:boolean }): void; + getCookieString(currentUrl: string): Promise + setCookie(cookieString: string, currentUrl: string, opts: { ignoreError: boolean }): Promise } ``` -### Cookies on redirects +### Custom cookie jar with options + +If you don't want a custom store and just want to pass [tough-cookie +options](https://github.com/salesforce/tough-cookie#cookiejarstore-options), +e.g. to allow cookies on `localhost`: + +```js +import makeFetchCookie from 'fetch-cookie' + +const fetchCookie = makeFetchCookie(fetch, new makeFetchCookie.toughCookie.CookieJar(undefined, { + allowSpecialUseDomain: true +})) +``` + +Or with a custom store as well: + +```js +import makeFetchCookie from 'fetch-cookie' +import FileCookieStore from 'file-cookie-store' + +const store = new FileCookieStore('cookies.txt') + +const fetchCookie = makeFetchCookie(fetch, new makeFetchCookie.toughCookie.CookieJar(store, { + allowSpecialUseDomain: true +})) +``` + +### Ignoring errors + +All errors when setting cookies are ignored by default. You can make it +throw errors in cookies by passing a third argument `ignoreError` (defaulting to `true`). + +```js +import makeFetchCookie from 'fetch-cookie' + +const fetchCookie = makeFetchCookie(fetch, new makeFetchCookie.toughCookie.CookieJar(), false) +``` + +When set to `false`, fetch-cookie will throw when an error occurs in +setting cookies and breaks the request and execution. + +Otherwise, it silently ignores errors and continues to make +requests/redirections. + +### Max redirects + +Because we need to do our own [redirect implementation](#cookies-on-redirects), +the way to configure the max redirects is not going to be that of your +chosen `fetch` implementation, but custom to fetch-cookie. + +We read a `maxRedirect` parameter for that. The default is 20. + +```js +import makeFetchCookie from 'fetch-cookie' + +const fetchCookie = makeFetchCookie(fetch) + +await fetchCookie(url, { maxRedirect: 10 }) +``` + +## Cookies on redirects + +In order to handle cookies on redirects, we force the `redirect` +parameter to `manual`, and handle the redirections internally (according +to the original `redirect` value) instead of leaving it to the upstream +`fetch` implementation. + +This allows us to hook into the redirect logic in order to store and +forward cookies accordingly. -**Details:** By default, cookies are not set correctly in the edge case where a response -sets cookies and redirects to another URL. A real-life example of this behaviour -is a login page setting a session cookie and redirecting. +This is useful for example when a login page sets a session cookie and +redirects to another page. -The reason for this limitation is that the generic fetch API does not allow any way to -hook into redirects. However, the [node-fetch] library does expose its own API which -we can use. +## Migrating from v1 -**TLDR:** Ff cookies during indirection turns out to be a requirement for you, -and if you are using [node-fetch], then you can use the custom node-fetch decorator -provided with this library: +The only breaking change with v2 is that the node-fetch wrapper (that +was handling redirects only with node-fetch nonstandard APIs) was +dropped and the redirects are now always handled by the main export. ```js -const nodeFetch = require('node-fetch') -const fetch = require('fetch-cookie/node-fetch')(nodeFetch) +// If you were doing +const fetchCookie = require('fetch-cookie/node-fetch') + +// Change it to +const fetchCookie = require('fetch-cookie') + +// Or +import fetchCookie from 'fetch-cookie' +``` + +This also means that if you were *not* using the node-fetch wrapper and +were happy about cookies *not* being included in redirects, cookies are +now going to be stored and sent in redirects as well like they would in +the browser. + +## Development + +```sh +# Install dependencies +npm ci + +# Allows to test node-fetch v2 as well as node-fetch v3 +npm --prefix test/node_modules/node-fetch-2 ci + +# Allows to test against Undici by removing the blacklisting of `Set-Cookie` headers +npm run patch-undici + +npm run lint +npm run type-check + +# Generates code in `esm` and `cjs` directories +npm run build + +# Run tests (depends on the built code) +npm test + +# Generate type declarations in the `types` directory +npm run type-declarations ``` +## Credits + +* 🥰 All the [contributors](https://github.com/valeriangalliat/fetch-cookie/graphs/contributors) + to fetch-cookie! +* 😍 [node-fetch](https://github.com/node-fetch/node-fetch) for the + redirect logic that we carefully mimic (sadly reimplementing this code + was the only way to support cookies in redirects). + find-root 1.1.0 MIT @@ -41694,7 +41783,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -follow-redirects 1.15.1 +follow-redirects 1.15.3 MIT Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh @@ -41763,7 +41852,7 @@ THE SOFTWARE. -goober 2.1.12 +goober 2.1.13 MIT MIT License @@ -42091,39 +42180,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -hyphenate-style-name 1.0.4 -BSD-3-Clause -Copyright (c) 2015, Espen Hovlandsdal -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 hyphenate-style-name 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. - - - -i18next-browser-languagedetector 7.1.0 +i18next-browser-languagedetector 7.2.0 MIT The MIT License (MIT) @@ -42149,7 +42206,7 @@ SOFTWARE. -i18next-http-backend 2.2.2 +i18next-http-backend 2.4.1 MIT Copyright (c) 2023 i18next @@ -42172,7 +42229,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -i18next 23.4.6 +i18next 23.7.6 MIT The MIT License (MIT) @@ -42222,7 +42279,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -immutable 4.3.0 +immutable 4.3.4 MIT MIT License @@ -42353,29 +42410,6 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -is-in-browser 1.1.3 -MIT -# Is In Browser? - -``` -import isBrowser from 'is-in-browser'; - -if(isBrowser) { - //... -} -``` - -## CommonJS - -For those not using Babel / ES6 Modules - -``` -var isBrowser = require('is-in-browser').default; - -if(isBrowser) { //... } -``` - - js-base64 3.7.5 BSD-3-Clause Copyright (c) 2014, Dan Kogai @@ -42486,102 +42520,6 @@ This library is a fork of 'better-json-errors' by Kat Marchán, extended and distributed under the terms of the MIT license above. -jss-plugin-camel-case 10.10.0 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Isonen (Slobodskoi) & contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -jss-plugin-default-unit 10.10.0 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Isonen (Slobodskoi) & contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -jss-plugin-global 10.10.0 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Isonen (Slobodskoi) & contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -jss-plugin-nested 10.10.0 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Isonen (Slobodskoi) & contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -jss-plugin-props-sort 10.10.0 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Isonen (Slobodskoi) & contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -jss-plugin-rule-value-function 10.10.0 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Isonen (Slobodskoi) & contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -jss-plugin-vendor-prefixer 10.10.0 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Isonen (Slobodskoi) & contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -jss 10.10.0 -MIT -The MIT License (MIT) -Copyright (c) 2014-present Oleg Isonen (Slobodskoi) & contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - lines-and-columns 1.2.4 MIT The MIT License (MIT) @@ -42817,7 +42755,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -minimist 1.2.6 +minimist 1.2.8 MIT This software is released under the MIT license: @@ -42839,7 +42777,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -motion 10.16.2 +motion 10.16.4 MIT MIT License @@ -42939,7 +42877,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -nanoid 3.3.6 +nanoid 3.3.7 MIT The MIT License (MIT) @@ -42986,7 +42924,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -node-fetch 2.6.13 +node-fetch 2.7.0 MIT The MIT License (MIT) @@ -43245,7 +43183,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -punycode 2.3.0 +punycode 2.3.1 MIT Copyright Mathias Bynens @@ -43348,7 +43286,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -react-dom 17.0.2 +react-dom 18.2.0 MIT MIT License @@ -43373,33 +43311,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -react-double-scrollbar 0.0.15 -MIT -The MIT License (MIT) - -Copyright (c) 2016 Scott McDaniel - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - - -react-i18next 13.3.1 +react-i18next 13.4.1 MIT The MIT License (MIT) @@ -43597,7 +43509,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -react-router-dom 6.16.0 +react-router-dom 6.18.0 MIT MIT License @@ -43624,7 +43536,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -react-router 6.16.0 +react-router 6.18.0 MIT MIT License @@ -43710,7 +43622,7 @@ 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. -react 17.0.2 +react 18.2.0 MIT MIT License @@ -43973,32 +43885,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -safe-buffer 5.1.2 -MIT -The MIT License (MIT) - -Copyright (c) Feross Aboukhadijeh - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -scheduler 0.20.2 +scheduler 0.23.0 MIT MIT License @@ -44042,6 +43929,31 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +set-cookie-parser 2.6.0 +MIT +The MIT License (MIT) + +Copyright (c) 2015 Nathan Friedly (http://nfriedly.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + source-map 0.5.7 BSD-3-Clause @@ -44177,31 +44089,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -tiny-invariant 1.2.0 -MIT -MIT License - -Copyright (c) 2019 Alexander Reardon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -tiny-warning 1.0.3 +tiny-invariant 1.3.1 MIT MIT License @@ -44284,7 +44172,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -tslib 2.5.0 +tslib 2.6.2 0BSD Copyright (c) Microsoft Corporation. @@ -44661,7 +44549,7 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -zustand 4.3.2 +zustand 4.4.6 MIT MIT License diff --git a/package-lock.json b/package-lock.json index 98400a71a6..248e82f835 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,12 +12,11 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@loadable/component": "^5.15.3", - "@material-table/core": "^6.2.11", + "@material-table/core": "^6.3.0", "@matt-block/react-recaptcha-v2": "^2.0.1", - "@microsoft/signalr": "^6.0.7", + "@microsoft/signalr": "^8.0.0", "@mui/icons-material": "^5.14.11", "@mui/material": "^5.14.16", - "@mui/styles": "^5.14.16", "@redux-devtools/extension": "^3.2.5", "@reduxjs/toolkit": "^1.9.5", "@segment/analytics-next": "^1.55.0", @@ -38,10 +37,10 @@ "notistack": "^3.0.1", "nspell": "^2.1.5", "punycode": "^2.3.0", - "react": "^17.0.2", + "react": "^18.2.0", "react-beautiful-dnd": "^13.1.1", "react-chartjs-2": "^5.2.0", - "react-dom": "^17.0.2", + "react-dom": "^18.2.0", "react-i18next": "^13.3.1", "react-modal": "^3.16.1", "react-redux": "^8.1.3", @@ -56,9 +55,9 @@ "validator": "^13.11.0" }, "devDependencies": { + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@testing-library/jest-dom": "^6.1.4", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "^8.0.0", + "@testing-library/react": "^14.1.0", "@testing-library/user-event": "^14.5.1", "@types/crypto-js": "^4.1.3", "@types/css-mediaquery": "^0.1.2", @@ -66,14 +65,14 @@ "@types/loadable__component": "^5.13.5", "@types/node": "^20.5.1", "@types/nspell": "^2.1.5", - "@types/react": "^17.0.34", + "@types/react": "^18.2.37", "@types/react-beautiful-dnd": "^13.1.4", - "@types/react-dom": "^17.0.11", + "@types/react-dom": "^18.2.15", "@types/react-modal": "^3.16.0", - "@types/react-test-renderer": "^17.0.0", + "@types/react-test-renderer": "^18.0.6", "@types/recordrtc": "^5.6.12", "@types/redux-mock-store": "^1.0.4", - "@types/segment-analytics": "^0.0.34", + "@types/segment-analytics": "^0.0.37", "@types/uuid": "^9.0.4", "@types/validator": "^13.11.1", "@typescript-eslint/eslint-plugin": "^6.7.2", @@ -92,10 +91,10 @@ "npm-run-all": "^4.1.5", "prettier": "^3.0.3", "react-scripts": "^5.0.1", - "react-test-renderer": "^17.0.1", + "react-test-renderer": "^18.2.0", "redux-mock-store": "^1.5.4", "source-map-explorer": "^2.5.3", - "typescript": "4.9.5" + "typescript": "^4.9.5" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -113,27 +112,26 @@ "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", "dev": true }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -216,35 +214,35 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "convert-source-map": "^1.7.0", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -254,6 +252,12 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -287,20 +291,20 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", - "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": ">=7.11.0", + "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, @@ -323,12 +327,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -338,46 +342,43 @@ } }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "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==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -390,19 +391,20 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", - "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { - "@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.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -411,14 +413,24 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "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" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -427,21 +439,29 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "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" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { - "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==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { @@ -467,15 +487,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "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" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -485,18 +496,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-explode-assignable-expression": { - "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==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", @@ -523,78 +522,77 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", - "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "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==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "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==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { - "@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-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -604,41 +602,41 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -673,38 +671,37 @@ } }, "node_modules/@babel/helper-validator-option": { - "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==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", - "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -788,9 +785,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -800,12 +797,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "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==", + "version": "7.23.3", + "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.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -815,14 +812,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { - "@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/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -831,28 +828,27 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "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==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -865,98 +861,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "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==", - "dev": true, - "dependencies": { - "@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": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.13.tgz", - "integrity": "sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.20.12", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "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==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "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==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.3.tgz", + "integrity": "sha512-u8SwzOcP0DYSsa++nHd/9exlHb0NAlHCb890qtZZbSwPX2bFv8LBEztxwN7Xg/dS8oAFFidhrI9PBcLBJSkGRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "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==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -969,6 +884,7 @@ "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==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -985,6 +901,7 @@ "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==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -997,49 +914,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "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==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "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==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1053,6 +936,7 @@ "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==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1066,14 +950,15 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "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==", + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "dev": true, "dependencies": { "@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/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1083,22 +968,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "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==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "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", @@ -1151,12 +1020,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", - "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1190,12 +1059,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1205,12 +1074,27 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1244,12 +1128,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1361,12 +1245,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1375,30 +1259,64 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "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==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "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==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", + "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1408,12 +1326,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1423,12 +1341,28 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1437,19 +1371,37 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", + "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.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-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1469,12 +1421,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1484,12 +1437,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1499,13 +1452,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1515,12 +1468,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "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==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1529,14 +1482,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "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==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", + "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1545,14 +1498,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", - "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-flow": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1561,13 +1514,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "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==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", + "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1576,15 +1530,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "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==", + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1593,13 +1546,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1608,13 +1561,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "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==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1623,15 +1578,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", + "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1640,16 +1594,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1658,17 +1609,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", + "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1677,14 +1625,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "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==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1693,29 +1640,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "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==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1724,14 +1673,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "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==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1740,13 +1691,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "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==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1755,28 +1707,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "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==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.9.tgz", - "integrity": "sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1785,13 +1738,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "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==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", + "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1800,17 +1754,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", - "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", + "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1819,13 +1770,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "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==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", + "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1834,14 +1789,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "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==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1850,14 +1805,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", + "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1866,13 +1821,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "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==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", + "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1881,18 +1838,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "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==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { - "@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" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1901,47 +1853,47 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { - "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==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-regenerator": { - "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==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", + "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.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-transform-runtime/node_modules/semver": { - "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" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "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==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1950,14 +1902,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", + "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1966,13 +1917,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "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==", + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1981,13 +1932,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "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==", + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1996,13 +1951,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "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==", + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2011,15 +1966,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz", - "integrity": "sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==", + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.20.12", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2028,13 +1982,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -2043,14 +1998,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "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==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2059,87 +2013,18 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", - "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@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.18.6", - "@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.18.9", - "@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.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", - "@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.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.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@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.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@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.18.9", - "@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.6", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.3.tgz", + "integrity": "sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2148,7 +2033,7 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -2157,34 +2042,29 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/preset-modules": { - "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==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "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" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { - "@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/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2193,15 +2073,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2210,50 +2088,330 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dev": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz", + "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@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.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@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-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "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" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2294,9 +2452,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -2313,18 +2471,18 @@ "dev": true }, "node_modules/@cspell/cspell-pipe": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.0.tgz", - "integrity": "sha512-MmQeLyyS5rZ/VvRtHGOLFUcCF9zy01WpWYthLZB61o96HCokqtlN4BBBPLYNxrotFNA4syVy9Si/wTxsC9oTiA==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.9.tgz", + "integrity": "sha512-gKYTHcryKOaTmr6t+M5h1sZnQ42eHeumBJejovphipXfdivedUnuYyQrrQGFAlUKzfEOWcOPME1nm17xsaX5Ww==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.0.tgz", - "integrity": "sha512-b/Dee5lb362ODlEK+kQcUDJfCprDRUFWcddo5tyzsYm3ID08ll6+DzCtfRxf48isyX1tL7uBKMj/iIpAhRNu9Q==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.9.tgz", + "integrity": "sha512-p7s8yEV6ASz0HjiArH11yjNj3vXzK2Ep94GrpdtYJxSxFC2w1mXAVUaJB/5+jC4+1YeYsmcBFTXmZ1rGMyTv3g==", "dev": true, "engines": { "node": ">=16" @@ -2601,9 +2759,9 @@ } }, "node_modules/@csstools/selector-specificity": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", - "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "dev": true, "engines": { "node": "^14 || ^16 || >=18" @@ -2613,21 +2771,20 @@ "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4", "postcss-selector-parser": "^6.0.10" } }, "node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==" + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.17.0.tgz", + "integrity": "sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw==" }, "node_modules/@date-io/date-fns": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz", - "integrity": "sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.17.0.tgz", + "integrity": "sha512-L0hWZ/mTpy3Gx/xXJ5tq5CzHo0L7ry6KEO9/w/JWiFWFLZgiNVo3ex92gOl3zmzjHqY/3Ev+5sehAr8UnGLEng==", "dependencies": { - "@date-io/core": "^2.16.0" + "@date-io/core": "^2.17.0" }, "peerDependencies": { "date-fns": "^2.0.0" @@ -2639,11 +2796,11 @@ } }, "node_modules/@date-io/dayjs": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz", - "integrity": "sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.17.0.tgz", + "integrity": "sha512-Iq1wjY5XzBh0lheFA0it6Dsyv94e8mTiNR8vuTai+KopxDkreL3YjwTmZHxkgB7/vd0RMIACStzVgWvPATnDCA==", "dependencies": { - "@date-io/core": "^2.16.0" + "@date-io/core": "^2.17.0" }, "peerDependencies": { "dayjs": "^1.8.17" @@ -2655,11 +2812,11 @@ } }, "node_modules/@date-io/luxon": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz", - "integrity": "sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.17.0.tgz", + "integrity": "sha512-l712Vdm/uTddD2XWt9TlQloZUiTiRQtY5TCOG45MQ/8u0tu8M17BD6QYHar/3OrnkGybALAMPzCy1r5D7+0HBg==", "dependencies": { - "@date-io/core": "^2.16.0" + "@date-io/core": "^2.17.0" }, "peerDependencies": { "luxon": "^1.21.3 || ^2.x || ^3.x" @@ -2671,11 +2828,11 @@ } }, "node_modules/@date-io/moment": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz", - "integrity": "sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.17.0.tgz", + "integrity": "sha512-e4nb4CDZU4k0WRVhz1Wvl7d+hFsedObSauDHKtZwU9kt7gdYEAzKgnrSCTHsEaXrDumdrkCYTeZ0Tmyk7uV4tw==", "dependencies": { - "@date-io/core": "^2.16.0" + "@date-io/core": "^2.17.0" }, "peerDependencies": { "moment": "^2.24.0" @@ -2717,14 +2874,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/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/@emotion/cache": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", @@ -2861,18 +3010,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2892,12 +3041,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/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==", - "dev": true - }, "node_modules/@eslint/eslintrc/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2915,18 +3058,6 @@ } } }, - "node_modules/@eslint/eslintrc/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==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2934,9 +3065,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2960,9 +3091,9 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", - "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", "dependencies": { "@floating-ui/dom": "^1.5.1" }, @@ -2977,16 +3108,16 @@ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@hello-pangea/dnd": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.2.0.tgz", - "integrity": "sha512-inACvMcvvLr34CG0P6+G/3bprVKhwswxjcsFUSJ+fpOGjhvDj9caiA9X3clby0lgJ6/ILIJjyedHZYECB7GAgA==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.3.0.tgz", + "integrity": "sha512-RYQ/K8shtJoyNPvFWz0gfXIK7HF3P3mL9UZFGMuHB0ljRSXVgMjVFI/FxcZmakMzw6tO7NflWLriwTNBow/4vw==", "dependencies": { - "@babel/runtime": "^7.19.4", + "@babel/runtime": "^7.22.5", "css-box-model": "^1.2.1", "memoize-one": "^6.0.0", "raf-schd": "^4.0.3", - "react-redux": "^8.0.4", - "redux": "^4.2.0", + "react-redux": "^8.1.1", + "redux": "^4.2.1", "use-memo-one": "^1.1.3" }, "peerDependencies": { @@ -2995,12 +3126,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -3045,9 +3176,9 @@ } }, "node_modules/@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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -3156,6 +3287,15 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3178,6 +3318,19 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3217,24 +3370,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -3254,9 +3389,9 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "optional": true, "peer": true, @@ -3264,116 +3399,67 @@ "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/console/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "node_modules/@jest/core/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "optional": true, "peer": true, @@ -3386,9 +3472,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3398,36 +3484,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/@jest/core/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -3451,9 +3507,9 @@ "peer": true }, "node_modules/@jest/core/node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "optional": true, "peer": true, @@ -3465,8 +3521,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3489,19 +3545,19 @@ } }, "node_modules/@jest/core/node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "optional": true, "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3510,29 +3566,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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/core/node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "optional": true, "peer": true, @@ -3542,22 +3579,22 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "optional": true, "peer": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -3566,9 +3603,9 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -3633,71 +3670,41 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "optional": true, "peer": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -3707,9 +3714,9 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "optional": true, "peer": true, @@ -3717,122 +3724,43 @@ "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/fake-timers/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "optional": true, "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -3846,9 +3774,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -3867,9 +3795,9 @@ } }, "node_modules/@jest/reporters/node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "optional": true, "peer": true, @@ -3882,9 +3810,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3894,36 +3822,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/@jest/reporters/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@jest/reporters/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3933,9 +3831,9 @@ "peer": true }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", "dev": true, "optional": true, "peer": true, @@ -3951,9 +3849,9 @@ } }, "node_modules/@jest/reporters/node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "optional": true, "peer": true, @@ -3965,8 +3863,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3988,35 +3886,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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/reporters/node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "optional": true, "peer": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4085,14 +3964,14 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -4101,100 +3980,40 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-result/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/test-result": "^29.6.4", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/@jest/test-sequencer/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4216,35 +4035,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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/test-sequencer/node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "optional": true, "peer": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4295,7 +4095,7 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/types": { + "node_modules/@jest/transform/node_modules/@jest/types": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", @@ -4311,10 +4111,62 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@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.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -4326,9 +4178,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -4344,9 +4196,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -4354,15 +4206,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4420,9 +4272,9 @@ } }, "node_modules/@material-table/core": { - "version": "6.2.11", - "resolved": "https://registry.npmjs.org/@material-table/core/-/core-6.2.11.tgz", - "integrity": "sha512-ErvpDT/tucUsGwb+vUsHIlHX/ec+aIxwPSSkgz5Ie4SqEKurOpE5R8vCXTFWJ+kV3fgnRtg9jFXfI6dL67N99g==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@material-table/core/-/core-6.3.0.tgz", + "integrity": "sha512-8j21QC07rj1syuVkpZGScc5uKya7yVs7+NA8ZRawqSPk8S/r+tK+L3IF4pRq8B2SKlNXqx5KqNII+5+FelqnzQ==", "dependencies": { "@babel/runtime": "^7.19.0", "@date-io/core": "^2.16.0", @@ -4440,37 +4292,13 @@ "deep-eql": "^4.1.1", "deepmerge": "^4.2.2", "prop-types": "^15.8.1", - "react-double-scrollbar": "0.0.15", "uuid": "^9.0.0", "zustand": "^4.3.0" }, "peerDependencies": { "@mui/system": ">=5.10.7", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@material-table/core/node_modules/zustand": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.2.tgz", - "integrity": "sha512-rd4haDmlwMTVWVqwvgy00ny8rtti/klRoZjFbL/MAcDnmD5qSw/RZc+Vddstdv90M5Lv6RPgWvm1Hivyn0QgJw==", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "immer": ">=9.0", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "immer": { - "optional": true - }, - "react": { - "optional": true - } + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, "node_modules/@matt-block/react-recaptcha-v2": { @@ -4485,102 +4313,102 @@ } }, "node_modules/@microsoft/signalr": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-6.0.7.tgz", - "integrity": "sha512-CoIz8K0IpaCGbI4rr2W8RHYA8Yq0KqY8DNsJzHw3UEWTJ3KqhWqeVCE8R24czzcsoUrE28xltEQ6qNTXZDHf3g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-8.0.0.tgz", + "integrity": "sha512-K/wS/VmzRWePCGqGh8MU8OWbS1Zvu7DG7LSJS62fBB8rJUXwwj4axQtqrAAwKGUZHQF6CuteuQR9xMsVpM2JNA==", "dependencies": { "abort-controller": "^3.0.0", - "eventsource": "^1.0.7", - "fetch-cookie": "^0.11.0", + "eventsource": "^2.0.2", + "fetch-cookie": "^2.0.3", "node-fetch": "^2.6.7", "ws": "^7.4.5" } }, "node_modules/@motionone/animation": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", - "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "version": "10.16.3", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.16.3.tgz", + "integrity": "sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==", "dependencies": { - "@motionone/easing": "^10.15.1", - "@motionone/types": "^10.15.1", - "@motionone/utils": "^10.15.1", + "@motionone/easing": "^10.16.3", + "@motionone/types": "^10.16.3", + "@motionone/utils": "^10.16.3", "tslib": "^2.3.1" } }, "node_modules/@motionone/dom": { - "version": "10.16.2", - "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz", - "integrity": "sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==", - "dependencies": { - "@motionone/animation": "^10.15.1", - "@motionone/generators": "^10.15.1", - "@motionone/types": "^10.15.1", - "@motionone/utils": "^10.15.1", + "version": "10.16.4", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.4.tgz", + "integrity": "sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==", + "dependencies": { + "@motionone/animation": "^10.16.3", + "@motionone/generators": "^10.16.4", + "@motionone/types": "^10.16.3", + "@motionone/utils": "^10.16.3", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "node_modules/@motionone/easing": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", - "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "version": "10.16.3", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.16.3.tgz", + "integrity": "sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==", "dependencies": { - "@motionone/utils": "^10.15.1", + "@motionone/utils": "^10.16.3", "tslib": "^2.3.1" } }, "node_modules/@motionone/generators": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", - "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "version": "10.16.4", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.16.4.tgz", + "integrity": "sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==", "dependencies": { - "@motionone/types": "^10.15.1", - "@motionone/utils": "^10.15.1", + "@motionone/types": "^10.16.3", + "@motionone/utils": "^10.16.3", "tslib": "^2.3.1" } }, "node_modules/@motionone/svelte": { - "version": "10.16.2", - "resolved": "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.2.tgz", - "integrity": "sha512-38xsroKrfK+aHYhuQlE6eFcGy0EwrB43Q7RGjF73j/kRUTcLNu/LAaKiLLsN5lyqVzCgTBVt4TMT/ShWbTbc5Q==", + "version": "10.16.4", + "resolved": "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.4.tgz", + "integrity": "sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==", "dependencies": { - "@motionone/dom": "^10.16.2", + "@motionone/dom": "^10.16.4", "tslib": "^2.3.1" } }, "node_modules/@motionone/types": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", - "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + "version": "10.16.3", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.16.3.tgz", + "integrity": "sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==" }, "node_modules/@motionone/utils": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", - "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "version": "10.16.3", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.16.3.tgz", + "integrity": "sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==", "dependencies": { - "@motionone/types": "^10.15.1", + "@motionone/types": "^10.16.3", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "node_modules/@motionone/vue": { - "version": "10.16.2", - "resolved": "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.2.tgz", - "integrity": "sha512-7/dEK/nWQXOkJ70bqb2KyNfSWbNvWqKKq1C8juj+0Mg/AorgD8O5wE3naddK0G+aXuNMqRuc4jlsYHHWHtIzVw==", + "version": "10.16.4", + "resolved": "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.4.tgz", + "integrity": "sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==", "dependencies": { - "@motionone/dom": "^10.16.2", + "@motionone/dom": "^10.16.4", "tslib": "^2.3.1" } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.22.tgz", - "integrity": "sha512-l4asGID5tmyerx9emJfXOKLyXzaBtdXNIFE3M+IrSZaFtGFvaQKHhc3+nxxSxPf1+G44psjczM0ekRQCdXx9HA==", + "version": "5.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.24.tgz", + "integrity": "sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==", "dependencies": { "@babel/runtime": "^7.23.2", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.8", - "@mui/utils": "^5.14.16", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -4603,29 +4431,21 @@ } } }, - "node_modules/@mui/base/node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.16.tgz", - "integrity": "sha512-97isBjzH2v1K7oB4UH2f4NOkBShOynY6dhnoR2XlUk/g6bb7ZBv2I3D1hvvqPtpEigKu93e7f/jAYr5d9LOc5w==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz", + "integrity": "sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.11.tgz", - "integrity": "sha512-aHReLasBuS/+hhPzbZCgZ0eTcZ2QRnoC2WNK7XvdAf3l+LjC1flzjh6GWw1tZJ5NHnZ+bivdwtLFQ8XTR96JkA==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.18.tgz", + "integrity": "sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==", "dependencies": { - "@babel/runtime": "^7.22.15" + "@babel/runtime": "^7.23.2" }, "engines": { "node": ">=12.0.0" @@ -4646,16 +4466,16 @@ } }, "node_modules/@mui/material": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.16.tgz", - "integrity": "sha512-W4zZ4vnxgGk6/HqBwgsDHKU7x2l2NhX+r8gAwfg58Rhu3ikfY7NkIS6y8Gl3NkATc4GG1FNaGjjpQKfJx3U6Jw==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.18.tgz", + "integrity": "sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==", "dependencies": { "@babel/runtime": "^7.23.2", - "@mui/base": "5.0.0-beta.22", - "@mui/core-downloads-tracker": "^5.14.16", - "@mui/system": "^5.14.16", - "@mui/types": "^7.2.8", - "@mui/utils": "^5.14.16", + "@mui/base": "5.0.0-beta.24", + "@mui/core-downloads-tracker": "^5.14.18", + "@mui/system": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", "@types/react-transition-group": "^4.4.8", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -4689,26 +4509,18 @@ } } }, - "node_modules/@mui/material/node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/@mui/material/node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/private-theming": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.16.tgz", - "integrity": "sha512-FNlL0pTSEBh8nXsVWreCHDSHk+jG8cBx1sxRbT8JVtL+PYbYPi802zfV4B00Kkf0LNRVRvAVQwojMWSR/MYGng==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.18.tgz", + "integrity": "sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==", "dependencies": { "@babel/runtime": "^7.23.2", - "@mui/utils": "^5.14.16", + "@mui/utils": "^5.14.18", "prop-types": "^15.8.1" }, "engines": { @@ -4729,9 +4541,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.16.tgz", - "integrity": "sha512-FfvYvTG/Zd+KXMMImbcMYEeQAbONGuX5Vx3gBmmtB6KyA7Mvm9Pma1ly3R0gc44yeoFd+2wBjn1feS8h42HW5w==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.18.tgz", + "integrity": "sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==", "dependencies": { "@babel/runtime": "^7.23.2", "@emotion/cache": "^11.11.0", @@ -4759,64 +4571,16 @@ } } }, - "node_modules/@mui/styles": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.14.16.tgz", - "integrity": "sha512-pBA2eLBEfqLv/jmu9qGcErwml27upH2YBFRuRU2loZm5R57di5y/GjpM9EWc77+49axaTlHfO8LWbic4kPvxoQ==", - "dependencies": { - "@babel/runtime": "^7.23.2", - "@emotion/hash": "^0.9.1", - "@mui/private-theming": "^5.14.16", - "@mui/types": "^7.2.8", - "@mui/utils": "^5.14.16", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.10.0", - "jss-plugin-camel-case": "^10.10.0", - "jss-plugin-default-unit": "^10.10.0", - "jss-plugin-global": "^10.10.0", - "jss-plugin-nested": "^10.10.0", - "jss-plugin-props-sort": "^10.10.0", - "jss-plugin-rule-value-function": "^10.10.0", - "jss-plugin-vendor-prefixer": "^10.10.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styles/node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/@mui/system": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.16.tgz", - "integrity": "sha512-uKnPfsDqDs8bbN54TviAuoGWOmFiQLwNZ3Wvj+OBkJCzwA6QnLb/sSeCB7Pk3ilH4h4jQ0BHtbR+Xpjy9wlOuA==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz", + "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==", "dependencies": { "@babel/runtime": "^7.23.2", - "@mui/private-theming": "^5.14.16", - "@mui/styled-engine": "^5.14.16", - "@mui/types": "^7.2.8", - "@mui/utils": "^5.14.16", + "@mui/private-theming": "^5.14.18", + "@mui/styled-engine": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -4846,18 +4610,10 @@ } } }, - "node_modules/@mui/system/node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/@mui/types": { - "version": "7.2.8", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz", - "integrity": "sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ==", + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.9.tgz", + "integrity": "sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -4868,12 +4624,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.16.tgz", - "integrity": "sha512-3xV31GposHkwRbQzwJJuooWpK2ybWdEdeUPtRjv/6vjomyi97F3+68l+QVj9tPTvmfSbr2sx5c/NuvDulrdRmA==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.18.tgz", + "integrity": "sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==", "dependencies": { "@babel/runtime": "^7.23.2", - "@types/prop-types": "^15.7.9", + "@types/prop-types": "^15.7.10", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -4900,9 +4656,9 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/x-date-pickers": { - "version": "5.0.17", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.17.tgz", - "integrity": "sha512-Rxm2OqSLGXijdwCpt8dzbuDIWNids7bUsuxB/ci66MB4ULfTswhFXZTcVvEm/SKZvtkUmDPQmMemdNg78440iA==", + "version": "5.0.20", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz", + "integrity": "sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==", "dependencies": { "@babel/runtime": "^7.18.9", "@date-io/core": "^2.15.0", @@ -4957,6 +4713,14 @@ } } }, + "node_modules/@mui/x-date-pickers/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -4966,6 +4730,28 @@ "eslint-scope": "5.1.1" } }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5024,9 +4810,9 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", - "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", + "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", "dev": true, "dependencies": { "ansi-html-community": "^0.0.8", @@ -5046,7 +4832,7 @@ "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <4.0.0", + "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", "webpack-dev-server": "3.x || 4.x", "webpack-hot-middleware": "2.x", @@ -5092,21 +4878,21 @@ } }, "node_modules/@redux-devtools/extension": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.2.5.tgz", - "integrity": "sha512-UhyDF7WmdnCrN1s++YC4sdQCo0z6YUnoB2eCh15nXDDq3QH1jDju1144UNRU6Nvi4inxhaIum4m9BXVYWVC1ng==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.2.6.tgz", + "integrity": "sha512-fWrqYAoFFKc5+78P/xWj+3NcoiJ07ak5qdiPTbO5CAuM5vE3dKk5fajpJyuOab+hLNEUJMTklCBYm+WTFcWWxA==", "dependencies": { - "@babel/runtime": "^7.20.7", - "immutable": "^4.2.2" + "@babel/runtime": "^7.23.2", + "immutable": "^4.3.4" }, "peerDependencies": { "redux": "^3.1.0 || ^4.0.0" } }, "node_modules/@reduxjs/toolkit": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", - "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", "dependencies": { "immer": "^9.0.21", "redux": "^4.2.1", @@ -5127,9 +4913,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", - "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", + "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", "engines": { "node": ">=14.0.0" } @@ -5214,15 +5000,15 @@ "dev": true }, "node_modules/@rushstack/eslint-patch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", - "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", + "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==", "dev": true }, "node_modules/@segment/analytics-core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@segment/analytics-core/-/analytics-core-1.3.1.tgz", - "integrity": "sha512-KGblJ8WQNC4t0j31zeyYBm2thHWuPULNAoP7waU5ts7Asz9ipvGoHqFSLG6warqvcnBdkiRbNam242zmxX53oA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@segment/analytics-core/-/analytics-core-1.3.2.tgz", + "integrity": "sha512-NpeBCfOyMdO2/BDKfhCUNHcEwxg88N2iTnswBoEMh38rtsQ03TWLVYwgiTakPjNQFezdKkR6jq3JhQ3WWgq67g==", "dependencies": { "@lukeed/uuid": "^2.0.0", "dset": "^3.1.2", @@ -5230,12 +5016,12 @@ } }, "node_modules/@segment/analytics-next": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@segment/analytics-next/-/analytics-next-1.55.0.tgz", - "integrity": "sha512-Ae6LpLW2U/rDwCAGrw7XHMjulk8becxEE0Nu45f0sE7b/+iy/c6NuxomzdhL5Vnp2WETDtv62M2pQtrfQ+XX7w==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@segment/analytics-next/-/analytics-next-1.60.0.tgz", + "integrity": "sha512-ujYs5kbDBsRqX7KrkrLZ8hizXKZfng2vrUEUoStGekUkAwDYYV9ZaKm7WEXZbIzzBh9R/C0l7ihK3DGN7PA2UQ==", "dependencies": { "@lukeed/uuid": "^2.0.0", - "@segment/analytics-core": "1.3.1", + "@segment/analytics-core": "1.3.2", "@segment/analytics.js-video-plugins": "^0.2.1", "@segment/facade": "^3.4.9", "@segment/tsub": "^2.0.0", @@ -5261,9 +5047,9 @@ "integrity": "sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==" }, "node_modules/@segment/facade": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@segment/facade/-/facade-3.4.9.tgz", - "integrity": "sha512-0RTLB0g4HiJASc6pTD2/Tru+Qz+VPGL1W+/EvkBGhY6WYk00cZhTjLsMJ8X5BO6iPqLb3vsxtfjVM/RREG5oQQ==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@segment/facade/-/facade-3.4.10.tgz", + "integrity": "sha512-xVQBbB/lNvk/u8+ey0kC/+g8pT3l0gCT8O2y9Z+StMMn3KAFAQ9w8xfgef67tJybktOKKU7pQGRPolRM1i1pdA==", "dependencies": { "@segment/isodate-traverse": "^1.1.1", "inherits": "^2.0.4", @@ -8421,16 +8207,15 @@ } }, "node_modules/@testing-library/dom": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.0.tgz", - "integrity": "sha512-Dffe68pGwI6WlLRYR2I0piIkyole9cSBH5jGQKCGMRpHW5RHCqAUaqc2Kv0tUyd4dU4DLPKhJIjyKOnjv4tuUw==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", + "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", "dev": true, - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "^5.0.0", + "aria-query": "5.1.3", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", @@ -8495,89 +8280,40 @@ } }, "node_modules/@testing-library/react": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz", - "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.1.0.tgz", + "integrity": "sha512-hcvfZEEyO0xQoZeHmUbuMs7APJCGELpilL7bY+BaJaMP57aWc6q1etFwScnoZDheYjk4ESdlzPdQ33IbsKAK/A==", "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.0.0", - "@types/react-dom": "<18.0.0" + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" }, "peerDependencies": { - "react": "<18.0.0", - "react-dom": "<18.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@testing-library/react-hooks": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz", - "integrity": "sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==", + "node_modules/@testing-library/user-event": { + "version": "14.5.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz", + "integrity": "sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==", "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "react-error-boundary": "^3.1.0" - }, "engines": { - "node": ">=12" + "node": ">=12", + "npm": ">=6" }, "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0", - "react": "^16.9.0 || ^17.0.0", - "react-dom": "^16.9.0 || ^17.0.0", - "react-test-renderer": "^16.9.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-test-renderer": { - "optional": true - } + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.0.tgz", - "integrity": "sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.5.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz", - "integrity": "sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, "engines": { "node": ">= 6" @@ -8593,15 +8329,15 @@ } }, "node_modules/@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -8612,18 +8348,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -8631,18 +8367,18 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", @@ -8650,32 +8386,32 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/chroma-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.0.tgz", - "integrity": "sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.3.tgz", + "integrity": "sha512-1ly5ly/7S/YF8aD7MxUQnFOZxdegimuOunJl0xDsLlguu5JrwuSTVGVH3UpIUlh6YauI0RMNT4cqjBonhgbdIQ==" }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@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==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", + "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -8683,21 +8419,21 @@ } }, "node_modules/@types/crypto-js": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.3.tgz", - "integrity": "sha512-YP1sYYayLe7Eg5oXyLLvOLfxBfZ5Fgpz6sVWkpB18wDMywCLPWmqzRz+9gyuOoLF0fzDTTFwlyNbx7koONUwqA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.1.tgz", + "integrity": "sha512-FSPGd9+OcSok3RsM0UZ/9fcvMOXJ1ENE/ZbLfOPlBWj7BgXtEAM8VYfTtT760GiLbQIMoVozwVuisjvsVwqYWw==", "dev": true }, "node_modules/@types/css-mediaquery": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/css-mediaquery/-/css-mediaquery-0.1.2.tgz", - "integrity": "sha512-rCNkBpTDMU0eUxfSK3CqUU0VET/vcfF83am2XdWnlb8qoCntxehkTRPvmf/n7h1TtP9Xvn3LQyJqbr0aWAFEUw==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/css-mediaquery/-/css-mediaquery-0.1.4.tgz", + "integrity": "sha512-DZyHAz716ZUctpqkUU2COwUoZ4gI6mZK2Q1oIz/fvNS6XHVpKSJgDnE7vRxZUBn9vjJHDVelCVW0dkshKOLFsA==", "dev": true }, "node_modules/@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "version": "8.44.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", + "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -8705,9 +8441,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -8715,15 +8451,15 @@ } }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -8733,29 +8469,30 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -8767,43 +8504,49 @@ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, "node_modules/@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@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==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "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==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "29.5.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", - "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -8823,12 +8566,12 @@ } }, "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.1.tgz", - "integrity": "sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -8843,9 +8586,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -8855,39 +8598,51 @@ "dev": true }, "node_modules/@types/loadable__component": { - "version": "5.13.5", - "resolved": "https://registry.npmjs.org/@types/loadable__component/-/loadable__component-5.13.5.tgz", - "integrity": "sha512-YMpOC3hkzuLKi0ZBRn1LFglw4cDP70cGeQ9ZXBh5mYCLo+dJtw+DflNTx55VGl7BQ3MATiS+VNd8apEtaQcl5w==", + "version": "5.13.7", + "resolved": "https://registry.npmjs.org/@types/loadable__component/-/loadable__component-5.13.7.tgz", + "integrity": "sha512-/FTIqPHwA5FbtjdsxJl8NGByOKtH1dkH2A1BGNViGUPxCEsuckqC+XC7yPVuJWa3AV5webfopDWZ6df6cN0ZHA==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", - "dev": true + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", + "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/nspell": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/nspell/-/nspell-2.1.5.tgz", - "integrity": "sha512-vI5W59b9b+GD378foZ1pBeZ9sSFFEKmF9D4aJM6DKOv9YGtsx9mdtjoJYGzjiO/CRDLlEjDYzc4PdmzXi+QgsA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/nspell/-/nspell-2.1.6.tgz", + "integrity": "sha512-PnWYqrBZhkKAreX2kIZDJcBeigZJzXC8VmSuNiXeILUNreczBZHLxGEv/pRT+zL8rsXLxT5bRbiIF9wuh6cGgg==", "dev": true, "dependencies": { "@types/node": "*" } }, "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==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -8896,32 +8651,32 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.9", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", - "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" }, "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", "dev": true }, "node_modules/@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==", + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "dev": true }, "node_modules/@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==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/@types/react": { - "version": "17.0.47", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.47.tgz", - "integrity": "sha512-mk0BL8zBinf2ozNr3qPnlu1oyVTYq+4V7WA76RgxUAtf0Em/Wbid38KN6n4abEkvO4xMTBWmnP1FtQzgkEiJoA==", + "version": "18.2.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", + "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -8929,36 +8684,36 @@ } }, "node_modules/@types/react-beautiful-dnd": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", - "integrity": "sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", + "version": "13.1.7", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.7.tgz", + "integrity": "sha512-jQZLov9OkD0xRQkqz8/lx66bHYAYv+g4+POBqnH5Jtt/xo4MygzM879Q9sxAiosPBdNj1JYTdbPxDn3dNRYgow==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-dom": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz", - "integrity": "sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==", + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz", + "integrity": "sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==", "devOptional": true, "dependencies": { - "@types/react": "^17" + "@types/react": "*" } }, "node_modules/@types/react-modal": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.16.0.tgz", - "integrity": "sha512-iphdqXAyUfByLbxJn5j6d+yh93dbMgshqGP0IuBeaKbZXx0aO+OXsvEkt6QctRdxjeM9/bR+Gp3h9F9djVWTQQ==", + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-xXuGavyEGaFQDgBv4UVm8/ZsG+qxeQ7f77yNrW3n+1J6XAstUy5rYHeIHPh1KzsGc6IkCIdu6lQ2xWzu1jBTLg==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-redux": { - "version": "7.1.24", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz", - "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==", + "version": "7.1.30", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.30.tgz", + "integrity": "sha512-i2kqM6YaUwFKduamV6QM/uHbb0eCP8f8ZQ/0yWf+BsAVVsZPRYJ9eeGWZ3uxLfWwwA0SrPRMTPTqsPFkY3HZdA==", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -8967,32 +8722,32 @@ } }, "node_modules/@types/react-test-renderer": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.2.tgz", - "integrity": "sha512-+F1KONQTBHDBBhbHuT2GNydeMpPuviduXIVJRB7Y4nma4NR5DrTJfMMZ+jbhEHbpwL+Uqhs1WXh4KHiyrtYTPg==", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.6.tgz", + "integrity": "sha512-O2JT1J3/v/NaYHYmPf2DXBSqUGmp6iwhFPicES6Pc1Y90B9Qgu99mmaBGqfZFpVuXLzF/pNJB4K9ySL3iqFeXA==", "dev": true, "dependencies": { - "@types/react": "^17" + "@types/react": "*" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", - "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", + "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", "dependencies": { "@types/react": "*" } }, "node_modules/@types/recordrtc": { - "version": "5.6.12", - "resolved": "https://registry.npmjs.org/@types/recordrtc/-/recordrtc-5.6.12.tgz", - "integrity": "sha512-lr64cN0eGvuGXhmM6Rfh0BifYSqmDXP5SYdBuFkeUKXlrrp/IJL6oqnDEJWy7tLGV9LVUiWj2S1+bnwblY4riA==", + "version": "5.6.14", + "resolved": "https://registry.npmjs.org/@types/recordrtc/-/recordrtc-5.6.14.tgz", + "integrity": "sha512-Reiy1sl11xP0r6w8DW3iQjc1BgXFyNC7aDuutysIjpFoqyftbQps9xPA2FoBkfVXpJM61betgYPNt+v65zvMhA==", "dev": true }, "node_modules/@types/redux-mock-store": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/redux-mock-store/-/redux-mock-store-1.0.4.tgz", - "integrity": "sha512-53nDnXba4M7aOJsRod8HKENDC9M2ccm19yZcXImoP15oDLuBru+Q+WKWOCQwKYOC1S/6AJx58mFp8kd4s8q1rQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/redux-mock-store/-/redux-mock-store-1.0.6.tgz", + "integrity": "sha512-eg5RDfhJTXuoJjOMyXiJbaDb1B8tfTaJixscmu+jOusj6adGC0Krntz09Tf4gJgXeCqCrM5bBMd+B7ez0izcAQ==", "dev": true, "dependencies": { "redux": "^4.0.5" @@ -9014,60 +8769,71 @@ "dev": true }, "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", + "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==" }, "node_modules/@types/segment-analytics": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/segment-analytics/-/segment-analytics-0.0.34.tgz", - "integrity": "sha512-fiOyEgyqJY2Mv9k72WG4XoY4fVE31byiSUrEFcNh+MgHcH3HuJmoz2J7ktO3YizBrN6/RuaH1tY5J/5I5BJHJQ==", + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/segment-analytics/-/segment-analytics-0.0.37.tgz", + "integrity": "sha512-Q39GL4/QLcWrZK68sZ8MstUa5QI9KQ7kk8UtvKpNWFAE/GeUWs0WTUlYTNpolSotA4OpSWD2p0E3LB/drHPGOw==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@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==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "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==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", + "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==", "dev": true }, "node_modules/@types/use-sync-external-store": { @@ -9076,52 +8842,52 @@ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "node_modules/@types/uuid": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.4.tgz", - "integrity": "sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", + "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==", "dev": true }, "node_modules/@types/validator": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", - "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==", + "version": "13.11.6", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", + "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==", "dev": true }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", "dev": true, "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==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", + "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/type-utils": "6.11.0", + "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -9146,52 +8912,94 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" + "ms": "2.1.2" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/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==", + "dev": true + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -9203,49 +9011,50 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "node_modules/@typescript-eslint/experimental-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -9262,41 +9071,44 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/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==", - "dev": true - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "node_modules/@typescript-eslint/experimental-utils/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==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.62.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" } }, + "node_modules/@typescript-eslint/experimental-utils/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==", + "dev": true + }, "node_modules/@typescript-eslint/parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", - "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", + "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4" }, "engines": { @@ -9315,11 +9127,38 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", - "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", + "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0" + }, "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -9328,128 +9167,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", - "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", + "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", - "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.3.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/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==", - "dev": true - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", - "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", - "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", - "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.3.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/utils": "6.11.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -9469,105 +9194,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -9592,12 +9218,12 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", + "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -9605,21 +9231,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", + "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -9655,208 +9281,196 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", + "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", + "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.11.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "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.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "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.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "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.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "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.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "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.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -9879,10 +9493,13 @@ "dev": true }, "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/abort-controller": { "version": "3.0.0", @@ -9909,9 +9526,9 @@ } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -9930,6 +9547,27 @@ "acorn-walk": "^7.1.1" } }, + "node_modules/acorn-globals/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-import-assertions": { + "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==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -9939,17 +9577,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -10175,13 +9802,10 @@ "dev": true }, "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" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/aria-query": { "version": "5.1.3", @@ -10304,14 +9928,14 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" }, @@ -10323,27 +9947,28 @@ } }, "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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" } }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" @@ -10371,15 +9996,15 @@ } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, "node_modules/asynciterator.prototype": { @@ -10406,9 +10031,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -10418,12 +10043,16 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -10451,9 +10080,9 @@ } }, "node_modules/axe-core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", - "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" @@ -10468,26 +10097,13 @@ "form-data": "^4.0.0" } }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/babel-jest": { @@ -10512,6 +10128,31 @@ "@babel/core": "^7.8.0" } }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/babel-loader": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", @@ -10573,15 +10214,6 @@ "semver": "bin/semver.js" } }, - "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==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -10637,17 +10269,17 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "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==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { @@ -10660,28 +10292,28 @@ } }, "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.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.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.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.4.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-transform-react-remove-prop-types": { @@ -10786,14 +10418,15 @@ "dev": true }, "node_modules/bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", "dev": true, "dependencies": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", + "bluebird": "^3.7.2", + "check-types": "^11.2.3", "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", "tryer": "^1.0.1" }, "engines": { @@ -10881,9 +10514,9 @@ } }, "node_modules/bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "dev": true, "dependencies": { "array-flatten": "^2.1.2", @@ -10927,9 +10560,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -10939,13 +10572,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -11027,13 +10664,14 @@ } }, "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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11091,9 +10729,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001451", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", - "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", + "version": "1.0.30001562", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz", + "integrity": "sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==", "dev": true, "funding": [ { @@ -11103,6 +10741,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -11152,9 +10794,9 @@ } }, "node_modules/check-types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", "dev": true }, "node_modules/chokidar": { @@ -11184,6 +10826,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chroma-js": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", @@ -11199,9 +10853,9 @@ } }, "node_modules/ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -11236,6 +10890,15 @@ "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -11249,9 +10912,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", "dev": true, "engines": { "node": ">=6" @@ -11281,9 +10944,9 @@ } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", "engines": { "node": ">=6" } @@ -11384,9 +11047,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -11414,9 +11077,9 @@ "dev": true }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/combined-stream": { @@ -11431,12 +11094,12 @@ } }, "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { - "node": ">= 12" + "node": ">=16" } }, "node_modules/common-path-prefix": { @@ -11490,6 +11153,12 @@ "node": ">= 0.8.0" } }, + "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==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -11523,26 +11192,6 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/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==", - "dev": true, - "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/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -11553,12 +11202,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "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", @@ -11576,9 +11222,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.2.tgz", - "integrity": "sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -11587,12 +11233,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", - "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "dev": true, "dependencies": { - "browserslist": "^4.21.4" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", @@ -11600,9 +11246,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.2.tgz", - "integrity": "sha512-Cf2jqAbXgWH3VVzjyaaFkY1EBazxugUepGymDoeteyYr9ByX51kD2jdHZlsEF/xnJMyN3Prua7mQuzwMg6Zc9A==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz", + "integrity": "sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==", "dev": true, "hasInstallScript": true, "funding": { @@ -11617,9 +11263,9 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -11631,12 +11277,35 @@ "node": ">=10" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dependencies": { - "node-fetch": "^2.6.11" + "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { @@ -11694,9 +11363,9 @@ } }, "node_modules/css-declaration-sorter": { - "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==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "dev": true, "engines": { "node": "^10 || ^12 || >=14" @@ -11724,15 +11393,15 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -11828,15 +11497,15 @@ "dev": true }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -11846,6 +11515,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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", @@ -11896,13 +11574,13 @@ "node": ">=8.0.0" } }, - "node_modules/css-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/css-what": { @@ -11924,14 +11602,20 @@ "dev": true }, "node_modules/cssdb": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.4.1.tgz", - "integrity": "sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.9.0.tgz", + "integrity": "sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] }, "node_modules/cssesc": { "version": "3.0.0", @@ -11952,12 +11636,12 @@ "dev": true }, "node_modules/cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.13", + "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -11973,22 +11657,22 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dev": true, "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", + "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.7", - "postcss-merge-rules": "^5.1.3", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.4", @@ -12003,7 +11687,7 @@ "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -12058,6 +11742,15 @@ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, + "node_modules/csso/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -12134,9 +11827,12 @@ } }, "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, "engines": { "node": ">=0.11" }, @@ -12146,9 +11842,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debounce": { "version": "1.2.1", @@ -12197,16 +11893,17 @@ } }, "node_modules/deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", + "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -12214,11 +11911,14 @@ "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12240,9 +11940,9 @@ "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==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { "node": ">=0.10.0" } @@ -12271,6 +11971,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -12281,11 +11995,12 @@ } }, "node_modules/define-properties": { - "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==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -12296,15 +12011,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -12430,6 +12136,15 @@ "node": "^12.20.0 || >=14" } }, + "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", @@ -12472,23 +12187,6 @@ "node": ">= 4.2.1" } }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/detective-amd": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-4.2.0.tgz", @@ -12645,6 +12343,86 @@ "node": "^12.20.0 || ^14.14.0 || >=16.0.0" } }, + "node_modules/detective-typescript/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/detective-typescript/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/detective-typescript/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/detective-typescript/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/detective-typescript/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==", + "dev": true + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -12694,9 +12472,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -12718,9 +12496,9 @@ } }, "node_modules/dom-accessibility-api": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, "node_modules/dom-converter": { @@ -12843,9 +12621,9 @@ "dev": true }, "node_modules/dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", "engines": { "node": ">=4" } @@ -12869,9 +12647,9 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "dependencies": { "jake": "^10.8.5" @@ -12884,9 +12662,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.289", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.289.tgz", - "integrity": "sha512-relLdMfPBxqGCxy7Gyfm1HcbRPcFUJdlgnCPVgQ23sr1TvUrRJz0/QPoGP0+x41wOVSTN/Wi3w6YDgHiHJGOzg==", + "version": "1.4.583", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.583.tgz", + "integrity": "sha512-93y1gcONABZ7uqYe/JWDVQP/Pj/sQSunF0HVAPdlg/pfBnOyBMLlQUxWvkqcljJg1+W6cjvPuYD+r1Th9Tn8mA==", "dev": true }, "node_modules/emittery": { @@ -12928,9 +12706,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -12967,26 +12745,26 @@ } }, "node_modules/es-abstract": { - "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==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "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", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -12994,23 +12772,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "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" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -13046,14 +12824,14 @@ } }, "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==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", @@ -13063,37 +12841,37 @@ "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" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, "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.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, "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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.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", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -13140,15 +12918,14 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -13161,70 +12938,30 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/escodegen/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==", "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, + "optional": true, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -13266,6 +13003,291 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-react-app/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-config-react-app/node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-config-react-app/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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-config-react-app/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-config-react-app/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==", + "dev": true + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -13293,9 +13315,9 @@ "dev": true }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", - "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -13372,6 +13394,24 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, "node_modules/eslint-plugin-import": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", @@ -13440,27 +13480,27 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -13468,14 +13508,14 @@ "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "dequal": "^2.0.3" } }, "node_modules/eslint-plugin-react": { @@ -13533,12 +13573,12 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "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==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -13559,12 +13599,12 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.1.tgz", - "integrity": "sha512-GRy87AqUi2Ij69pe0YnOXm3oGBCgnFwfIv+Hu9q/kT3jL0pX1cXA7aO+oJnvdpbJy2+riOPqGsa3iAkL888NLg==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^5.43.0" + "@typescript-eslint/utils": "^5.58.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0", @@ -13574,6 +13614,151 @@ "eslint": "^7.5.0 || ^8.0.0" } }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-testing-library/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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-testing-library/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==", + "dev": true + }, "node_modules/eslint-plugin-unused-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", @@ -13605,25 +13790,19 @@ } }, "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.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -13711,15 +13890,15 @@ "dev": true }, "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -13744,12 +13923,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/eslint/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==", - "dev": true - }, "node_modules/eslint/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -13767,46 +13940,6 @@ } } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/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==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13830,18 +13963,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -13936,11 +14057,11 @@ } }, "node_modules/eventsource": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.2.tgz", - "integrity": "sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", "engines": { - "node": ">=0.12.0" + "node": ">=12.0.0" } }, "node_modules/execa": { @@ -13967,73 +14088,30 @@ } }, "node_modules/exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.6.4", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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" - } + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, - "node_modules/expect/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/expect/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -14087,32 +14165,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "node_modules/express/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": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "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==", - "dev": true, - "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/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -14120,9 +14172,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -14135,6 +14187,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "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", @@ -14148,9 +14212,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -14178,14 +14242,12 @@ } }, "node_modules/fetch-cookie": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.11.0.tgz", - "integrity": "sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.1.0.tgz", + "integrity": "sha512-39+cZRbWfbibmj22R2Jy6dmTbAWC+oqun1f1FzQaNurkPDUP4C38jpeZbiXCR88RKRVDp8UcDrbFXkNhN+NjYg==", "dependencies": { - "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" - }, - "engines": { - "node": ">=8" + "set-cookie-parser": "^2.4.8", + "tough-cookie": "^4.0.0" } }, "node_modules/file-entry-cache": { @@ -14239,9 +14301,9 @@ } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -14420,22 +14482,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up/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==", - "dev": true, - "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==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -14443,9 +14497,9 @@ } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/flatten": { @@ -14456,9 +14510,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -14512,9 +14566,9 @@ } }, "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", - "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.8.3", @@ -14609,10 +14663,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -14632,16 +14685,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { @@ -14668,9 +14721,9 @@ } }, "node_modules/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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true }, "node_modules/fs.realpath": { @@ -14680,9 +14733,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -14702,15 +14755,15 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -14729,12 +14782,12 @@ } }, "node_modules/gensequence": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", - "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-6.0.0.tgz", + "integrity": "sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/gensync": { @@ -14769,15 +14822,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14827,10 +14880,13 @@ } }, "node_modules/get-tsconfig": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", - "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } @@ -14856,15 +14912,15 @@ } }, "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==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { @@ -14912,9 +14968,9 @@ } }, "node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -14977,9 +15033,9 @@ } }, "node_modules/goober": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.12.tgz", - "integrity": "sha512-yXHAvO08FU1JgTXX6Zn6sYCUFfB/OJSX8HHjDSgerZHZmFKAb08cykp5LBw5QnmyMcZyPRMqkdyHUSSzge788Q==", + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.13.tgz", + "integrity": "sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==", "peerDependencies": { "csstype": "^3.0.10" } @@ -14997,9 +15053,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/graphemer": { @@ -15035,18 +15091,6 @@ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -15066,12 +15110,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15206,9 +15250,9 @@ "dev": true }, "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==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -15220,6 +15264,12 @@ "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==", + "dev": true + }, "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", @@ -15242,10 +15292,20 @@ } }, "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/html-escaper": { "version": "2.0.2", @@ -15274,6 +15334,15 @@ "node": ">=12" } }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/html-parse-stringify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", @@ -15283,9 +15352,9 @@ } }, "node_modules/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==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", + "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -15478,15 +15547,15 @@ } }, "node_modules/hunspell-reader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/hunspell-reader/-/hunspell-reader-7.0.0.tgz", - "integrity": "sha512-JKYDJynos1sgGQ70t58UpYyI+YkxOlkvNt/Tokgd5J5sgXjvGBXrl1tti9RH5k804rAffjQitHObtlzi6shZnQ==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/hunspell-reader/-/hunspell-reader-7.3.9.tgz", + "integrity": "sha512-PQEEjLIo3xFzUna/J+2nCGvMkHBUlXFWBfGe7S2TvYGnYwqNEQvFIqr/g4bOp6G0gCYmX1Jd8gNNVFhXCdTI8g==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "^7.0.0", - "@cspell/cspell-types": "^7.0.0", - "commander": "^10.0.1", - "gensequence": "^5.0.2", + "@cspell/cspell-pipe": "^7.3.9", + "@cspell/cspell-types": "^7.3.9", + "commander": "^11.1.0", + "gensequence": "^6.0.0", "iconv-lite": "^0.6.3" }, "bin": { @@ -15496,24 +15565,10 @@ "node": ">=16" } }, - "node_modules/hunspell-reader/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, "node_modules/i18next": { - "version": "23.4.6", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.4.6.tgz", - "integrity": "sha512-jBE8bui969Ygv7TVYp0pwDZB7+he0qsU+nz7EcfdqSh+QvKjEfl9YPRQd/KrGiMhTYFGkeuPaeITenKK/bSFDg==", + "version": "23.7.6", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.7.6.tgz", + "integrity": "sha512-O66BhXBw0fH4bEJMA0/klQKPEbcwAp5wjXEL803pdAynNbg2f4qhLIYlNHJyE7icrL6XmSZKPYaaXwy11kJ6YQ==", "funding": [ { "type": "individual", @@ -15529,23 +15584,23 @@ } ], "dependencies": { - "@babel/runtime": "^7.22.5" + "@babel/runtime": "^7.23.2" } }, "node_modules/i18next-browser-languagedetector": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.1.0.tgz", - "integrity": "sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz", + "integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==", "dependencies": { - "@babel/runtime": "^7.19.4" + "@babel/runtime": "^7.23.2" } }, "node_modules/i18next-http-backend": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.2.2.tgz", - "integrity": "sha512-mJu4ZqzDtBiU3O4GV9AbK5ekEqoDMdMnCl3pkdXmb5b8yoIH//u8FsmIe6C5qXb3teZu+j6VMi20tjUgzeABiw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.4.1.tgz", + "integrity": "sha512-CZHzFGDvF8zN7ya1W2lHbgLj2ejPUvPD836+vA3eNXc9eKGUM3MSF6SA2TKBXKBZ2cNG3nxzycCXeM6n/46KWQ==", "dependencies": { - "cross-fetch": "3.1.6" + "cross-fetch": "4.0.0" } }, "node_modules/iconv-lite": { @@ -15629,9 +15684,9 @@ } }, "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -15713,13 +15768,13 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -15727,9 +15782,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, "engines": { "node": ">= 10" @@ -15966,11 +16021,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -16171,16 +16221,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "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": { - "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" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -16284,9 +16330,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -16368,6 +16414,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/istanbul-lib-source-maps/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-reports": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", @@ -16382,22 +16437,22 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", - "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "has-tostringtag": "^1.0.0", - "reflect.getprototypeof": "^1.0.3" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "node_modules/jackspeak": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", - "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -16413,15 +16468,15 @@ } }, "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" @@ -16431,133 +16486,84 @@ } }, "node_modules/jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/core": "^29.6.4", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.6.4" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-canvas-mock": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", - "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", - "dev": true, - "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.6.3", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "optional": true, + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/jest-changed-files/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/jest-canvas-mock": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", + "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "@types/yargs-parser": "*" + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" } }, - "node_modules/jest-changed-files/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -16566,36 +16572,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest-circus/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-circus/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -16610,29 +16586,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-circus/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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-circus/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -16654,24 +16611,23 @@ "peer": true }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -16689,36 +16645,6 @@ } } }, - "node_modules/jest-cli/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest-cli/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -16749,29 +16675,10 @@ "node": ">=12" } }, - "node_modules/jest-cli/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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-cli/node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "optional": true, "peer": true, @@ -16781,16 +16688,16 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -16843,33 +16750,33 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "optional": true, "peer": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -16890,9 +16797,9 @@ } }, "node_modules/jest-config/node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "optional": true, "peer": true, @@ -16905,9 +16812,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -16917,36 +16824,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest-config/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -16962,14 +16839,14 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -17028,9 +16905,9 @@ "peer": true }, "node_modules/jest-config/node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "optional": true, "peer": true, @@ -17042,8 +16919,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -17066,19 +16943,19 @@ } }, "node_modules/jest-config/node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "optional": true, "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -17087,29 +16964,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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-config/node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "optional": true, "peer": true, @@ -17119,22 +16977,22 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "optional": true, "peer": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -17143,9 +17001,9 @@ } }, "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -17210,15 +17068,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -17237,9 +17095,9 @@ } }, "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -17257,9 +17115,9 @@ "dev": true }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "optional": true, "peer": true, @@ -17271,9 +17129,9 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "optional": true, "peer": true, @@ -17281,43 +17139,13 @@ "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -17332,29 +17160,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-each/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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-each/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -17425,6 +17234,22 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-environment-jsdom/node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -17443,6 +17268,15 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/jest-environment-jsdom/node_modules/jest-message-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", @@ -17457,88 +17291,56 @@ "micromatch": "^4.0.4", "pretty-format": "^27.5.1", "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "stack-utils": "^2.0.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/jest-environment-jsdom/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@jest/types": "^27.5.1", + "@types/node": "*" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "@types/yargs-parser": "*" + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-environment-node/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "optional": true, "peer": true, "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -17579,6 +17381,48 @@ "fsevents": "^2.3.2" } }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-jasmine2": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", @@ -17699,6 +17543,22 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-jasmine2/node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -17717,6 +17577,15 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/jest-jasmine2/node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -17895,16 +17764,42 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "optional": true, "peer": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -17925,9 +17820,9 @@ } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -17949,15 +17844,15 @@ "peer": true }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -17976,9 +17871,9 @@ } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -17996,9 +17891,9 @@ "dev": true }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -18007,7 +17902,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -18015,32 +17910,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest-message-util/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -18054,9 +17923,9 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -18074,65 +17943,16 @@ "dev": true }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest-mock/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-mock/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "optional": true, "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -18186,15 +18006,15 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "optional": true, "peer": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -18211,33 +18031,75 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@types/yargs": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -18246,9 +18108,9 @@ } }, "node_modules/jest-runner/node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "optional": true, "peer": true, @@ -18261,46 +18123,16 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest-runner/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/ansi-styles": { @@ -18326,9 +18158,9 @@ "peer": true }, "node_modules/jest-runner/node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "optional": true, "peer": true, @@ -18340,8 +18172,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -18364,19 +18196,19 @@ } }, "node_modules/jest-runner/node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "optional": true, "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -18385,29 +18217,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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-runner/node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "optional": true, "peer": true, @@ -18417,22 +18230,22 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "optional": true, "peer": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -18441,9 +18254,9 @@ } }, "node_modules/jest-runner/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -18475,6 +18288,17 @@ "node": ">=10" } }, + "node_modules/jest-runner/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==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -18520,19 +18344,19 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "optional": true, "peer": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -18540,13 +18364,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -18555,9 +18379,9 @@ } }, "node_modules/jest-runtime/node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "optional": true, "peer": true, @@ -18570,9 +18394,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -18582,36 +18406,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest-runtime/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-runtime/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -18635,9 +18429,9 @@ "peer": true }, "node_modules/jest-runtime/node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "optional": true, "peer": true, @@ -18649,8 +18443,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -18673,19 +18467,19 @@ } }, "node_modules/jest-runtime/node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "optional": true, "peer": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -18694,29 +18488,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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-runtime/node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "optional": true, "peer": true, @@ -18726,22 +18501,22 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "optional": true, "peer": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -18750,9 +18525,9 @@ } }, "node_modules/jest-runtime/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -18830,9 +18605,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "optional": true, "peer": true, @@ -18842,20 +18617,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -18863,9 +18638,9 @@ } }, "node_modules/jest-snapshot/node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "optional": true, "peer": true, @@ -18878,9 +18653,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -18890,36 +18665,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest-snapshot/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -18943,9 +18688,9 @@ "peer": true }, "node_modules/jest-snapshot/node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "optional": true, "peer": true, @@ -18957,8 +18702,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -18980,35 +18725,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@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-snapshot/node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "optional": true, "peer": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -19017,9 +18743,9 @@ } }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "optional": true, "peer": true, @@ -19073,12 +18799,12 @@ } }, "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -19086,7 +18812,7 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { @@ -19106,80 +18832,56 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-validate/node_modules/jest-get-type": { + "node_modules/jest-validate/node_modules/@jest/types": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^29.6.4", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.6.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^17.0.8", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/jest-validate/node_modules/@types/yargs": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@types/yargs-parser": "*" } }, - "node_modules/jest-watcher/node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "optional": true, "peer": true, "dependencies": { + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", + "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -19214,34 +18916,13 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jest/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@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/jest/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" + "bin": { + "jiti": "bin/jiti.js" } }, "node_modules/js-base64": { @@ -19263,13 +18944,12 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -19321,16 +19001,18 @@ } } }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=0.4.0" + "node": ">= 6" } }, "node_modules/jsdom/node_modules/tr46": { @@ -19371,6 +19053,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "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", @@ -19418,116 +19106,69 @@ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jss": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", - "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", - "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", - "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-global": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", - "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-nested": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", - "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", - "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" } }, - "node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", - "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", - "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -19562,12 +19203,25 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" } }, "node_modules/leven": { @@ -19593,16 +19247,16 @@ } }, "node_modules/license-checker-rseidelsohn": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/license-checker-rseidelsohn/-/license-checker-rseidelsohn-4.2.6.tgz", - "integrity": "sha512-cV69Exm7y7stSVoYpFaQ1rEdmTtA7y1bMgTeeB1fqE0TZRkW1zpn8uIsIKeHK5rMvJYQzEuExNmLOTDXJMplgg==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/license-checker-rseidelsohn/-/license-checker-rseidelsohn-4.2.10.tgz", + "integrity": "sha512-phvcph9WTQ/Kb209kqwLxVA6CV8BAeUnFMIo+I+wBlp74El4ngbMwq49qSqqPYC5bfj49EWBXqwjvTFswGE2Fg==", "dev": true, "dependencies": { "chalk": "4.1.2", "debug": "^4.3.4", "lodash.clonedeep": "^4.5.0", "mkdirp": "^1.0.4", - "nopt": "^5.0.0", + "nopt": "^7.2.0", "read-installed-packages": "^2.0.1", "semver": "^7.3.5", "spdx-correct": "^3.1.1", @@ -19642,9 +19296,9 @@ "dev": true }, "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { "node": ">=10" @@ -19683,15 +19337,6 @@ "node": ">=4" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/load-json-file/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -19823,14 +19468,12 @@ } }, "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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/lz-string": { @@ -19970,12 +19613,12 @@ } }, "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -20088,9 +19731,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -20141,15 +19784,15 @@ "dev": true }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -20178,14 +19821,17 @@ } }, "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.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", - "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -20298,16 +19944,16 @@ } }, "node_modules/motion": { - "version": "10.16.2", - "resolved": "https://registry.npmjs.org/motion/-/motion-10.16.2.tgz", - "integrity": "sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==", + "version": "10.16.4", + "resolved": "https://registry.npmjs.org/motion/-/motion-10.16.4.tgz", + "integrity": "sha512-wvBeT0sZNgU6Od1aimjywBikqzm5yE97+L9eM/AoLy01AXNPdcnSDVHB3CoR0dGdHMbp/S0A/PjsJfWg0+k8Mg==", "dependencies": { - "@motionone/animation": "^10.15.1", - "@motionone/dom": "^10.16.2", - "@motionone/svelte": "^10.16.2", - "@motionone/types": "^10.15.1", - "@motionone/utils": "^10.15.1", - "@motionone/vue": "^10.16.2" + "@motionone/animation": "^10.16.3", + "@motionone/dom": "^10.16.4", + "@motionone/svelte": "^10.16.4", + "@motionone/types": "^10.16.3", + "@motionone/utils": "^10.16.3", + "@motionone/vue": "^10.16.4" } }, "node_modules/mout": { @@ -20341,10 +19987,21 @@ "multicast-dns": "cli.js" } }, + "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/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -20410,9 +20067,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -20444,9 +20101,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/node-source-walk": { @@ -20462,18 +20119,18 @@ } }, "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "dependencies": { - "abbrev": "1" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": ">=6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-package-data": { @@ -20542,6 +20199,14 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/notistack/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/npm-normalize-package-bin": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", @@ -20775,9 +20440,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20827,14 +20492,14 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -20858,15 +20523,16 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", "dev": true, "dependencies": { - "array.prototype.reduce": "^1.0.4", + "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" }, "engines": { "node": ">= 0.8" @@ -20888,13 +20554,13 @@ } }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20969,16 +20635,17 @@ } }, "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==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { - "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" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -21067,6 +20734,15 @@ "node": ">=8" } }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -21140,12 +20816,12 @@ } }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-is-absolute": { @@ -21188,14 +20864,23 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", + "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, "engines": { "node": "14 || >=16.14" } }, + "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": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -21241,18 +20926,18 @@ } }, "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -21322,24 +21007,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", @@ -21404,13 +21071,13 @@ "node": ">=6" } }, - "node_modules/pkg-up/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==", + "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": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/pluralize": { @@ -21423,9 +21090,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -21568,12 +21235,12 @@ } }, "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==", "dev": true, "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -21844,9 +21511,9 @@ } }, "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", @@ -21854,7 +21521,7 @@ "resolve": "^1.1.7" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { "postcss": "^8.0.0" @@ -21909,16 +21576,16 @@ } }, "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "dependencies": { "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "yaml": "^2.1.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" }, "funding": { "type": "opencollective", @@ -21937,6 +21604,15 @@ } } }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-loader": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", @@ -22000,9 +21676,9 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dev": true, "dependencies": { "browserslist": "^4.21.4", @@ -22094,9 +21770,9 @@ } }, "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==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -22141,12 +21817,12 @@ } }, "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" @@ -22503,9 +22179,9 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dev": true, "dependencies": { "browserslist": "^4.21.4", @@ -22562,9 +22238,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -22618,6 +22294,15 @@ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, + "node_modules/postcss-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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/postcss-svgo/node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", @@ -22981,9 +22666,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -23130,17 +22815,17 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true, "funding": [ { @@ -23205,18 +22890,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/quote-unquote": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", @@ -23316,12 +22989,11 @@ } }, "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==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -23344,6 +23016,12 @@ "node": ">=14" } }, + "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, "node_modules/react-beautiful-dnd": { "version": "13.1.1", "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", @@ -23449,61 +23127,16 @@ "node": ">= 12.13.0" } }, - "node_modules/react-dev-utils/node_modules/open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "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", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-double-scrollbar": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/react-double-scrollbar/-/react-double-scrollbar-0.0.15.tgz", - "integrity": "sha512-dLz3/WBIpgFnzFY0Kb4aIYBMT2BWomHuW2DH6/9jXfS6/zxRRBUFQ04My4HIB7Ma7QoRBpcy8NtkPeFgcGBpgg==", - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "react": ">= 0.14.7" - } - }, - "node_modules/react-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": ">=16.13.1" + "react": "^18.2.0" } }, "node_modules/react-error-overlay": { @@ -23513,9 +23146,9 @@ "dev": true }, "node_modules/react-i18next": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.3.1.tgz", - "integrity": "sha512-JAtYREK879JXaN9GdzfBI4yJeo/XyLeXWUsRABvYXiFUakhZJ40l+kaTo+i+A/3cKIED41kS/HAbZ5BzFtq/Og==", + "version": "13.4.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.4.1.tgz", + "integrity": "sha512-z02JvLbt6Gavbuhr4CBOI6vasLypo+JSLvMgUOGeOMPv1g6spngfAb9jWAPwvuavPlKYU4dro9yRduflwyBeyA==", "dependencies": { "@babel/runtime": "^7.22.5", "html-parse-stringify": "^3.0.1" @@ -23614,11 +23247,11 @@ } }, "node_modules/react-router": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz", - "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", + "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", "dependencies": { - "@remix-run/router": "1.9.0" + "@remix-run/router": "1.11.0" }, "engines": { "node": ">=14.0.0" @@ -23628,12 +23261,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz", - "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", + "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", "dependencies": { - "@remix-run/router": "1.9.0", - "react-router": "6.16.0" + "@remix-run/router": "1.11.0", + "react-router": "6.18.0" }, "engines": { "node": ">=14.0.0" @@ -23926,6 +23559,22 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/react-scripts/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/react-scripts/node_modules/@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", @@ -23951,119 +23600,14 @@ } }, "node_modules/react-scripts/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/react-scripts/node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/react-scripts/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -24076,23 +23620,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/react-scripts/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/react-scripts/node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -24120,76 +23647,6 @@ "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/react-scripts/node_modules/eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/react-scripts/node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/react-scripts/node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, "node_modules/react-scripts/node_modules/expect": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", @@ -24593,6 +24050,23 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/react-scripts/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/react-scripts/node_modules/jest-watch-typeahead": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", @@ -24672,6 +24146,15 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, + "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/emittery": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", @@ -24880,18 +24363,21 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/react-scripts/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==", - "dev": true - }, "node_modules/react-scripts/node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/react-scripts/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-scripts/node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -24929,24 +24415,23 @@ } }, "node_modules/react-test-renderer": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz", - "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz", + "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", "dev": true, "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^17.0.2", - "react-shallow-renderer": "^16.13.1", - "scheduler": "^0.20.2" + "react-is": "^18.2.0", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.2.0" } }, "node_modules/react-test-renderer/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "node_modules/react-toastify": { @@ -24961,6 +24446,14 @@ "react-dom": ">=16" } }, + "node_modules/react-toastify/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -24985,6 +24478,15 @@ "pify": "^2.3.0" } }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-installed-packages": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/read-installed-packages/-/read-installed-packages-2.0.1.tgz", @@ -25052,19 +24554,19 @@ } }, "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -25141,15 +24643,6 @@ "node": ">=4" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -25160,9 +24653,9 @@ } }, "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==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -25249,15 +24742,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", - "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "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.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.1", + "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" }, @@ -25275,9 +24768,9 @@ "dev": true }, "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.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -25287,15 +24780,14 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -25308,14 +24800,14 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -25325,32 +24817,26 @@ } }, "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, "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==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -25498,6 +24984,15 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", @@ -25549,6 +25044,15 @@ "url": "https://opencollective.com/postcss/" } }, + "node_modules/resolve-url-loader/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve.exports": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", @@ -25691,13 +25195,13 @@ } }, "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==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -25709,9 +25213,24 @@ } }, "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==", + "dev": true, + "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", @@ -25817,18 +25336,17 @@ } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "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.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -25850,11 +25368,12 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -25875,6 +25394,22 @@ "node": ">=10" } }, + "node_modules/semver/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/semver/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/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -25992,6 +25527,40 @@ "node": ">= 0.8.0" } }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -26020,10 +25589,13 @@ } }, "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==", - "dev": true + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/side-channel": { "version": "1.0.4", @@ -26096,10 +25668,9 @@ "dev": true }, "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==", - "dev": true, + "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" } @@ -26131,6 +25702,22 @@ "node": ">=12" } }, + "node_modules/source-map-explorer/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==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map-explorer/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -26180,6 +25767,15 @@ "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -26204,9 +25800,9 @@ } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -26230,9 +25826,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/spdx-ranges": { @@ -26368,6 +25964,107 @@ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dev": true, + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/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==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -26407,26 +26104,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==", - "dev": true, - "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-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -26488,18 +26165,19 @@ "dev": true }, "node_modules/string.prototype.matchall": { - "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==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { @@ -26507,14 +26185,14 @@ } }, "node_modules/string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", + "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -26524,14 +26202,14 @@ } }, "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==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -26541,28 +26219,28 @@ } }, "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -26659,9 +26337,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -26740,6 +26418,57 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "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/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -26822,6 +26551,15 @@ "node": ">=4" } }, + "node_modules/svgo/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/svgo/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -26919,6 +26657,19 @@ "node": ">=4" } }, + "node_modules/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==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/svgo/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -26959,56 +26710,40 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.6.tgz", - "integrity": "sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", "dev": true, "dependencies": { + "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/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==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "node": ">=14.0.0" } }, "node_modules/tapable": { @@ -27113,13 +26848,13 @@ } }, "node_modules/terser": { - "version": "5.16.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", - "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -27131,16 +26866,16 @@ } }, "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.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "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.8" }, "engines": { "node": ">= 10.13.0" @@ -27164,18 +26899,6 @@ } } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -27202,6 +26925,27 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "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": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/throat": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", @@ -27220,14 +26964,9 @@ "integrity": "sha512-knIN5zj4fl7kW4EBU5sLP20DWUvi/rVouvJezV0UAym2DkQaqm365Nyc8F3QEiOvunNDMxR8UhcXd1d5g+Wg1g==" }, "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==" - }, - "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==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "node_modules/tmpl": { "version": "1.0.5", @@ -27307,9 +27046,9 @@ "dev": true }, "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, "engines": { "node": ">=16.13.0" @@ -27331,6 +27070,12 @@ "url": "https://github.com/sponsors/ts-graphviz" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/ts-key-enum": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/ts-key-enum/-/ts-key-enum-2.0.12.tgz", @@ -27370,9 +27115,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -27542,6 +27287,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", @@ -27570,18 +27327,18 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" } }, "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==", "dev": true, "engines": { "node": ">=4" @@ -27606,9 +27363,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -27640,9 +27397,9 @@ } }, "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==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -27652,6 +27409,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -27659,7 +27420,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -27706,13 +27467,18 @@ "dev": true }, "node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "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": { @@ -27743,21 +27509,29 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", "dev": true, "optional": true, "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -27882,22 +27656,22 @@ } }, "node_modules/webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "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", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -27906,9 +27680,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "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" }, @@ -27986,15 +27760,15 @@ "dev": true }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -28005,9 +27779,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -28016,7 +27790,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -28029,6 +27803,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -28038,7 +27813,7 @@ "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -28054,6 +27829,9 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } @@ -28093,33 +27871,16 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -28130,9 +27891,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" @@ -28166,6 +27927,15 @@ "webpack": "^4.44.2 || ^5.47.0" } }, + "node_modules/webpack-manifest-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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", @@ -28188,31 +27958,26 @@ "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==", - "dev": true - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "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==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=8.0.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==", + "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==", "dev": true, - "peerDependencies": { - "acorn": "^8" + "engines": { + "node": ">=4.0" } }, "node_modules/websocket-driver": { @@ -28260,9 +28025,9 @@ } }, "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", "dev": true }, "node_modules/whatwg-mimetype": { @@ -28358,13 +28123,13 @@ } }, "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==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -28377,37 +28142,37 @@ } }, "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/workbox-background-sync": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", - "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", "dev": true, "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-broadcast-update": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", - "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", "dev": true, "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-build": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", - "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", "dev": true, "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", @@ -28432,21 +28197,21 @@ "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.5.4", - "workbox-broadcast-update": "6.5.4", - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-google-analytics": "6.5.4", - "workbox-navigation-preload": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-range-requests": "6.5.4", - "workbox-recipes": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4", - "workbox-streams": "6.5.4", - "workbox-sw": "6.5.4", - "workbox-window": "6.5.4" + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" }, "engines": { "node": ">=10.0.0" @@ -28545,130 +28310,131 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", - "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", "dev": true, "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-core": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", - "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", "dev": true }, "node_modules/workbox-expiration": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", - "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", "dev": true, "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-google-analytics": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", - "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", "dev": true, "dependencies": { - "workbox-background-sync": "6.5.4", - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, "node_modules/workbox-navigation-preload": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", - "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", "dev": true, "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-precaching": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", - "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", "dev": true, "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, "node_modules/workbox-range-requests": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", - "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", "dev": true, "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-recipes": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", - "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", "dev": true, "dependencies": { - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, "node_modules/workbox-routing": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", - "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", "dev": true, "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-strategies": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", - "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", "dev": true, "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/workbox-streams": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", - "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", "dev": true, "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4" + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" } }, "node_modules/workbox-sw": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", - "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", "dev": true }, "node_modules/workbox-webpack-plugin": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz", - "integrity": "sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", "dev": true, "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", "upath": "^1.2.0", "webpack-sources": "^1.4.3", - "workbox-build": "6.5.4" + "workbox-build": "6.6.0" }, "engines": { "node": ">=10.0.0" @@ -28677,6 +28443,15 @@ "webpack": "^4.4.0 || ^5.9.0" } }, + "node_modules/workbox-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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -28688,13 +28463,13 @@ } }, "node_modules/workbox-window": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", - "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", "dev": true, "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.4" + "workbox-core": "6.6.0" } }, "node_modules/wrap-ansi": { @@ -28782,15 +28557,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -28801,9 +28567,10 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yaml": { "version": "1.10.2", @@ -28851,6 +28618,33 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.6.tgz", + "integrity": "sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index ff4b70113d..cf04ce7df3 100644 --- a/package.json +++ b/package.json @@ -40,12 +40,11 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@loadable/component": "^5.15.3", - "@material-table/core": "^6.2.11", + "@material-table/core": "^6.3.0", "@matt-block/react-recaptcha-v2": "^2.0.1", - "@microsoft/signalr": "^6.0.7", + "@microsoft/signalr": "^8.0.0", "@mui/icons-material": "^5.14.11", "@mui/material": "^5.14.16", - "@mui/styles": "^5.14.16", "@redux-devtools/extension": "^3.2.5", "@reduxjs/toolkit": "^1.9.5", "@segment/analytics-next": "^1.55.0", @@ -66,10 +65,10 @@ "notistack": "^3.0.1", "nspell": "^2.1.5", "punycode": "^2.3.0", - "react": "^17.0.2", + "react": "^18.2.0", "react-beautiful-dnd": "^13.1.1", "react-chartjs-2": "^5.2.0", - "react-dom": "^17.0.2", + "react-dom": "^18.2.0", "react-i18next": "^13.3.1", "react-modal": "^3.16.1", "react-redux": "^8.1.3", @@ -84,9 +83,9 @@ "validator": "^13.11.0" }, "devDependencies": { + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@testing-library/jest-dom": "^6.1.4", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "^8.0.0", + "@testing-library/react": "^14.1.0", "@testing-library/user-event": "^14.5.1", "@types/crypto-js": "^4.1.3", "@types/css-mediaquery": "^0.1.2", @@ -94,14 +93,14 @@ "@types/loadable__component": "^5.13.5", "@types/node": "^20.5.1", "@types/nspell": "^2.1.5", - "@types/react": "^17.0.34", + "@types/react": "^18.2.37", "@types/react-beautiful-dnd": "^13.1.4", - "@types/react-dom": "^17.0.11", + "@types/react-dom": "^18.2.15", "@types/react-modal": "^3.16.0", - "@types/react-test-renderer": "^17.0.0", + "@types/react-test-renderer": "^18.0.6", "@types/recordrtc": "^5.6.12", "@types/redux-mock-store": "^1.0.4", - "@types/segment-analytics": "^0.0.34", + "@types/segment-analytics": "^0.0.37", "@types/uuid": "^9.0.4", "@types/validator": "^13.11.1", "@typescript-eslint/eslint-plugin": "^6.7.2", @@ -120,10 +119,10 @@ "npm-run-all": "^4.1.5", "prettier": "^3.0.3", "react-scripts": "^5.0.1", - "react-test-renderer": "^17.0.1", + "react-test-renderer": "^18.2.0", "redux-mock-store": "^1.5.4", "source-map-explorer": "^2.5.3", - "typescript": "4.9.5" + "typescript": "^4.9.5" }, "jest": { "coverageReporters": [ diff --git a/src/components/DataEntry/DataEntryTable/EntryCellComponents/GlossWithSuggestions.tsx b/src/components/DataEntry/DataEntryTable/EntryCellComponents/GlossWithSuggestions.tsx index 490aa1aa25..34c81b5b63 100644 --- a/src/components/DataEntry/DataEntryTable/EntryCellComponents/GlossWithSuggestions.tsx +++ b/src/components/DataEntry/DataEntryTable/EntryCellComponents/GlossWithSuggestions.tsx @@ -67,13 +67,13 @@ export default function GlossWithSuggestions( }} renderInput={(params) => ( )} renderOption={(liProps, option, { selected }) => ( diff --git a/src/components/DataEntry/DataEntryTable/EntryCellComponents/VernWithSuggestions.tsx b/src/components/DataEntry/DataEntryTable/EntryCellComponents/VernWithSuggestions.tsx index 499240921d..3372045020 100644 --- a/src/components/DataEntry/DataEntryTable/EntryCellComponents/VernWithSuggestions.tsx +++ b/src/components/DataEntry/DataEntryTable/EntryCellComponents/VernWithSuggestions.tsx @@ -57,11 +57,11 @@ export default function VernWithSuggestions( onClose={props.onClose} renderInput={(params) => ( )} diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/StyledMenuItem.ts b/src/components/DataEntry/DataEntryTable/NewEntry/StyledMenuItem.ts index 2cb3895f4f..706d038a8d 100644 --- a/src/components/DataEntry/DataEntryTable/NewEntry/StyledMenuItem.ts +++ b/src/components/DataEntry/DataEntryTable/NewEntry/StyledMenuItem.ts @@ -1,19 +1,17 @@ import { MenuItem } from "@mui/material"; -import { withStyles } from "@mui/styles"; +import { styled } from "@mui/system"; -// Copied from customized menus at https://material-ui.com/components/menus/ -const StyledMenuItem = withStyles((theme) => ({ - root: { - border: "1px solid gray", - borderRadius: "8px", - marginTop: "8px", - "&:focus": { - backgroundColor: theme.palette.primary.main, - "& .MuiListItemIcon-root, & .MuiListItemText-primary": { - color: theme.palette.common.white, - }, +// https://mui.com/system/styled/#using-the-theme +const StyledMenuItem = styled(MenuItem)(({ theme }) => ({ + border: "1px solid gray", + borderRadius: "8px", + marginTop: "8px", + "&:focus": { + backgroundColor: theme.palette.primary.main, + "& .MuiListItemIcon-root, & .MuiListItemText-primary": { + color: theme.palette.common.white, }, }, -}))(MenuItem); +})); export default StyledMenuItem; diff --git a/src/components/DataEntry/DataEntryTable/index.tsx b/src/components/DataEntry/DataEntryTable/index.tsx index 607c3bde3f..8c44cfac8a 100644 --- a/src/components/DataEntry/DataEntryTable/index.tsx +++ b/src/components/DataEntry/DataEntryTable/index.tsx @@ -408,8 +408,8 @@ export default function DataEntryTable( selectedDup: id ? prev.suggestedDups.find((w) => w.id === id) : id === "" - ? newWord(prev.newVern) - : undefined, + ? newWord(prev.newVern) + : undefined, })); }; diff --git a/src/components/DataEntry/DataEntryTable/tests/RecentEntry.test.tsx b/src/components/DataEntry/DataEntryTable/tests/RecentEntry.test.tsx index 43772b8622..72220ee85f 100644 --- a/src/components/DataEntry/DataEntryTable/tests/RecentEntry.test.tsx +++ b/src/components/DataEntry/DataEntryTable/tests/RecentEntry.test.tsx @@ -105,7 +105,7 @@ describe("ExistingEntry", () => { } await updateVernAndBlur(mockVern); - expect(mockUpdateVern).toBeCalledTimes(0); + expect(mockUpdateVern).toHaveBeenCalledTimes(0); await updateVernAndBlur(mockText); expect(mockUpdateVern).toBeCalledWith(0, mockText); }); @@ -123,7 +123,7 @@ describe("ExistingEntry", () => { } await updateGlossAndBlur(mockGloss); - expect(mockUpdateGloss).toBeCalledTimes(0); + expect(mockUpdateGloss).toHaveBeenCalledTimes(0); await updateGlossAndBlur(mockText); expect(mockUpdateGloss).toBeCalledWith(0, mockText); }); diff --git a/src/components/DataEntry/DataEntryTable/tests/index.test.tsx b/src/components/DataEntry/DataEntryTable/tests/index.test.tsx index 5ea0c26f3e..4c0a883384 100644 --- a/src/components/DataEntry/DataEntryTable/tests/index.test.tsx +++ b/src/components/DataEntry/DataEntryTable/tests/index.test.tsx @@ -134,7 +134,7 @@ describe("DataEntryTable", () => { beforeEach(async () => await renderTable()); it("gets frontier word", () => { - expect(mockGetFrontierWords).toBeCalledTimes(1); + expect(mockGetFrontierWords).toHaveBeenCalledTimes(1); }); }); @@ -142,21 +142,21 @@ describe("DataEntryTable", () => { beforeEach(async () => await renderTable()); it("hides questions", async () => { - expect(mockHideQuestions).not.toBeCalled(); + expect(mockHideQuestions).not.toHaveBeenCalled(); testHandle = testRenderer.root.findByProps({ id: exitButtonId }); await act(async () => await testHandle.props.onClick()); - expect(mockHideQuestions).toBeCalled(); + expect(mockHideQuestions).toHaveBeenCalled(); }); it("creates word when new entry has vernacular", async () => { - expect(mockCreateWord).not.toBeCalled(); + expect(mockCreateWord).not.toHaveBeenCalled(); testHandle = testRenderer.root.findByType(NewEntry); expect(testHandle).not.toBeNull; // Set newVern but not newGloss. await act(async () => testHandle.props.setNewVern("hasVern")); testHandle = testRenderer.root.findByProps({ id: exitButtonId }); await act(async () => await testHandle.props.onClick()); - expect(mockCreateWord).toBeCalledTimes(1); + expect(mockCreateWord).toHaveBeenCalledTimes(1); }); it("doesn't create word when new entry has no vernacular", async () => { @@ -166,14 +166,14 @@ describe("DataEntryTable", () => { await act(async () => testHandle.props.setNewGloss("hasGloss")); testHandle = testRenderer.root.findByProps({ id: exitButtonId }); await act(async () => await testHandle.props.onClick()); - expect(mockCreateWord).not.toBeCalled(); + expect(mockCreateWord).not.toHaveBeenCalled(); }); it("opens the domain tree", async () => { - expect(mockOpenTree).not.toBeCalled(); + expect(mockOpenTree).not.toHaveBeenCalled(); testHandle = testRenderer.root.findByProps({ id: exitButtonId }); await act(async () => await testHandle.props.onClick()); - expect(mockOpenTree).toBeCalledTimes(1); + expect(mockOpenTree).toHaveBeenCalledTimes(1); }); }); @@ -301,7 +301,7 @@ describe("DataEntryTable", () => { await testHandle.props.setNewGloss(firstGlossText(word.senses[0])); await testHandle.props.updateWordWithNewGloss(word.id); }); - expect(mockUpdateWord).not.toBeCalled(); + expect(mockUpdateWord).not.toHaveBeenCalled(); }); it("updates word in backend if gloss exists with different semantic domain", async () => { @@ -320,7 +320,7 @@ describe("DataEntryTable", () => { await testHandle.props.setNewGloss(glossText); await testHandle.props.updateWordWithNewGloss(word.id); }); - expect(mockUpdateWord).toBeCalledTimes(1); + expect(mockUpdateWord).toHaveBeenCalledTimes(1); // Confirm the semantic domain was added. const wordUpdated: Word = mockUpdateWord.mock.calls[0][0]; @@ -338,7 +338,7 @@ describe("DataEntryTable", () => { await testHandle.props.setNewGloss("differentGloss"); await testHandle.props.updateWordWithNewGloss(mockMultiWord.id); }); - expect(mockUpdateWord).toBeCalledTimes(1); + expect(mockUpdateWord).toHaveBeenCalledTimes(1); }); }); @@ -351,8 +351,8 @@ describe("DataEntryTable", () => { await act(async () => { await testHandle.props.addNewEntry(); }); - expect(mockUpdateDuplicate).toBeCalledTimes(1); - expect(mockCreateWord).not.toBeCalled(); + expect(mockUpdateDuplicate).toHaveBeenCalledTimes(1); + expect(mockCreateWord).not.toHaveBeenCalled(); }); it("adds updated duplicate senses to recent entries", async () => { @@ -403,7 +403,7 @@ describe("DataEntryTable", () => { }); // Verify that createWord() was called with a word with the correct values - expect(mockCreateWord).toBeCalledTimes(1); + expect(mockCreateWord).toHaveBeenCalledTimes(1); const wordAdded: Word = mockCreateWord.mock.calls[0][0]; expect(wordAdded.vernacular).toEqual(vern); expect(wordAdded.senses[0].glosses[0].def).toEqual(glossDef); @@ -449,7 +449,7 @@ describe("DataEntryTable", () => { const senses: Sense[] = recentEntry.props.entry.senses; expect(senses).toHaveLength(1); expect(senses[0].semanticDomains).toHaveLength(1); - expect(mockUpdateWord).toBeCalledTimes(0); + expect(mockUpdateWord).toHaveBeenCalledTimes(0); // Update the vernacular const newVern = "not the vern generated in addRecentEntry"; @@ -458,7 +458,7 @@ describe("DataEntryTable", () => { }); // Confirm the backend update was correctly called - expect(mockUpdateWord).toBeCalledTimes(1); + expect(mockUpdateWord).toHaveBeenCalledTimes(1); const calledWith: Word = mockUpdateWord.mock.calls[0][0]; expect(calledWith.id).toEqual(wordId); expect(calledWith.vernacular).toEqual(newVern); diff --git a/src/components/GoalTimeline/tests/GoalRedux.test.tsx b/src/components/GoalTimeline/tests/GoalRedux.test.tsx index 7803d39800..4e55ad68cd 100644 --- a/src/components/GoalTimeline/tests/GoalRedux.test.tsx +++ b/src/components/GoalTimeline/tests/GoalRedux.test.tsx @@ -143,7 +143,7 @@ describe("asyncGetUserEdits", () => { await store.dispatch(asyncGetUserEdits()); }); expect(store.getState().goalsState.history).toHaveLength(1); - expect(convertEditToGoalSpy).toBeCalledTimes(1); + expect(convertEditToGoalSpy).toHaveBeenCalledTimes(1); }); it("backend returns no user edits", async () => { @@ -163,7 +163,7 @@ describe("asyncGetUserEdits", () => { await store.dispatch(asyncGetUserEdits()); }); expect(store.getState().goalsState.history).toHaveLength(0); - expect(convertEditToGoalSpy).toBeCalledTimes(0); + expect(convertEditToGoalSpy).toHaveBeenCalledTimes(0); }); it("creates new user edits", async () => { @@ -176,7 +176,7 @@ describe("asyncGetUserEdits", () => { await store.dispatch(asyncGetUserEdits()); }); expect(store.getState().goalsState.history).toHaveLength(0); - expect(mockCreateUserEdit).toBeCalledTimes(1); + expect(mockCreateUserEdit).toHaveBeenCalledTimes(1); }); }); @@ -305,7 +305,7 @@ describe("asyncUpdateGoal", () => { }); // verify: // - backend is called to addGoalToUserEdit - expect(mockAddGoalToUserEdit).toBeCalled(); + expect(mockAddGoalToUserEdit).toHaveBeenCalled(); }); it("update MergeDups goal", async () => { @@ -330,7 +330,7 @@ describe("asyncUpdateGoal", () => { .changes as MergesCompleted; expect(changes.merges).toEqual([mockCompletedMerge]); // - backend is called to addGoalToUserEdit - expect(mockAddGoalToUserEdit).toBeCalled(); + expect(mockAddGoalToUserEdit).toHaveBeenCalled(); }); it("update ReviewDeferredDups goal", async () => { @@ -355,6 +355,6 @@ describe("asyncUpdateGoal", () => { .changes as MergesCompleted; expect(changes.merges).toEqual([mockCompletedMerge]); // - backend is called to addGoalToUserEdit - expect(mockAddGoalToUserEdit).toBeCalled(); + expect(mockAddGoalToUserEdit).toHaveBeenCalled(); }); }); diff --git a/src/components/GoalTimeline/tests/index.test.tsx b/src/components/GoalTimeline/tests/index.test.tsx index 859e3010a1..e77d66a419 100644 --- a/src/components/GoalTimeline/tests/index.test.tsx +++ b/src/components/GoalTimeline/tests/index.test.tsx @@ -75,7 +75,7 @@ describe("GoalTimeline", () => { id: `new-goal-${allGoals[goalNumber].name}`, }); await renderer.act(async () => goalButton.props.onClick()); - expect(mockChooseGoal).toBeCalledTimes(1); + expect(mockChooseGoal).toHaveBeenCalledTimes(1); expect(mockChooseGoal.mock.calls[0][0].goalType).toEqual( defaultState.allGoalTypes[goalNumber] ); diff --git a/src/components/Login/Redux/tests/LoginActions.test.tsx b/src/components/Login/Redux/tests/LoginActions.test.tsx index 65c90d4e08..dde5be13b6 100644 --- a/src/components/Login/Redux/tests/LoginActions.test.tsx +++ b/src/components/Login/Redux/tests/LoginActions.test.tsx @@ -69,7 +69,7 @@ describe("LoginAction", () => { // A failed signup does not trigger a login. jest.runAllTimers(); - expect(mockAuthenticateUser).not.toBeCalled(); + expect(mockAuthenticateUser).not.toHaveBeenCalled(); }); it("correctly affects state on success", async () => { @@ -87,7 +87,7 @@ describe("LoginAction", () => { // A successful signup triggers a login using `setTimeout`. mockAuthenticateUser.mockRejectedValueOnce({}); jest.runAllTimers(); - expect(mockAuthenticateUser).toBeCalledTimes(1); + expect(mockAuthenticateUser).toHaveBeenCalledTimes(1); }); }); }); diff --git a/src/components/PasswordReset/tests/Request.test.tsx b/src/components/PasswordReset/tests/Request.test.tsx index 174cce98c3..b9bd9dee7f 100644 --- a/src/components/PasswordReset/tests/Request.test.tsx +++ b/src/components/PasswordReset/tests/Request.test.tsx @@ -44,11 +44,9 @@ describe("ResetRequest", () => { const button = screen.getByRole("button"); expect(button).toBeDisabled(); - // Act + // Agent const field = screen.getByTestId(PasswordRequestIds.FieldEmailOrUsername); - await act(async () => { - await agent.type(field, "a"); - }); + await agent.type(field, "a"); // After expect(button).toBeEnabled(); @@ -64,12 +62,10 @@ describe("ResetRequest", () => { expect(screen.queryAllByRole("button")).toHaveLength(1); expect(screen.queryByTestId(PasswordRequestIds.ButtonLogin)).toBeNull(); - // Act + // Agent const field = screen.getByTestId(PasswordRequestIds.FieldEmailOrUsername); - await act(async () => { - await agent.type(field, "a"); - await agent.click(screen.getByRole("button")); - }); + await agent.type(field, "a"); + await agent.click(screen.getByRole("button")); // After expect(screen.queryAllByRole("textbox")).toHaveLength(0); diff --git a/src/components/PasswordReset/tests/ResetPage.test.tsx b/src/components/PasswordReset/tests/ResetPage.test.tsx index fc92e2ac4a..85468addb8 100644 --- a/src/components/PasswordReset/tests/ResetPage.test.tsx +++ b/src/components/PasswordReset/tests/ResetPage.test.tsx @@ -76,10 +76,8 @@ describe("PasswordReset", () => { PasswordResetTestIds.ConfirmPassword ); - await act(async () => { - await user.type(passwdField, shortPassword); - await user.type(passwdConfirm, shortPassword); - }); + await user.type(passwdField, shortPassword); + await user.type(passwdConfirm, shortPassword); const reqErrors = screen.queryAllByTestId( PasswordResetTestIds.PasswordReqError @@ -105,10 +103,8 @@ describe("PasswordReset", () => { PasswordResetTestIds.ConfirmPassword ); - await act(async () => { - await user.type(passwdField, passwordEntry); - await user.type(passwdConfirm, confirmEntry); - }); + await user.type(passwdField, passwordEntry); + await user.type(passwdConfirm, confirmEntry); const reqErrors = screen.queryAllByTestId( PasswordResetTestIds.PasswordReqError @@ -134,10 +130,8 @@ describe("PasswordReset", () => { PasswordResetTestIds.ConfirmPassword ); - await act(async () => { - await user.type(passwdField, passwordEntry); - await user.type(passwdConfirm, confirmEntry); - }); + await user.type(passwdField, passwordEntry); + await user.type(passwdConfirm, confirmEntry); const reqErrors = screen.queryAllByTestId( PasswordResetTestIds.PasswordReqError @@ -164,16 +158,12 @@ describe("PasswordReset", () => { PasswordResetTestIds.ConfirmPassword ); - await act(async () => { - await user.type(passwdField, passwordEntry); - await user.type(passwdConfirm, confirmEntry); - }); + await user.type(passwdField, passwordEntry); + await user.type(passwdConfirm, confirmEntry); const submitButton = screen.getByTestId(PasswordResetTestIds.SubmitButton); mockPasswordReset.mockResolvedValueOnce(false); - await act(async () => { - await user.click(submitButton); - }); + await user.click(submitButton); const resetErrors = screen.queryAllByTestId( PasswordResetTestIds.PasswordResetFail diff --git a/src/components/Project/tests/ProjectActions.test.tsx b/src/components/Project/tests/ProjectActions.test.tsx index b8fbd72593..3c90e586d2 100644 --- a/src/components/Project/tests/ProjectActions.test.tsx +++ b/src/components/Project/tests/ProjectActions.test.tsx @@ -37,7 +37,7 @@ describe("ProjectActions", () => { }); const id = "new-id"; await store.dispatch(asyncUpdateCurrentProject({ ...proj, id })); - expect(mockUpdateProject).toBeCalledTimes(1); + expect(mockUpdateProject).toHaveBeenCalledTimes(1); const { project, users } = store.getState().currentProjectState; expect(project.id).toEqual(id); expect(users).toHaveLength(0); @@ -51,7 +51,7 @@ describe("ProjectActions", () => { }); const name = "new-name"; await store.dispatch(asyncUpdateCurrentProject({ ...proj, name })); - expect(mockUpdateProject).toBeCalledTimes(1); + expect(mockUpdateProject).toHaveBeenCalledTimes(1); const { project, users } = store.getState().currentProjectState; expect(project.name).toEqual(name); expect(users).toHaveLength(1); @@ -96,7 +96,7 @@ describe("ProjectActions", () => { const proj: Project = { ...newProject(), id: mockProjId }; const store = setupStore(); store.dispatch(setNewCurrentProject(proj)); - expect(mockUpdateProject).not.toBeCalled(); + expect(mockUpdateProject).not.toHaveBeenCalled(); const { project } = store.getState().currentProjectState; expect(project.id).toEqual(mockProjId); }); diff --git a/src/components/ProjectExport/DownloadButton.tsx b/src/components/ProjectExport/DownloadButton.tsx index 44eda6c56e..c929631eb6 100644 --- a/src/components/ProjectExport/DownloadButton.tsx +++ b/src/components/ProjectExport/DownloadButton.tsx @@ -61,7 +61,7 @@ export default function DownloadButton( }, [downloadLink, fileUrl]); useEffect(() => { - if (fileName) { + if (fileName && exportState.projectId) { dispatch(asyncDownloadExport(exportState.projectId)).then((url) => { if (url) { setFileUrl(url); @@ -116,8 +116,8 @@ export default function DownloadButton( return exportState.status === ExportStatus.Failure ? themeColors.error : props.colorSecondary - ? themeColors.secondary - : themeColors.primary; + ? themeColors.secondary + : themeColors.primary; } function iconFunction(): () => void { diff --git a/src/components/ProjectScreen/tests/index.test.tsx b/src/components/ProjectScreen/tests/index.test.tsx index dd5f0c098e..4e718bee8c 100644 --- a/src/components/ProjectScreen/tests/index.test.tsx +++ b/src/components/ProjectScreen/tests/index.test.tsx @@ -14,5 +14,5 @@ it("renders without crashing", () => { renderer.act(() => { renderer.create(); }); - expect(mockDispatch).toBeCalledTimes(2); + expect(mockDispatch).toHaveBeenCalledTimes(2); }); diff --git a/src/components/ProjectSettings/tests/ProjectName.test.tsx b/src/components/ProjectSettings/tests/ProjectName.test.tsx index c72742713b..bf2fe3a1cb 100644 --- a/src/components/ProjectSettings/tests/ProjectName.test.tsx +++ b/src/components/ProjectSettings/tests/ProjectName.test.tsx @@ -48,8 +48,8 @@ describe("ProjectName", () => { textField.props.onChange({ target: { value: "new-name" } }) ); mockUpdateProject.mockRejectedValueOnce({}); - expect(mockToastError).not.toBeCalled(); + expect(mockToastError).not.toHaveBeenCalled(); await renderer.act(async () => saveButton.props.onClick()); - expect(mockToastError).toBeCalledTimes(1); + expect(mockToastError).toHaveBeenCalledTimes(1); }); }); diff --git a/src/components/ProjectUsers/tests/EmailInvite.test.tsx b/src/components/ProjectUsers/tests/EmailInvite.test.tsx index d6914de656..fabbed09a6 100644 --- a/src/components/ProjectUsers/tests/EmailInvite.test.tsx +++ b/src/components/ProjectUsers/tests/EmailInvite.test.tsx @@ -37,7 +37,7 @@ describe("EmailInvite", () => { .findByType(LoadingDoneButton) .props.buttonProps.onClick(); }); - expect(mockClose).toBeCalledTimes(1); + expect(mockClose).toHaveBeenCalledTimes(1); }); it("adds user if already exists", async () => { @@ -47,8 +47,8 @@ describe("EmailInvite", () => { .findByType(LoadingDoneButton) .props.buttonProps.onClick(); }); - expect(mockAddToProject).toBeCalledTimes(1); - expect(mockEmailInviteToProject).not.toBeCalled(); + expect(mockAddToProject).toHaveBeenCalledTimes(1); + expect(mockEmailInviteToProject).not.toHaveBeenCalled(); }); it("invite user if doesn't exists", async () => { @@ -58,7 +58,7 @@ describe("EmailInvite", () => { .findByType(LoadingDoneButton) .props.buttonProps.onClick(); }); - expect(mockAddToProject).not.toBeCalled(); - expect(mockEmailInviteToProject).toBeCalledTimes(1); + expect(mockAddToProject).not.toHaveBeenCalled(); + expect(mockEmailInviteToProject).toHaveBeenCalledTimes(1); }); }); diff --git a/src/components/ProjectUsers/tests/SortOptions.test.tsx b/src/components/ProjectUsers/tests/SortOptions.test.tsx index e78142fb1c..2ca50cf237 100644 --- a/src/components/ProjectUsers/tests/SortOptions.test.tsx +++ b/src/components/ProjectUsers/tests/SortOptions.test.tsx @@ -38,6 +38,6 @@ describe("SortOptions", () => { const button = testRenderer.root.findByProps({ id: reverseButtonId }); expect(button).not.toBeNull(); button.props.onClick(); - expect(mockReverse).toBeCalledTimes(1); + expect(mockReverse).toHaveBeenCalledTimes(1); }); }); diff --git a/src/components/Pronunciations/AudioPlayer.tsx b/src/components/Pronunciations/AudioPlayer.tsx index b68d8a7b0b..a2a0dcbc99 100644 --- a/src/components/Pronunciations/AudioPlayer.tsx +++ b/src/components/Pronunciations/AudioPlayer.tsx @@ -1,14 +1,12 @@ import { Delete, PlayArrow, Stop } from "@mui/icons-material"; +import { Fade, IconButton, Menu, MenuItem, Tooltip } from "@mui/material"; import { - Fade, - IconButton, - Menu, - MenuItem, - Theme, - Tooltip, -} from "@mui/material"; -import { createStyles, makeStyles } from "@mui/styles"; -import { ReactElement, useCallback, useEffect, useState } from "react"; + CSSProperties, + ReactElement, + useCallback, + useEffect, + useState, +} from "react"; import { useTranslation } from "react-i18next"; import { ButtonConfirmation } from "components/Dialogs"; @@ -29,12 +27,7 @@ interface PlayerProps { pronunciationUrl: string; } -const useStyles = makeStyles((theme: Theme) => - createStyles({ - button: { marginRight: theme.spacing(1) }, - icon: { color: themeColors.success }, - }) -); +const iconStyle: CSSProperties = { color: themeColors.success }; export default function AudioPlayer(props: PlayerProps): ReactElement { const isPlaying = useAppSelector( @@ -47,7 +40,6 @@ export default function AudioPlayer(props: PlayerProps): ReactElement { const [anchor, setAnchor] = useState(); const [deleteConf, setDeleteConf] = useState(false); - const classes = useStyles(); const dispatch = useAppDispatch(); const dispatchReset = useCallback( () => dispatch(resetPronunciations()), @@ -112,16 +104,11 @@ export default function AudioPlayer(props: PlayerProps): ReactElement { onClick={deleteOrTogglePlay} onTouchStart={handleTouch} onTouchEnd={enableContextMenu} - className={classes.button} aria-label="play" id={`audio-${props.fileName}`} size="large" > - {isPlaying ? ( - - ) : ( - - )} + {isPlaying ? : } - {isPlaying ? ( - - ) : ( - - )} + {isPlaying ? : } ({ - button: { marginRight: theme.spacing(1) }, - iconPress: { color: themeColors.recordActive }, - iconRelease: { color: themeColors.recordIdle }, - })); - - const classes = useStyles(); - function toggleIsRecordingToTrue(): void { dispatch(recording(props.wordId)); props.startRecording(); @@ -70,7 +61,6 @@ export default function RecorderIcon(props: RecorderIconProps): ReactElement { diff --git a/src/components/Pronunciations/tests/AudioRecorder.test.tsx b/src/components/Pronunciations/tests/AudioRecorder.test.tsx index 4d59607eb1..2f1cc3e2e9 100644 --- a/src/components/Pronunciations/tests/AudioRecorder.test.tsx +++ b/src/components/Pronunciations/tests/AudioRecorder.test.tsx @@ -15,7 +15,7 @@ import { PronunciationsStatus, } from "components/Pronunciations/Redux/PronunciationsReduxTypes"; import { StoreState } from "types"; -import theme from "types/theme"; +import theme, { themeColors } from "types/theme"; jest.mock("components/Pronunciations/Recorder"); @@ -67,16 +67,16 @@ describe("Pronunciations", () => { ); }); - expect(mockStartRecording).not.toBeCalled(); + expect(mockStartRecording).not.toHaveBeenCalled(); testRenderer.root.findByProps({ id: recordButtonId }).props.onPointerDown(); - expect(mockStartRecording).toBeCalled(); + expect(mockStartRecording).toHaveBeenCalled(); - expect(mockStopRecording).not.toBeCalled(); + expect(mockStopRecording).not.toHaveBeenCalled(); testRenderer.root.findByProps({ id: recordButtonId }).props.onPointerUp(); - expect(mockStopRecording).toBeCalled(); + expect(mockStopRecording).toHaveBeenCalled(); }); - test("default style is iconRelease", () => { + test("default style is idle", () => { act(() => { testRenderer = create( @@ -89,7 +89,7 @@ describe("Pronunciations", () => { ); }); const icon = testRenderer.root.findByProps({ id: recordIconId }); - expect(icon.props.className.includes("iconRelease")).toBeTruthy(); + expect(icon.props.sx.color).toEqual(themeColors.recordIdle); }); test("style depends on pronunciations state", () => { @@ -107,6 +107,6 @@ describe("Pronunciations", () => { ); }); const icon = testRenderer.root.findByProps({ id: recordIconId }); - expect(icon.props.className.includes("iconPress")).toBeTruthy(); + expect(icon.props.sx.color).toEqual(themeColors.recordActive); }); }); diff --git a/src/components/SiteSettings/UserManagement/UserList.tsx b/src/components/SiteSettings/UserManagement/UserList.tsx index e318d76cc1..eb80301c37 100644 --- a/src/components/SiteSettings/UserManagement/UserList.tsx +++ b/src/components/SiteSettings/UserManagement/UserList.tsx @@ -2,7 +2,6 @@ import { DeleteForever, VpnKey } from "@mui/icons-material"; import { Avatar, Button, - ButtonProps, Grid, Input, List, @@ -69,7 +68,7 @@ export default function UserList(props: UserListProps): ReactElement { ); }, [filterInput, props.allUsers]); - const userListButton = (user: User): ButtonProps => { + const userListButton = (user: User): ReactElement => { const disabled = user.isAdmin || user.id === getUserId(); return ( + setUndoDialogOpen(false)} + handleConfirm={() => + props.undo().then(() => setUndoDialogOpen(false)) + } + buttonIdCancel={props.buttonIdCancel} + buttonIdConfirm={props.buttonIdConfirm} + /> + + ) : ( +
+ +
+ )} + + ); +} diff --git a/src/components/Buttons/index.ts b/src/components/Buttons/index.ts index a5135428ee..3889259e5f 100644 --- a/src/components/Buttons/index.ts +++ b/src/components/Buttons/index.ts @@ -4,6 +4,7 @@ import IconButtonWithTooltip from "components/Buttons/IconButtonWithTooltip"; import LoadingButton from "components/Buttons/LoadingButton"; import LoadingDoneButton from "components/Buttons/LoadingDoneButton"; import PartOfSpeechButton from "components/Buttons/PartOfSpeechButton"; +import UndoButton from "components/Buttons/UndoButton"; export { FileInputButton, @@ -12,4 +13,5 @@ export { LoadingButton, LoadingDoneButton, PartOfSpeechButton, + UndoButton, }; diff --git a/src/components/DataEntry/DataEntryTable/EntryCellComponents/EntryNote.tsx b/src/components/DataEntry/DataEntryTable/EntryCellComponents/EntryNote.tsx index 142a48e4d1..b23fdadb9e 100644 --- a/src/components/DataEntry/DataEntryTable/EntryCellComponents/EntryNote.tsx +++ b/src/components/DataEntry/DataEntryTable/EntryCellComponents/EntryNote.tsx @@ -7,8 +7,8 @@ import { EditTextDialog } from "components/Dialogs"; interface EntryNoteProps { noteText: string; - updateNote: (newText: string) => void | Promise; - buttonId: string; + buttonId?: string; + updateNote?: (newText: string) => void | Promise; } /** @@ -18,17 +18,19 @@ export default function EntryNote(props: EntryNoteProps): ReactElement { const [noteOpen, setNoteOpen] = useState(false); const { t } = useTranslation(); + const handleClick = (): void => { + if (props.updateNote) { + setNoteOpen(true); + } + }; + return ( <> - setNoteOpen(true)} - id={props.buttonId} - > + {props.noteText ? : } @@ -37,7 +39,7 @@ export default function EntryNote(props: EntryNoteProps): ReactElement { text={props.noteText} titleId={"addWords.addNote"} close={() => setNoteOpen(false)} - updateText={props.updateNote} + updateText={props.updateNote ?? (() => {})} buttonIdCancel="note-edit-cancel" buttonIdConfirm="note-edit-confirm" textFieldId="note-text-field" diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/SenseDialog.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/SenseDialog.tsx index 14df7766a1..dd800185ec 100644 --- a/src/components/DataEntry/DataEntryTable/NewEntry/SenseDialog.tsx +++ b/src/components/DataEntry/DataEntryTable/NewEntry/SenseDialog.tsx @@ -15,8 +15,8 @@ import StyledMenuItem from "components/DataEntry/DataEntryTable/NewEntry/StyledM import { DomainCell, PartOfSpeechCell, -} from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents"; -import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTable/CellComponents"; +import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesTypes"; import { firstGlossText } from "utilities/wordUtilities"; interface SenseDialogProps { diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/VernDialog.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/VernDialog.tsx index b489398dff..3baa246109 100644 --- a/src/components/DataEntry/DataEntryTable/NewEntry/VernDialog.tsx +++ b/src/components/DataEntry/DataEntryTable/NewEntry/VernDialog.tsx @@ -16,8 +16,8 @@ import { DomainCell, GlossCell, PartOfSpeechCell, -} from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents"; -import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTable/CellComponents"; +import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesTypes"; interface vernDialogProps { vernacularWords: Word[]; diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/tests/SenseDialog.test.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/tests/SenseDialog.test.tsx index 88e6cc85b0..4451a9fc20 100644 --- a/src/components/DataEntry/DataEntryTable/NewEntry/tests/SenseDialog.test.tsx +++ b/src/components/DataEntry/DataEntryTable/NewEntry/tests/SenseDialog.test.tsx @@ -16,7 +16,7 @@ import { defaultWritingSystem } from "types/writingSystem"; // MUI: Unable to set focus to a MenuItem whose component has not been rendered. jest.mock("@mui/material/MenuItem", () => "div"); -jest.mock("goals/ReviewEntries/ReviewEntriesComponent/CellComponents", () => ({ +jest.mock("goals/ReviewEntries/ReviewEntriesTable/CellComponents", () => ({ DomainCell: () =>
, PartOfSpeechCell: () =>
, })); diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/tests/VernDialog.test.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/tests/VernDialog.test.tsx index d52584e437..51eb3cb09c 100644 --- a/src/components/DataEntry/DataEntryTable/NewEntry/tests/VernDialog.test.tsx +++ b/src/components/DataEntry/DataEntryTable/NewEntry/tests/VernDialog.test.tsx @@ -16,7 +16,7 @@ import { defaultWritingSystem } from "types/writingSystem"; // MUI: Unable to set focus to a MenuItem whose component has not been rendered. jest.mock("@mui/material/MenuItem", () => "div"); -jest.mock("goals/ReviewEntries/ReviewEntriesComponent/CellComponents", () => ({ +jest.mock("goals/ReviewEntries/ReviewEntriesTable/CellComponents", () => ({ DomainCell: () =>
, GlossCell: () =>
, PartOfSpeechCell: () =>
, diff --git a/src/components/GoalTimeline/GoalList.tsx b/src/components/GoalTimeline/GoalList.tsx index d576bab38b..6817aef2a5 100644 --- a/src/components/GoalTimeline/GoalList.tsx +++ b/src/components/GoalTimeline/GoalList.tsx @@ -12,6 +12,8 @@ import { CharInvChangesGoalList } from "goals/CharacterInventory/CharInvComplete import { CharInvChanges } from "goals/CharacterInventory/CharacterInventoryTypes"; import { MergesCount } from "goals/MergeDuplicates/MergeDupsCompleted"; import { MergesCompleted } from "goals/MergeDuplicates/MergeDupsTypes"; +import { EditsCount } from "goals/ReviewEntries/ReviewEntriesCompleted"; +import { EntriesEdited } from "goals/ReviewEntries/ReviewEntriesTypes"; import { Goal, GoalStatus, GoalType } from "types/goals"; type Orientation = "horizontal" | "vertical"; @@ -120,7 +122,8 @@ function GoalTile(props: GoalTileProps): ReactElement { (goal.status === GoalStatus.Completed && goal.goalType !== GoalType.CreateCharInv && goal.goalType !== GoalType.MergeDups && - goal.goalType !== GoalType.ReviewDeferredDups) + goal.goalType !== GoalType.ReviewDeferredDups && + goal.goalType !== GoalType.ReviewEntries) } data-testid="goal-button" > @@ -161,6 +164,8 @@ function getCompletedGoalInfo(goal: Goal): ReactElement { case GoalType.MergeDups: case GoalType.ReviewDeferredDups: return MergesCount(goal.changes as MergesCompleted); + case GoalType.ReviewEntries: + return EditsCount(goal.changes as EntriesEdited); default: return ; } diff --git a/src/components/GoalTimeline/Redux/GoalActions.ts b/src/components/GoalTimeline/Redux/GoalActions.ts index 66db597cc0..5d9cc898e4 100644 --- a/src/components/GoalTimeline/Redux/GoalActions.ts +++ b/src/components/GoalTimeline/Redux/GoalActions.ts @@ -8,6 +8,7 @@ import router from "browserRouter"; import { addCharInvChangesToGoalAction, addCompletedMergeToGoalAction, + addEntryEditToGoalAction, incrementGoalStepAction, loadUserEditsAction, setCurrentGoalAction, @@ -17,6 +18,7 @@ import { } from "components/GoalTimeline/Redux/GoalReducer"; import { CharacterChange } from "goals/CharacterInventory/CharacterInventoryTypes"; import { dispatchMergeStepData } from "goals/MergeDuplicates/Redux/MergeDupsActions"; +import { EntryEdit } from "goals/ReviewEntries/ReviewEntriesTypes"; import { StoreState } from "types"; import { StoreStateDispatch } from "types/Redux/actions"; import { Goal, GoalStatus, GoalType } from "types/goals"; @@ -31,6 +33,10 @@ export function addCharInvChangesToGoal( return addCharInvChangesToGoalAction(charChanges); } +export function addEntryEditToGoal(entryEdit: EntryEdit): PayloadAction { + return addEntryEditToGoalAction(entryEdit); +} + export function addCompletedMergeToGoal(changes: MergeUndoIds): PayloadAction { return addCompletedMergeToGoalAction(changes); } diff --git a/src/components/GoalTimeline/Redux/GoalReducer.ts b/src/components/GoalTimeline/Redux/GoalReducer.ts index 2632f2f400..a54b8b3141 100644 --- a/src/components/GoalTimeline/Redux/GoalReducer.ts +++ b/src/components/GoalTimeline/Redux/GoalReducer.ts @@ -5,6 +5,10 @@ import { MergeDupsData, MergesCompleted, } from "goals/MergeDuplicates/MergeDupsTypes"; +import { + EntriesEdited, + EntryEdit, +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { StoreActionTypes } from "rootActions"; import { GoalType } from "types/goals"; @@ -30,6 +34,24 @@ const goalSlice = createSlice({ state.currentGoal.changes = changes; } }, + addEntryEditToGoalAction: (state, action) => { + if (state.currentGoal.goalType === GoalType.ReviewEntries) { + const changes = { ...state.currentGoal.changes } as EntriesEdited; + if (!changes.entryEdits) { + changes.entryEdits = []; + } + const newEdit = action.payload as EntryEdit; + const oldEdit = changes.entryEdits.find( + (e) => e.newId === newEdit.oldId + ); + if (oldEdit) { + oldEdit.newId = newEdit.newId; + } else { + changes.entryEdits.push(newEdit); + } + state.currentGoal.changes = changes; + } + }, incrementGoalStepAction: (state) => { if (state.currentGoal.currentStep + 1 < state.currentGoal.numSteps) { state.currentGoal.currentStep++; @@ -81,6 +103,7 @@ const goalSlice = createSlice({ export const { addCharInvChangesToGoalAction, addCompletedMergeToGoalAction, + addEntryEditToGoalAction, incrementGoalStepAction, loadUserEditsAction, setCurrentGoalAction, diff --git a/src/components/GoalTimeline/tests/GoalRedux.test.tsx b/src/components/GoalTimeline/tests/GoalRedux.test.tsx index 4e55ad68cd..906e4b1438 100644 --- a/src/components/GoalTimeline/tests/GoalRedux.test.tsx +++ b/src/components/GoalTimeline/tests/GoalRedux.test.tsx @@ -46,10 +46,10 @@ jest.mock("backend", () => ({ getUserEditById: (...args: any[]) => mockGetUserEditById(...args), updateUser: (user: User) => mockUpdateUser(user), })); - jest.mock("browserRouter", () => ({ navigate: (path: Path) => mockNavigate(path), })); +jest.mock("components/Pronunciations/Recorder"); const mockAddGoalToUserEdit = jest.fn(); const mockAddStepToGoal = jest.fn(); diff --git a/src/components/GoalTimeline/tests/index.test.tsx b/src/components/GoalTimeline/tests/index.test.tsx index e77d66a419..8ba3017ee0 100644 --- a/src/components/GoalTimeline/tests/index.test.tsx +++ b/src/components/GoalTimeline/tests/index.test.tsx @@ -19,6 +19,7 @@ jest.mock("components/GoalTimeline/Redux/GoalActions", () => ({ asyncAddGoal: (goal: Goal) => mockChooseGoal(goal), asyncGetUserEdits: () => jest.fn(), })); +jest.mock("components/Pronunciations/Recorder"); jest.mock("types/hooks", () => { return { ...jest.requireActual("types/hooks"), diff --git a/src/components/ProjectExport/DownloadButton.tsx b/src/components/ProjectExport/DownloadButton.tsx index c929631eb6..97ee558ba9 100644 --- a/src/components/ProjectExport/DownloadButton.tsx +++ b/src/components/ProjectExport/DownloadButton.tsx @@ -19,10 +19,10 @@ import { ExportStatus } from "components/ProjectExport/Redux/ExportProjectReduxT import { StoreState } from "types"; import { useAppDispatch, useAppSelector } from "types/hooks"; import { themeColors } from "types/theme"; -import { getNowDateTimeString } from "utilities/utilities"; +import { getDateTimeString } from "utilities/utilities"; function makeExportName(projectName: string): string { - return `${projectName}_${getNowDateTimeString()}.zip`; + return `${projectName}_${getDateTimeString()}.zip`; } interface DownloadButtonProps { diff --git a/src/components/WordCard/DomainChip.tsx b/src/components/WordCard/DomainChip.tsx new file mode 100644 index 0000000000..2b954bea07 --- /dev/null +++ b/src/components/WordCard/DomainChip.tsx @@ -0,0 +1,37 @@ +import { Chip } from "@mui/material"; +import { ReactElement, useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { SemanticDomain } from "api/models"; +import { getUser } from "backend"; +import { friendlySep, getDateTimeString } from "utilities/utilities"; + +interface DomainChipProps { + domain: SemanticDomain; + provenance?: boolean; +} + +export default function DomainChip(props: DomainChipProps): ReactElement { + const { provenance } = props; + const { created, name, id, userId } = props.domain; + + const [username, setUsername] = useState(""); + const { t } = useTranslation(); + + useEffect(() => { + if (provenance && userId) { + getUser(userId).then((u) => setUsername(u.username)); + } + }, [provenance, userId]); + + const labelText = `${id}: ${name}`; + const hoverText = []; + if (provenance && created) { + const val = getDateTimeString(created, friendlySep); + hoverText.push(t("wordCard.domainAdded", { val })); + } + if (provenance && username) { + hoverText.push(t("wordCard.user", { val: username })); + } + return ; +} diff --git a/src/components/WordCard/SenseCard.tsx b/src/components/WordCard/SenseCard.tsx new file mode 100644 index 0000000000..088c8a517b --- /dev/null +++ b/src/components/WordCard/SenseCard.tsx @@ -0,0 +1,51 @@ +import { Card, CardContent, Grid } from "@mui/material"; +import { ReactElement } from "react"; + +import { GramCatGroup, Sense } from "api/models"; +import { PartOfSpeechButton } from "components/Buttons"; +import DomainChip from "components/WordCard/DomainChip"; +import SenseCardText from "components/WordCard/SenseCardText"; + +interface SenseCardProps { + languages?: string[]; + minimal?: boolean; + provenance?: boolean; + sense: Sense; +} + +export default function SenseCard(props: SenseCardProps): ReactElement { + const { grammaticalInfo, semanticDomains } = props.sense; + + return ( + + + {/* Part of speech (if any) */} +
+ {grammaticalInfo.catGroup !== GramCatGroup.Unspecified && ( + + )} +
+ + {/* Glosses and (if any) definitions */} + + + {/* Semantic domains */} + + {semanticDomains.map((d) => ( + + + + ))} + +
+
+ ); +} diff --git a/src/components/WordCard/SenseCardText.tsx b/src/components/WordCard/SenseCardText.tsx new file mode 100644 index 0000000000..5b23446f44 --- /dev/null +++ b/src/components/WordCard/SenseCardText.tsx @@ -0,0 +1,122 @@ +import { + Table, + TableBody, + TableCell, + TableRow, + Typography, +} from "@mui/material"; +import { CSSProperties, ReactElement } from "react"; + +import { Sense } from "api/models"; +import theme from "types/theme"; +import { TypographyWithFont } from "utilities/fontComponents"; + +interface SenseInLanguage { + language: string; // bcp-47 code + glossText: string; + definitionText: string; +} + +function getSenseInLanguage( + sense: Sense, + language: string, + displaySep = "; " +): SenseInLanguage { + const glossText = sense.glosses + .filter((g) => g.language === language) + .map((g) => g.def) + .join(displaySep); + const definitionText = sense.definitions + .filter((d) => d.language === language) + .map((d) => d.text) + .join(displaySep); + return { language, glossText, definitionText }; +} + +function getSenseInLanguages( + sense: Sense, + languages?: string[] +): SenseInLanguage[] { + if (!languages) { + languages = sense.glosses.map((g) => g.language); + languages.push(...sense.definitions.map((d) => d.language)); + languages = [...new Set(languages)]; + } + return languages.map((l) => getSenseInLanguage(sense, l)); +} + +interface SenseCardTextProps { + sense: Sense; + hideDefs?: boolean; + languages?: string[]; +} + +// Show glosses and (if not hideDefs) definitions. +export default function SenseCardText(props: SenseCardTextProps): ReactElement { + const senseTextInLangs = getSenseInLanguages(props.sense, props.languages); + + return ( + + + {senseTextInLangs.map((senseInLang, index) => ( + + ))} + +
+ ); +} + +const defStyle: CSSProperties = { + borderLeft: "1px solid black", + marginBottom: theme.spacing(1), + paddingLeft: theme.spacing(1), +}; + +interface SenseTextRowsProps { + senseInLang: SenseInLanguage; + hideDefs?: boolean; +} + +function SenseTextRows(props: SenseTextRowsProps): ReactElement { + const lang = props.senseInLang.language; + return ( + <> + {/* Gloss */} + + + + {lang} + {":"} + + + + + {props.senseInLang.glossText} + + + + + {/* Definition */} + {!!props.senseInLang.definitionText && !props.hideDefs && ( + + + +
+ + {props.senseInLang.definitionText} + +
+
+
+ )} + + ); +} diff --git a/src/components/WordCard/SummarySenseCard.tsx b/src/components/WordCard/SummarySenseCard.tsx new file mode 100644 index 0000000000..202d402d5b --- /dev/null +++ b/src/components/WordCard/SummarySenseCard.tsx @@ -0,0 +1,57 @@ +import { Card, CardContent, Chip, Grid, Typography } from "@mui/material"; +import { ReactElement } from "react"; +import { useTranslation } from "react-i18next"; + +import { GramCatGroup, Sense } from "api/models"; +import { PartOfSpeechButton } from "components/Buttons"; +import { groupGramInfo } from "utilities/wordUtilities"; + +interface SummarySenseCardProps { + senses: Sense[]; +} + +export default function SummarySenseCard( + props: SummarySenseCardProps +): ReactElement { + const { t } = useTranslation(); + + const senseGuids = props.senses.map((s) => s.guid).join("_"); + + const groupedGramInfo = groupGramInfo( + props.senses.map((s) => s.grammaticalInfo) + ).filter((info) => info.catGroup !== GramCatGroup.Unspecified); + + // Create a list of distinct semantic domain ids. + const semDoms = props.senses.flatMap((s) => s.semanticDomains); + const domIds = [...new Set(semDoms.map((d) => d.id))].sort(); + + return ( + + + {/* Parts of speech */} + {groupedGramInfo.map((info) => ( + + ))} + + {/* Sense count */} + + {t("wordCard.senseCount", { val: props.senses.length })} + + + {/* Semantic domain numbers */} + + {domIds.map((id) => ( + + + + ))} + + + + ); +} diff --git a/src/components/WordCard/index.tsx b/src/components/WordCard/index.tsx new file mode 100644 index 0000000000..3131234f9c --- /dev/null +++ b/src/components/WordCard/index.tsx @@ -0,0 +1,148 @@ +import { CloseFullscreen, OpenInFull, PlayArrow } from "@mui/icons-material"; +import { + Badge, + Card, + CardContent, + IconButton, + Typography, +} from "@mui/material"; +import { Fragment, ReactElement, useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { Word } from "api/models"; +import { getUser } from "backend"; +import { FlagButton, IconButtonWithTooltip } from "components/Buttons"; +import { EntryNote } from "components/DataEntry/DataEntryTable/EntryCellComponents"; +import { PronunciationsBackend } from "components/Pronunciations/PronunciationsBackend"; +import SenseCard from "components/WordCard/SenseCard"; +import SummarySenseCard from "components/WordCard/SummarySenseCard"; +import { themeColors } from "types/theme"; +import { TypographyWithFont } from "utilities/fontComponents"; +import { friendlySep, getDateTimeString } from "utilities/utilities"; + +interface WordCardProps { + languages?: string[]; + provenance?: boolean; + word: Word; +} + +export const buttonIdFull = (wordId: string): string => `word-${wordId}-full`; + +export default function WordCard(props: WordCardProps): ReactElement { + const { languages, provenance, word } = props; + const { audio, editedBy, flag, id, note, senses } = word; + const [full, setFull] = useState(false); + const [username, setUsername] = useState(""); + const { t } = useTranslation(); + + useEffect(() => { + if (provenance && editedBy?.length) { + getUser(editedBy[editedBy.length - 1]).then((u) => + setUsername(u.username) + ); + } + }, [editedBy, provenance]); + + return ( + + + {/* Vernacular */} + + {word.vernacular} + + +
+ {/* Condensed audio, note, flag */} + {!full && ( + <> + + {!!note.text && } + {flag.active && } + + )} + {/* Button for expand/condense */} + + ) : ( + + ) + } + onClick={() => setFull(!full)} + /> +
+ + {/* Expanded audio, note, flag */} + {full && ( + <> + {audio.length > 0 && ( + {}} + playerOnly + pronunciationFiles={audio} + wordId={id} + /> + )} + {!!note.text && ( +
+ + {note.text} +
+ )} + {flag.active && ( +
+ + {flag.text} +
+ )} + + )} + + {/* Senses */} + {full ? ( + senses.map((s) => ( + + )) + ) : ( + + )} + + {/* Timestamps */} + {provenance && ( + + {t("wordCard.wordId", { val: id })} +
+ {t("wordCard.wordModified", { + val: getDateTimeString(word.modified, friendlySep), + })} + {!!username && ( + <> +
+ {t("wordCard.user", { val: username })} + + )} +
+ )} +
+
+ ); +} + +export function AudioSummary(props: { count: number }): ReactElement { + return props.count > 0 ? ( + + + + + + ) : ( + + ); +} diff --git a/src/components/WordCard/tests/index.test.tsx b/src/components/WordCard/tests/index.test.tsx new file mode 100644 index 0000000000..6e44038e6a --- /dev/null +++ b/src/components/WordCard/tests/index.test.tsx @@ -0,0 +1,63 @@ +import { ReactTestRenderer, act, create } from "react-test-renderer"; + +import "tests/reactI18nextMock"; + +import { Word } from "api/models"; +import WordCard, { AudioSummary, buttonIdFull } from "components/WordCard"; +import SenseCard from "components/WordCard/SenseCard"; +import SummarySenseCard from "components/WordCard/SummarySenseCard"; +import { newSense, newWord } from "types/word"; + +// Mock the audio components +jest + .spyOn(window.HTMLMediaElement.prototype, "pause") + .mockImplementation(() => {}); +jest.mock("components/Pronunciations/AudioPlayer", () => "div"); +jest.mock("components/Pronunciations/Recorder"); + +const mockWordId = "mock-id"; +const buttonId = buttonIdFull(mockWordId); +const mockWord: Word = { ...newWord(), id: mockWordId }; +mockWord.audio.push("song", "speech", "rap", "poem"); +mockWord.senses.push(newSense(), newSense()); + +let cardHandle: ReactTestRenderer; + +const renderHistoryCell = async (): Promise => { + await act(async () => { + cardHandle = create(); + }); +}; + +beforeEach(async () => { + await renderHistoryCell(); +}); + +describe("HistoryCell", () => { + it("has summary and full views", async () => { + const button = cardHandle.root.findByProps({ id: buttonId }); + expect(cardHandle.root.findByType(AudioSummary).props.count).toEqual( + mockWord.audio.length + ); + expect(cardHandle.root.findAllByType(SenseCard)).toHaveLength(0); + expect(cardHandle.root.findAllByType(SummarySenseCard)).toHaveLength(1); + + await act(async () => { + button.props.onClick(); + }); + expect(cardHandle.root.findAllByType(AudioSummary)).toHaveLength(0); + expect(cardHandle.root.findAllByType(SenseCard)).toHaveLength( + mockWord.senses.length + ); + expect(cardHandle.root.findAllByType(SummarySenseCard)).toHaveLength(0); + + await act(async () => { + button.props.onClick(); + }); + expect(cardHandle.root.findByType(AudioSummary).props.count).toEqual( + mockWord.audio.length + ); + expect(cardHandle.root.findAllByType(SenseCard)).toHaveLength(0); + expect(cardHandle.root.findAllByType(SummarySenseCard)).toHaveLength(1); + }); +}); diff --git a/src/goals/DefaultGoal/BaseGoalScreen.tsx b/src/goals/DefaultGoal/BaseGoalScreen.tsx index 06dd04668b..61338138be 100644 --- a/src/goals/DefaultGoal/BaseGoalScreen.tsx +++ b/src/goals/DefaultGoal/BaseGoalScreen.tsx @@ -1,22 +1,22 @@ import loadable from "@loadable/component"; -import React, { ReactElement, useEffect } from "react"; +import { ReactElement, useEffect } from "react"; import { setCurrentGoal } from "components/GoalTimeline/Redux/GoalActions"; import PageNotFound from "components/PageNotFound/component"; import DisplayProgress from "goals/DefaultGoal/DisplayProgress"; import Loading from "goals/DefaultGoal/Loading"; import { clearTree } from "goals/MergeDuplicates/Redux/MergeDupsActions"; -import ReviewDeferredDuplicates from "goals/ReviewDeferredDuplicates"; -import { clearReviewEntriesState } from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions"; +import { clearReviewEntriesState } from "goals/ReviewEntries/Redux/ReviewEntriesActions"; import { StoreState } from "types"; import { Goal, GoalStatus, GoalType } from "types/goals"; import { useAppDispatch, useAppSelector } from "types/hooks"; const CharacterInventory = loadable(() => import("goals/CharacterInventory")); const MergeDup = loadable(() => import("goals/MergeDuplicates")); -const ReviewEntriesComponent = loadable( - () => import("goals/ReviewEntries/ReviewEntriesComponent") +const ReviewDeferredDups = loadable( + () => import("goals/ReviewDeferredDuplicates") ); +const ReviewEntries = loadable(() => import("goals/ReviewEntries")); function displayComponent(goal: Goal): ReactElement { const isCompleted = goal.status === GoalStatus.Completed; @@ -26,9 +26,9 @@ function displayComponent(goal: Goal): ReactElement { case GoalType.MergeDups: return ; case GoalType.ReviewDeferredDups: - return ; + return ; case GoalType.ReviewEntries: - return ; + return ; default: return ; } @@ -58,9 +58,9 @@ export function BaseGoalScreen(): ReactElement { }, [dispatch]); return ( - + <> {goal.status !== GoalStatus.Completed && } {displayComponent(goal)} - + ); } diff --git a/src/goals/MergeDuplicates/MergeDupsCompleted.tsx b/src/goals/MergeDuplicates/MergeDupsCompleted.tsx index c078e1b4bd..0f9dfbf308 100644 --- a/src/goals/MergeDuplicates/MergeDupsCompleted.tsx +++ b/src/goals/MergeDuplicates/MergeDupsCompleted.tsx @@ -1,13 +1,12 @@ import { ArrowRightAlt } from "@mui/icons-material"; -import { Button, Card, Grid, Paper, Typography } from "@mui/material"; +import { Card, Grid, Paper, Typography } from "@mui/material"; import { ReactElement, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useSelector } from "react-redux"; import { Flag, MergeUndoIds, Sense, Word } from "api/models"; import { getFrontierWords, getWord, undoMerge } from "backend"; -import { FlagButton } from "components/Buttons"; -import { CancelConfirmDialog } from "components/Dialogs"; +import { FlagButton, UndoButton } from "components/Buttons"; import SenseCardContent from "goals/MergeDuplicates/MergeDupsStep/SenseCardContent"; import { MergesCompleted } from "goals/MergeDuplicates/MergeDupsTypes"; import { StoreState } from "types"; @@ -45,6 +44,9 @@ export function MergesCount(changes: MergesCompleted): ReactElement { } function MergeChange(change: MergeUndoIds): ReactElement { + const handleIsUndoAllowed = (): Promise => + getFrontierWords().then((words) => doWordsIncludeMerges(words, change)); + return (
)} { + await undoMerge(change); + }} />
); } -interface UndoButtonProps { - merge: MergeUndoIds; - textId: string; - dialogId: string; - disabledId: string; -} - -function UndoButton(props: UndoButtonProps): ReactElement { - const [isUndoBtnEnabled, setUndoBtnEnabled] = useState(false); - const [undoDialogOpen, setUndoDialogOpen] = useState(false); - const { t } = useTranslation(); - - useEffect(() => { - function checkFrontier(): void { - getFrontierWords().then((words) => - setUndoBtnEnabled( - props.merge ? doWordsIncludeMerges(words, props.merge) : false - ) - ); - } - checkFrontier(); - }); - - if (isUndoBtnEnabled) { - return ( - -
- - setUndoDialogOpen(false)} - handleConfirm={() => - undoMerge(props.merge).then(() => setUndoDialogOpen(false)) - } - buttonIdCancel="merge-undo-cancel" - buttonIdConfirm="merge-undo-confirm" - /> -
-
- ); - } - return ( - -
- -
-
- ); -} - export function doWordsIncludeMerges( words: Word[], merge: MergeUndoIds diff --git a/src/goals/MergeDuplicates/MergeDupsStep/SenseCardContent.tsx b/src/goals/MergeDuplicates/MergeDupsStep/SenseCardContent.tsx index adc68190c1..5bf24d91b6 100644 --- a/src/goals/MergeDuplicates/MergeDupsStep/SenseCardContent.tsx +++ b/src/goals/MergeDuplicates/MergeDupsStep/SenseCardContent.tsx @@ -1,110 +1,10 @@ import { ArrowForwardIos, WarningOutlined } from "@mui/icons-material"; -import { - CardContent, - Chip, - Grid, - IconButton, - Table, - TableBody, - TableCell, - TableRow, - Typography, -} from "@mui/material"; +import { CardContent, Chip, Grid, IconButton } from "@mui/material"; import { ReactElement } from "react"; import { GramCatGroup, Sense, Status } from "api/models"; import { IconButtonWithTooltip, PartOfSpeechButton } from "components/Buttons"; -import theme from "types/theme"; -import { TypographyWithFont } from "utilities/fontComponents"; - -interface SenseInLanguage { - language: string; // bcp-47 code - glossText: string; - definitionText?: string; -} - -function getSenseInLanguage( - sense: Sense, - language: string, - displaySep = "; " -): SenseInLanguage { - return { - language, - glossText: sense.glosses - .filter((g) => g.language === language) - .map((g) => g.def) - .join(displaySep), - definitionText: sense.definitions.length - ? sense.definitions - .filter((d) => d.language === language) - .map((d) => d.text) - .join(displaySep) - : undefined, - }; -} - -function getSenseInLanguages( - sense: Sense, - languages?: string[] -): SenseInLanguage[] { - if (!languages) { - languages = sense.glosses.map((g) => g.language); - languages.push(...sense.definitions.map((d) => d.language)); - languages = [...new Set(languages)]; - } - return languages.map((l) => getSenseInLanguage(sense, l)); -} - -interface SenseTextRowsProps { - senseInLang: SenseInLanguage; -} - -function SenseTextRows(props: SenseTextRowsProps): ReactElement { - const lang = props.senseInLang.language; - return ( - <> - - - - {lang} - {":"} - - - - - {props.senseInLang.glossText} - - - - {!!props.senseInLang.definitionText && ( - - - -
- - {props.senseInLang.definitionText} - -
-
-
- )} - - ); -} +import SenseCardText from "components/WordCard/SenseCardText"; interface SenseCardContentProps { senses: Sense[]; @@ -120,10 +20,6 @@ interface SenseCardContentProps { export default function SenseCardContent( props: SenseCardContentProps ): ReactElement { - const senseTextInLangs = getSenseInLanguages( - props.senses[0], - props.languages - ); const semDoms = [ ...new Set( props.senses.flatMap((s) => @@ -181,13 +77,7 @@ export default function SenseCardContent( )}
{/* List glosses and (if any) definitions. */} - - - {senseTextInLangs.map((senseInLang, index) => ( - - ))} - -
+ {/* List semantic domains. */} {semDoms.map((dom) => ( diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions.ts b/src/goals/ReviewEntries/Redux/ReviewEntriesActions.ts similarity index 90% rename from src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions.ts rename to src/goals/ReviewEntries/Redux/ReviewEntriesActions.ts index e13dc1f781..dee559c3df 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions.ts +++ b/src/goals/ReviewEntries/Redux/ReviewEntriesActions.ts @@ -1,5 +1,9 @@ import { Sense } from "api/models"; import * as backend from "backend"; +import { + addEntryEditToGoal, + asyncUpdateGoal, +} from "components/GoalTimeline/Redux/GoalActions"; import { uploadFileFromUrl } from "components/Pronunciations/utilities"; import { ReviewClearReviewEntriesState, @@ -7,12 +11,12 @@ import { ReviewSortBy, ReviewUpdateWord, ReviewUpdateWords, -} from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes"; +} from "goals/ReviewEntries/Redux/ReviewEntriesReduxTypes"; import { ColumnId, ReviewEntriesSense, ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { StoreStateDispatch } from "types/Redux/actions"; import { newNote, newSense } from "types/word"; @@ -30,14 +34,16 @@ export function updateAllWords(words: ReviewEntriesWord[]): ReviewUpdateWords { }; } -function updateWord( - oldId: string, - updatedWord: ReviewEntriesWord -): ReviewUpdateWord { - return { - type: ReviewEntriesActionTypes.UpdateWord, - oldId, - updatedWord, +function updateWord(oldId: string, updatedWord: ReviewEntriesWord) { + return async (dispatch: StoreStateDispatch) => { + dispatch(addEntryEditToGoal({ newId: updatedWord.id, oldId })); + await dispatch(asyncUpdateGoal()); + const update: ReviewUpdateWord = { + type: ReviewEntriesActionTypes.UpdateWord, + oldId, + updatedWord, + }; + dispatch(update); }; } @@ -172,7 +178,7 @@ export function updateFrontierWord( editSource.audio = (await backend.getWord(editSource.id)).audio; // Update the review entries word in the state. - dispatch(updateWord(editWord.id, editSource)); + await dispatch(updateWord(editWord.id, editSource)); }; } @@ -201,7 +207,7 @@ function refreshWord( return async (dispatch: StoreStateDispatch): Promise => { const newWordId = await wordUpdater(oldWordId); const word = await backend.getWord(newWordId); - dispatch(updateWord(oldWordId, new ReviewEntriesWord(word))); + await dispatch(updateWord(oldWordId, new ReviewEntriesWord(word))); }; } diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReducer.ts b/src/goals/ReviewEntries/Redux/ReviewEntriesReducer.ts similarity index 92% rename from src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReducer.ts rename to src/goals/ReviewEntries/Redux/ReviewEntriesReducer.ts index 12c11c3aa1..bd0d75ff49 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReducer.ts +++ b/src/goals/ReviewEntries/Redux/ReviewEntriesReducer.ts @@ -3,7 +3,7 @@ import { ReviewEntriesAction, ReviewEntriesActionTypes, ReviewEntriesState, -} from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes"; +} from "goals/ReviewEntries/Redux/ReviewEntriesReduxTypes"; import { StoreAction, StoreActionTypes } from "rootActions"; export const reviewEntriesReducer = ( diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes.ts b/src/goals/ReviewEntries/Redux/ReviewEntriesReduxTypes.ts similarity index 93% rename from src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes.ts rename to src/goals/ReviewEntries/Redux/ReviewEntriesReduxTypes.ts index d9d2113574..8df1d02619 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes.ts +++ b/src/goals/ReviewEntries/Redux/ReviewEntriesReduxTypes.ts @@ -1,7 +1,7 @@ import { ColumnId, ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; export enum ReviewEntriesActionTypes { SortBy = "SORT_BY", diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesActions.test.tsx b/src/goals/ReviewEntries/Redux/tests/ReviewEntriesActions.test.tsx similarity index 98% rename from src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesActions.test.tsx rename to src/goals/ReviewEntries/Redux/tests/ReviewEntriesActions.test.tsx index 67cda6fb0c..b4d3ef1995 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesActions.test.tsx +++ b/src/goals/ReviewEntries/Redux/tests/ReviewEntriesActions.test.tsx @@ -6,11 +6,11 @@ import { getSenseError, getSenseFromEditSense, updateFrontierWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions"; +} from "goals/ReviewEntries/Redux/ReviewEntriesActions"; import { ReviewEntriesSense, ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { newSemanticDomain } from "types/semanticDomain"; import { newFlag, newGloss, newNote, newSense, newWord } from "types/word"; import { Bcp47Code } from "types/writingSystem"; @@ -25,10 +25,13 @@ jest.mock("backend", () => ({ getWord: (wordId: string) => mockGetWord(wordId), updateWord: (word: Word) => mockUpdateWord(word), })); - jest.mock("backend/localStorage", () => ({ getProjectId: jest.fn(), })); +jest.mock("components/GoalTimeline/Redux/GoalActions", () => ({ + addEntryEditToGoal: () => jest.fn(), + asyncUpdateGoal: () => jest.fn(), +})); const mockStore = configureMockStore([thunk])(); diff --git a/src/goals/ReviewEntries/Redux/tests/ReviewEntriesReducer.test.tsx b/src/goals/ReviewEntries/Redux/tests/ReviewEntriesReducer.test.tsx new file mode 100644 index 0000000000..0192c2a340 --- /dev/null +++ b/src/goals/ReviewEntries/Redux/tests/ReviewEntriesReducer.test.tsx @@ -0,0 +1,51 @@ +import { reviewEntriesReducer } from "goals/ReviewEntries/Redux/ReviewEntriesReducer"; +import { + defaultState, + ReviewEntriesActionTypes, +} from "goals/ReviewEntries/Redux/ReviewEntriesReduxTypes"; +import { + ReviewEntriesSense, + ReviewEntriesWord, +} from "goals/ReviewEntries/ReviewEntriesTypes"; + +describe("ReviewEntriesReducer", () => { + it("Returns default state when passed undefined state", () => { + expect(reviewEntriesReducer(undefined, { type: undefined } as any)).toEqual( + defaultState + ); + }); + + it("Adds a set of words to a list when passed an UpdateAllWords action", () => { + const revWords = [new ReviewEntriesWord(), new ReviewEntriesWord()]; + const state = reviewEntriesReducer(defaultState, { + type: ReviewEntriesActionTypes.UpdateAllWords, + words: revWords, + }); + expect(state).toEqual({ ...defaultState, words: revWords }); + }); + + it("Updates a specified word when passed an UpdateWord action", () => { + const oldId = "id-of-word-to-be-updated"; + const oldWords: ReviewEntriesWord[] = [ + { ...new ReviewEntriesWord(), id: "other-id" }, + { ...new ReviewEntriesWord(), id: oldId, vernacular: "old-vern" }, + ]; + const oldState = { ...defaultState, words: oldWords }; + + const newId = "id-after-update"; + const newRevWord: ReviewEntriesWord = { + ...new ReviewEntriesWord(), + id: newId, + vernacular: "new-vern", + senses: [{ ...new ReviewEntriesSense(), guid: "new-sense-id" }], + }; + const newWords = [oldWords[0], newRevWord]; + + const newState = reviewEntriesReducer(oldState, { + type: ReviewEntriesActionTypes.UpdateWord, + oldId, + updatedWord: newRevWord, + }); + expect(newState).toEqual({ ...oldState, words: newWords }); + }); +}); diff --git a/src/goals/ReviewEntries/ReviewEntries.ts b/src/goals/ReviewEntries/ReviewEntries.ts deleted file mode 100644 index efd3a26cf2..0000000000 --- a/src/goals/ReviewEntries/ReviewEntries.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Goal, GoalName, GoalType } from "types/goals"; - -export class ReviewEntries extends Goal { - constructor() { - super(GoalType.ReviewEntries, GoalName.ReviewEntries); - } -} diff --git a/src/goals/ReviewEntries/ReviewEntriesCompleted.tsx b/src/goals/ReviewEntries/ReviewEntriesCompleted.tsx new file mode 100644 index 0000000000..067acb0cfb --- /dev/null +++ b/src/goals/ReviewEntries/ReviewEntriesCompleted.tsx @@ -0,0 +1,95 @@ +import { ArrowRightAlt } from "@mui/icons-material"; +import { Grid, List, ListItem, Typography } from "@mui/material"; +import { ReactElement, useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useSelector } from "react-redux"; + +import { Word } from "api/models"; +import { getWord, isInFrontier, updateWord } from "backend"; +import { UndoButton } from "components/Buttons"; +import WordCard from "components/WordCard"; +import { + EntriesEdited, + EntryEdit, +} from "goals/ReviewEntries/ReviewEntriesTypes"; +import { StoreState } from "types"; +import theme from "types/theme"; + +export default function ReviewEntriesCompleted(): ReactElement { + const changes = useSelector( + (state: StoreState) => state.goalsState.currentGoal.changes as EntriesEdited + ); + const { t } = useTranslation(); + + return ( + <> + + {t("reviewEntries.title")} + + {EditsCount(changes)} + + {changes.entryEdits?.map((e) => )} + + + ); +} + +export function EditsCount(changes: EntriesEdited): ReactElement { + const { t } = useTranslation(); + + return ( + + {t("reviewEntries.completed.number")} + {changes.entryEdits?.length ?? 0} + + ); +} + +async function undoEdit(edit: EntryEdit): Promise { + const oldWord = await getWord(edit.oldId); + await updateWord({ ...oldWord, id: edit.newId }); +} + +function EditedEntry(props: { edit: EntryEdit }): ReactElement { + const { oldId, newId } = props.edit; + + const [oldWord, setOldWord] = useState(); + const [newWord, setNewWord] = useState(); + + useEffect(() => { + getWord(oldId).then(setOldWord); + }, [oldId]); + useEffect(() => { + getWord(newId).then(setNewWord); + }, [newId]); + + return ( + + + {!!oldWord && } + + + + {!!newWord && } + isInFrontier(newId)} + undo={() => undoEdit(props.edit)} + /> + + + ); +} diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/index.ts b/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/index.ts deleted file mode 100644 index 930c959a6a..0000000000 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import DefinitionCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DefinitionCell"; -import DeleteCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DeleteCell"; -import DomainCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DomainCell"; -import FlagCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/FlagCell"; -import GlossCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/GlossCell"; -import NoteCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/NoteCell"; -import PartOfSpeechCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PartOfSpeechCell"; -import PronunciationsCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PronunciationsCell"; -import SenseCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/SenseCell"; -import VernacularCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/VernacularCell"; - -export { - DefinitionCell, - DeleteCell, - DomainCell, - FlagCell, - GlossCell, - NoteCell, - PartOfSpeechCell, - PronunciationsCell, - SenseCell, - VernacularCell, -}; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesReducer.test.tsx b/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesReducer.test.tsx deleted file mode 100644 index 4b3ca74e49..0000000000 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/ReviewEntriesReducer.test.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { reviewEntriesReducer } from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReducer"; -import { - defaultState, - ReviewEntriesActionTypes, -} from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes"; -import { - ReviewEntriesSense, - ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; -import { newSemanticDomain } from "types/semanticDomain"; -import { Bcp47Code } from "types/writingSystem"; - -const mockState = { - ...defaultState, - words: mockWords(), -}; -const reviewEntriesWord: ReviewEntriesWord = { - ...new ReviewEntriesWord(), - id: mockState.words[0].id, - vernacular: "toadTOAD", - senses: [ - { - ...new ReviewEntriesSense(), - guid: "1", - glosses: [{ def: "bupBUP", language: Bcp47Code.En }], - domains: [ - newSemanticDomain("number", "domain"), - newSemanticDomain("number2", "domain2"), - ], - }, - ], -}; -const result: ReviewEntriesWord = { - ...new ReviewEntriesWord(), - id: "a new mock id", - vernacular: "toadTOAD", - senses: [ - { - ...new ReviewEntriesSense(), - guid: "1", - glosses: [{ def: "bupBUP", language: Bcp47Code.En }], - domains: [ - newSemanticDomain("number", "domain"), - newSemanticDomain("number2", "domain2"), - ], - }, - ], -}; - -describe("ReviewEntriesReducer", () => { - it("Returns default state when passed undefined state", () => { - expect(reviewEntriesReducer(undefined, { type: undefined } as any)).toEqual( - defaultState - ); - }); - - it("Adds a set of words to a list when passed an UpdateAllWords action", () => { - expect( - reviewEntriesReducer(defaultState, { - type: ReviewEntriesActionTypes.UpdateAllWords, - words: mockWords(), - }) - ).toEqual(mockState); - }); - - it("Updates a specified word when passed an UpdateWord action", () => { - expect( - reviewEntriesReducer(mockState, { - type: ReviewEntriesActionTypes.UpdateWord, - oldId: mockWords()[0].id, - updatedWord: { ...reviewEntriesWord, id: result.id }, - }) - ).toEqual({ ...mockState, words: [result, mockWords()[1]] }); - }); -}); diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellColumns.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellColumns.tsx similarity index 99% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellColumns.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellColumns.tsx index daa3b40afa..868e88cd48 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellColumns.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellColumns.tsx @@ -14,13 +14,13 @@ import { PronunciationsCell, SenseCell, VernacularCell, -} from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents"; +} from "goals/ReviewEntries/ReviewEntriesTable/CellComponents"; import { ColumnId, ReviewEntriesSense, ReviewEntriesWord, ReviewEntriesWordField, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { compareFlags } from "utilities/wordUtilities"; export class ColumnTitle { diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/AlignedList.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/AlignedList.tsx similarity index 100% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/AlignedList.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/AlignedList.tsx diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DefinitionCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DefinitionCell.tsx similarity index 97% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DefinitionCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DefinitionCell.tsx index 3add6d25de..dbff3b9328 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DefinitionCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DefinitionCell.tsx @@ -5,10 +5,10 @@ import { useSelector } from "react-redux"; import { Definition, WritingSystem } from "api/models"; import Overlay from "components/Overlay"; -import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesComponent/CellColumns"; +import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesTable/CellColumns"; import AlignedList, { SPACER, -} from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/AlignedList"; +} from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/AlignedList"; import { StoreState } from "types"; import { newDefinition } from "types/word"; import { diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DeleteCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell.tsx similarity index 93% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DeleteCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell.tsx index b69f7e4320..eeb88118bf 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DeleteCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell.tsx @@ -5,8 +5,8 @@ import { useTranslation } from "react-i18next"; import { deleteFrontierWord as deleteFromBackend } from "backend"; import { CancelConfirmDialog } from "components/Dialogs"; -import { updateAllWords } from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions"; -import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +import { updateAllWords } from "goals/ReviewEntries/Redux/ReviewEntriesActions"; +import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesTypes"; import { StoreState } from "types"; import { useAppDispatch, useAppSelector } from "types/hooks"; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DomainCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell.tsx similarity index 97% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DomainCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell.tsx index 9610ed113c..4379fba2b1 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DomainCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell.tsx @@ -11,12 +11,12 @@ import Overlay from "components/Overlay"; import TreeView from "components/TreeView"; import AlignedList, { SPACER, -} from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/AlignedList"; +} from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/AlignedList"; import { ColumnId, ReviewEntriesSense, ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { StoreState } from "types"; import { newSemanticDomainForMongoDB } from "types/semanticDomain"; import { themeColors } from "types/theme"; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/FlagCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/FlagCell.tsx similarity index 95% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/FlagCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/FlagCell.tsx index b93d65af6a..5b907d05fa 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/FlagCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/FlagCell.tsx @@ -2,7 +2,7 @@ import { ReactElement } from "react"; import { Flag } from "api/models"; import FlagButton from "components/Buttons/FlagButton"; -import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesComponent/CellColumns"; +import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesTable/CellColumns"; interface FlagCellProps extends FieldParameterStandard { editable?: boolean; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/GlossCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/GlossCell.tsx similarity index 96% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/GlossCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/GlossCell.tsx index b46b6a2111..3889f4736f 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/GlossCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/GlossCell.tsx @@ -5,10 +5,10 @@ import { useSelector } from "react-redux"; import { Gloss, WritingSystem } from "api/models"; import Overlay from "components/Overlay"; -import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesComponent/CellColumns"; +import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesTable/CellColumns"; import AlignedList, { SPACER, -} from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/AlignedList"; +} from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/AlignedList"; import { StoreState } from "types"; import { newGloss } from "types/word"; import { diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/NoteCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/NoteCell.tsx similarity index 95% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/NoteCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/NoteCell.tsx index 7a3ad5c809..5146fe1da2 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/NoteCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/NoteCell.tsx @@ -2,7 +2,7 @@ import { TextField } from "@mui/material"; import { ReactElement } from "react"; import { useTranslation } from "react-i18next"; -import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesComponent/CellColumns"; +import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesTable/CellColumns"; export default function NoteCell(props: FieldParameterStandard): ReactElement { const { t } = useTranslation(); diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PartOfSpeechCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/PartOfSpeechCell.tsx similarity index 84% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PartOfSpeechCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/PartOfSpeechCell.tsx index c3f3a982cf..803c5aff94 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PartOfSpeechCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/PartOfSpeechCell.tsx @@ -2,8 +2,8 @@ import { Grid } from "@mui/material"; import { ReactElement } from "react"; import { PartOfSpeechButton } from "components/Buttons"; -import AlignedList from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/AlignedList"; -import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +import AlignedList from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/AlignedList"; +import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesTypes"; interface PartOfSpeechCellProps { rowData: ReviewEntriesWord; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PronunciationsCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/PronunciationsCell.tsx similarity index 95% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PronunciationsCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/PronunciationsCell.tsx index 4ae4d14d4a..001727e8fa 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PronunciationsCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/PronunciationsCell.tsx @@ -5,7 +5,7 @@ import PronunciationsFrontend from "components/Pronunciations/PronunciationsFron import { deleteAudio, uploadAudio, -} from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions"; +} from "goals/ReviewEntries/Redux/ReviewEntriesActions"; import { useAppDispatch } from "types/hooks"; interface PronunciationsCellProps { diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/SenseCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/SenseCell.tsx similarity index 90% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/SenseCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/SenseCell.tsx index 135dd68ebd..b3b9fe5f24 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/SenseCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/SenseCell.tsx @@ -3,9 +3,9 @@ import { Chip, IconButton, Tooltip } from "@mui/material"; import { ReactElement } from "react"; import { useTranslation } from "react-i18next"; -import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesComponent/CellColumns"; -import AlignedList from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/AlignedList"; -import { ReviewEntriesSense } from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesTable/CellColumns"; +import AlignedList from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/AlignedList"; +import { ReviewEntriesSense } from "goals/ReviewEntries/ReviewEntriesTypes"; interface SenseCellProps extends FieldParameterStandard { delete: (deleteIndex: string) => void; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/VernacularCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/VernacularCell.tsx similarity index 96% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/VernacularCell.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/VernacularCell.tsx index ca8cf63348..c59706c91d 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/VernacularCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/VernacularCell.tsx @@ -1,7 +1,7 @@ import { ReactElement } from "react"; import { useTranslation } from "react-i18next"; -import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesComponent/CellColumns"; +import { FieldParameterStandard } from "goals/ReviewEntries/ReviewEntriesTable/CellColumns"; import { TextFieldWithFont } from "utilities/fontComponents"; interface VernacularCellProps extends FieldParameterStandard { diff --git a/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/index.ts b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/index.ts new file mode 100644 index 0000000000..ad76e1318e --- /dev/null +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/index.ts @@ -0,0 +1,23 @@ +import DefinitionCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/DefinitionCell"; +import DeleteCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell"; +import DomainCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell"; +import FlagCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/FlagCell"; +import GlossCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/GlossCell"; +import NoteCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/NoteCell"; +import PartOfSpeechCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/PartOfSpeechCell"; +import PronunciationsCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/PronunciationsCell"; +import SenseCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/SenseCell"; +import VernacularCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/VernacularCell"; + +export { + DefinitionCell, + DeleteCell, + DomainCell, + FlagCell, + GlossCell, + NoteCell, + PartOfSpeechCell, + PronunciationsCell, + SenseCell, + VernacularCell, +}; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/AlignedList.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/AlignedList.test.tsx similarity index 77% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/AlignedList.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/AlignedList.test.tsx index f808edea63..bfc9a168d7 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/AlignedList.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/AlignedList.test.tsx @@ -1,6 +1,6 @@ import renderer from "react-test-renderer"; -import AlignedList from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/AlignedList"; +import AlignedList from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/AlignedList"; describe("AlignedList", () => { it("renders without crashing", () => { diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DefinitionCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DefinitionCell.test.tsx similarity index 85% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DefinitionCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DefinitionCell.test.tsx index e5218c7f56..db4afeac00 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DefinitionCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DefinitionCell.test.tsx @@ -4,8 +4,8 @@ import configureMockStore from "redux-mock-store"; import "tests/reactI18nextMock"; -import DefinitionCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DefinitionCell"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import DefinitionCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/DefinitionCell"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; import { defaultWritingSystem } from "types/writingSystem"; // The multiline Input, TextField cause problems in the mock environment. diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DeleteCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DeleteCell.test.tsx similarity index 69% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DeleteCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DeleteCell.test.tsx index 9824eb6309..2cc3b02281 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DeleteCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DeleteCell.test.tsx @@ -4,9 +4,9 @@ import configureMockStore from "redux-mock-store"; import "tests/reactI18nextMock"; -import DeleteCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DeleteCell"; -import { defaultState as reviewEntriesState } from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import { defaultState as reviewEntriesState } from "goals/ReviewEntries/Redux/ReviewEntriesReduxTypes"; +import DeleteCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; const mockStore = configureMockStore()({ reviewEntriesState }); const mockWord = mockWords()[0]; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DomainCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DomainCell.test.tsx similarity index 79% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DomainCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DomainCell.test.tsx index c071e37c67..b7ff54c197 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/DomainCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DomainCell.test.tsx @@ -6,9 +6,9 @@ import configureMockStore from "redux-mock-store"; import "tests/reactI18nextMock"; import { defaultState as treeViewState } from "components/TreeView/Redux/TreeViewReduxTypes"; -import DomainCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/DomainCell"; -import { ColumnId } from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import DomainCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell"; +import { ColumnId } from "goals/ReviewEntries/ReviewEntriesTypes"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; jest.mock("components/TreeView", () => "div"); diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/FlagCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/FlagCell.test.tsx similarity index 72% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/FlagCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/FlagCell.test.tsx index 5663d9dc4d..69a52cd1d0 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/FlagCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/FlagCell.test.tsx @@ -2,8 +2,8 @@ import renderer from "react-test-renderer"; import "tests/reactI18nextMock"; -import FlagCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/FlagCell"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import FlagCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/FlagCell"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; const mockWord = mockWords()[1]; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/GlossCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/GlossCell.test.tsx similarity index 85% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/GlossCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/GlossCell.test.tsx index c537d6393d..71ffd82aa6 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/GlossCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/GlossCell.test.tsx @@ -4,8 +4,8 @@ import configureMockStore from "redux-mock-store"; import "tests/reactI18nextMock"; -import GlossCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/GlossCell"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import GlossCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/GlossCell"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; import { defaultWritingSystem } from "types/writingSystem"; // The multiline Input, TextField cause problems in the mock environment. diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/NoteCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/NoteCell.test.tsx similarity index 70% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/NoteCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/NoteCell.test.tsx index 1a64a8e1ec..1eb657bc9f 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/NoteCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/NoteCell.test.tsx @@ -2,8 +2,8 @@ import renderer from "react-test-renderer"; import "tests/reactI18nextMock"; -import NoteCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/NoteCell"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import NoteCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/NoteCell"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; // The multiline TextField causes problems in the mock environment. jest.mock("@mui/material/TextField", () => "div"); diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/PartOfSpeechCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/PartOfSpeechCell.test.tsx similarity index 59% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/PartOfSpeechCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/PartOfSpeechCell.test.tsx index 7eaf3d0b76..e267907195 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/PartOfSpeechCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/PartOfSpeechCell.test.tsx @@ -2,8 +2,8 @@ import renderer from "react-test-renderer"; import "tests/reactI18nextMock"; -import PartOfSpeechCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PartOfSpeechCell"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import PartOfSpeechCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/PartOfSpeechCell"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; const mockWord = mockWords()[1]; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/PronunciationsCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/PronunciationsCell.test.tsx similarity index 95% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/PronunciationsCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/PronunciationsCell.test.tsx index 1fe1b6abc8..671c5249a7 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/PronunciationsCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/PronunciationsCell.test.tsx @@ -8,7 +8,7 @@ import "tests/reactI18nextMock"; import AudioPlayer from "components/Pronunciations/AudioPlayer"; import AudioRecorder from "components/Pronunciations/AudioRecorder"; import { defaultState as pronunciationsState } from "components/Pronunciations/Redux/PronunciationsReduxTypes"; -import PronunciationsCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/PronunciationsCell"; +import PronunciationsCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/PronunciationsCell"; import theme from "types/theme"; // Mock the audio components @@ -18,13 +18,10 @@ jest jest.mock("components/Pronunciations/Recorder"); // Mock the store interactions -jest.mock( - "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions", - () => ({ - deleteAudio: (...args: any[]) => mockDeleteAudio(...args), - uploadAudio: (...args: any[]) => mockUploadAudio(...args), - }) -); +jest.mock("goals/ReviewEntries/Redux/ReviewEntriesActions", () => ({ + deleteAudio: (...args: any[]) => mockDeleteAudio(...args), + uploadAudio: (...args: any[]) => mockUploadAudio(...args), +})); jest.mock("types/hooks", () => { return { ...jest.requireActual("types/hooks"), diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/SenseCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/SenseCell.test.tsx similarity index 67% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/SenseCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/SenseCell.test.tsx index eff956e6f2..1244b93cc3 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/SenseCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/SenseCell.test.tsx @@ -2,8 +2,8 @@ import renderer from "react-test-renderer"; import "tests/reactI18nextMock"; -import SenseCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/SenseCell"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import SenseCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/SenseCell"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; const mockWord = mockWords()[1]; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/VernacularCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/VernacularCell.test.tsx similarity index 78% rename from src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/VernacularCell.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/VernacularCell.test.tsx index 200844b6a9..71d0237853 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/CellComponents/tests/VernacularCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/VernacularCell.test.tsx @@ -2,8 +2,8 @@ import renderer from "react-test-renderer"; import "tests/reactI18nextMock"; -import VernacularCell from "goals/ReviewEntries/ReviewEntriesComponent/CellComponents/VernacularCell"; -import mockWords from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import VernacularCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/VernacularCell"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; // The multiline TextField causes problems in the mock environment. jest.mock("@mui/material/TextField", () => "div"); diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/icons.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/icons.tsx similarity index 100% rename from src/goals/ReviewEntries/ReviewEntriesComponent/icons.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/icons.tsx diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTable.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/index.tsx similarity index 96% rename from src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTable.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/index.tsx index b1f4cb76a1..ff4579f341 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTable.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/index.tsx @@ -5,12 +5,12 @@ import React, { ReactElement, createRef, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useSelector } from "react-redux"; -import columns from "goals/ReviewEntries/ReviewEntriesComponent/CellColumns"; +import columns from "goals/ReviewEntries/ReviewEntriesTable/CellColumns"; +import tableIcons from "goals/ReviewEntries/ReviewEntriesTable/icons"; import { ColumnId, ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; -import tableIcons from "goals/ReviewEntries/ReviewEntriesComponent/icons"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { StoreState } from "types"; interface ReviewEntriesTableProps { diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/CellColumns.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/tests/CellColumns.test.tsx similarity index 98% rename from src/goals/ReviewEntries/ReviewEntriesComponent/tests/CellColumns.test.tsx rename to src/goals/ReviewEntries/ReviewEntriesTable/tests/CellColumns.test.tsx index bd7133e6e6..aff52ef85e 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/CellColumns.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/tests/CellColumns.test.tsx @@ -3,11 +3,11 @@ import "tests/reactI18nextMock"; import { GramCatGroup, GrammaticalInfo } from "api/models"; import columns, { ColumnTitle, -} from "goals/ReviewEntries/ReviewEntriesComponent/CellColumns"; +} from "goals/ReviewEntries/ReviewEntriesTable/CellColumns"; import { ReviewEntriesSense, ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { newSemanticDomain } from "types/semanticDomain"; import { newDefinition, newFlag, newGloss } from "types/word"; import { Bcp47Code } from "types/writingSystem"; diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes.ts b/src/goals/ReviewEntries/ReviewEntriesTypes.ts similarity index 57% rename from src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes.ts rename to src/goals/ReviewEntries/ReviewEntriesTypes.ts index 5af81ddfe8..4b660d7575 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes.ts +++ b/src/goals/ReviewEntries/ReviewEntriesTypes.ts @@ -8,7 +8,8 @@ import { Status, Word, } from "api/models"; -import { newSense, newWord } from "types/word"; +import { Goal, GoalName, GoalType } from "types/goals"; +import { newNote, newSense, newWord } from "types/word"; import { cleanDefinitions, cleanGlosses } from "utilities/wordUtilities"; export enum ColumnId { @@ -23,6 +24,21 @@ export enum ColumnId { Flag, } +export class ReviewEntries extends Goal { + constructor() { + super(GoalType.ReviewEntries, GoalName.ReviewEntries); + } +} + +export type EntryEdit = { + newId: string; + oldId: string; +}; + +export interface EntriesEdited { + entryEdits: EntryEdit[]; +} + // These must match the ReviewEntriesWord fields for use in ReviewEntriesTable export enum ReviewEntriesWordField { Id = "id", @@ -43,6 +59,8 @@ export class ReviewEntriesWord { flag: Flag; protected: boolean; + /** Construct a ReviewEntriesWord from a Word. + * Important: Some things (e.g., note language) aren't preserved! */ constructor(word?: Word, analysisLang?: string) { if (!word) { word = newWord(); @@ -68,6 +86,9 @@ export class ReviewEntriesSense { deleted: boolean; protected: boolean; + /** Construct a ReviewEntriesSense from a Sense. + * Important: Some things aren't preserved! + * (E.g., distinct glosses with the same language are combined.) */ constructor(sense?: Sense, analysisLang?: string) { if (!sense) { sense = newSense(); @@ -97,3 +118,36 @@ export class ReviewEntriesSense { return sense.glosses.map((g) => g.def).join(ReviewEntriesSense.SEPARATOR); } } + +/** Reverse map of the ReviewEntriesSense constructor. + * Important: Some things aren't preserved! + * (E.g., distinct glosses with the same language may have been combined.) */ +function senseFromReviewEntriesSense(revSense: ReviewEntriesSense): Sense { + return { + ...newSense(), + accessibility: revSense.protected + ? Status.Protected + : revSense.deleted + ? Status.Deleted + : Status.Active, + definitions: revSense.definitions.map((d) => ({ ...d })), + glosses: revSense.glosses.map((g) => ({ ...g })), + grammaticalInfo: revSense.partOfSpeech, + guid: revSense.guid, + semanticDomains: revSense.domains.map((dom) => ({ ...dom })), + }; +} + +/** Reverse map of the ReviewEntriesWord constructor. + * Important: Some things (e.g., note language) aren't preserved! */ +export function wordFromReviewEntriesWord(revWord: ReviewEntriesWord): Word { + return { + ...newWord(revWord.vernacular), + accessibility: revWord.protected ? Status.Protected : Status.Active, + audio: [...revWord.audio], + id: revWord.id, + flag: { ...revWord.flag }, + note: newNote(revWord.noteText), + senses: revWord.senses.map(senseFromReviewEntriesSense), + }; +} diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/index.tsx b/src/goals/ReviewEntries/index.tsx similarity index 52% rename from src/goals/ReviewEntries/ReviewEntriesComponent/index.tsx rename to src/goals/ReviewEntries/index.tsx index d43d0bcb34..407aebcab0 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/index.tsx +++ b/src/goals/ReviewEntries/index.tsx @@ -5,26 +5,35 @@ import { sortBy, updateAllWords, updateFrontierWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions"; -import ReviewEntriesTable from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTable"; +} from "goals/ReviewEntries/Redux/ReviewEntriesActions"; +import ReviewEntriesCompleted from "goals/ReviewEntries/ReviewEntriesCompleted"; +import ReviewEntriesTable from "goals/ReviewEntries/ReviewEntriesTable"; import { ColumnId, ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { useAppDispatch } from "types/hooks"; -export default function ReviewEntriesComponent(): ReactElement { +interface ReviewEntriesProps { + completed: boolean; +} + +export default function ReviewEntries(props: ReviewEntriesProps): ReactElement { const dispatch = useAppDispatch(); const [loaded, setLoaded] = useState(false); useEffect(() => { - getFrontierWords().then((frontier) => { - dispatch(updateAllWords(frontier.map((w) => new ReviewEntriesWord(w)))); - setLoaded(true); - }); - }, [dispatch]); + if (!props.completed) { + getFrontierWords().then((frontier) => { + dispatch(updateAllWords(frontier.map((w) => new ReviewEntriesWord(w)))); + setLoaded(true); + }); + } + }, [dispatch, props]); - return loaded ? ( + return props.completed ? ( + + ) : loaded ? ( dispatch(updateFrontierWord(newData, oldData)) diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock.ts b/src/goals/ReviewEntries/tests/WordsMock.ts similarity index 62% rename from src/goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock.ts rename to src/goals/ReviewEntries/tests/WordsMock.ts index c2a70a592c..45d65b8ecc 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock.ts +++ b/src/goals/ReviewEntries/tests/WordsMock.ts @@ -1,17 +1,10 @@ -import { GramCatGroup, Sense, Word } from "api/models"; +import { GramCatGroup } from "api/models"; import { ReviewEntriesSense, ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; +} from "goals/ReviewEntries/ReviewEntriesTypes"; import { newSemanticDomain } from "types/semanticDomain"; -import { - newDefinition, - newFlag, - newGloss, - newNote, - newSense, - newWord, -} from "types/word"; +import { newDefinition, newFlag, newGloss } from "types/word"; import { Bcp47Code } from "types/writingSystem"; export default function mockWords(): ReviewEntriesWord[] { @@ -57,24 +50,3 @@ export default function mockWords(): ReviewEntriesWord[] { }, ]; } - -export function mockCreateWord(word: ReviewEntriesWord): Word { - return { - ...newWord(word.vernacular), - id: word.id, - senses: word.senses.map((sense) => createMockSense(sense)), - note: newNote(word.noteText), - flag: word.flag, - }; -} - -function createMockSense(sense: ReviewEntriesSense): Sense { - return { - ...newSense(), - guid: sense.guid, - definitions: [...sense.definitions], - glosses: [...sense.glosses], - grammaticalInfo: sense.partOfSpeech, - semanticDomains: [...sense.domains], - }; -} diff --git a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/index.test.tsx b/src/goals/ReviewEntries/tests/index.test.tsx similarity index 80% rename from src/goals/ReviewEntries/ReviewEntriesComponent/tests/index.test.tsx rename to src/goals/ReviewEntries/tests/index.test.tsx index 298cf1ae63..483d22f50e 100644 --- a/src/goals/ReviewEntries/ReviewEntriesComponent/tests/index.test.tsx +++ b/src/goals/ReviewEntries/tests/index.test.tsx @@ -5,12 +5,13 @@ import configureMockStore from "redux-mock-store"; import "tests/reactI18nextMock"; -import ReviewEntriesComponent from "goals/ReviewEntries/ReviewEntriesComponent"; -import * as actions from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesActions"; -import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesTypes"; -import mockWords, { - mockCreateWord, -} from "goals/ReviewEntries/ReviewEntriesComponent/tests/WordsMock"; +import ReviewEntries from "goals/ReviewEntries"; +import * as actions from "goals/ReviewEntries/Redux/ReviewEntriesActions"; +import { + ReviewEntriesWord, + wordFromReviewEntriesWord, +} from "goals/ReviewEntries/ReviewEntriesTypes"; +import mockWords from "goals/ReviewEntries/tests/WordsMock"; import { defaultWritingSystem } from "types/writingSystem"; const mockGetFrontierWords = jest.fn(); @@ -42,6 +43,7 @@ jest.mock("backend", () => ({ // Mock the node module used by AudioRecorder. jest.mock("components/Pronunciations/Recorder"); jest.mock("components/TreeView", () => "div"); +jest.mock("components/GoalTimeline/Redux/GoalActions", () => ({})); jest.mock("types/hooks", () => ({ useAppDispatch: () => jest.fn(), })); @@ -61,11 +63,7 @@ const state = { reviewEntriesState: { words: mockReviewEntryWords }, treeViewState: { open: false, - currentDomain: { - name: "domain", - id: "number", - subdomains: [], - }, + currentDomain: { id: "number", name: "domain", subdomains: [] }, }, }; const mockStore = configureMockStore()(state); @@ -73,7 +71,7 @@ const mockStore = configureMockStore()(state); function setMockFunctions(): void { jest.clearAllMocks(); mockGetFrontierWords.mockResolvedValue( - mockReviewEntryWords.map(mockCreateWord) + mockReviewEntryWords.map(wordFromReviewEntriesWord) ); mockMaterialTable.mockReturnValue(Fragment); } @@ -90,13 +88,13 @@ beforeEach(async () => { await act(async () => { create( - + ); }); }); -describe("ReviewEntriesComponent", () => { +describe("ReviewEntries", () => { it("Initializes correctly", () => { expect(updateAllWordsSpy).toHaveBeenCalled(); const wordIds = updateAllWordsSpy.mock.calls[0][0].map( diff --git a/src/rootReducer.ts b/src/rootReducer.ts index 709287dd1e..98fb02edbf 100644 --- a/src/rootReducer.ts +++ b/src/rootReducer.ts @@ -8,7 +8,7 @@ import pronunciationsReducer from "components/Pronunciations/Redux/Pronunciation import treeViewReducer from "components/TreeView/Redux/TreeViewReducer"; import characterInventoryReducer from "goals/CharacterInventory/Redux/CharacterInventoryReducer"; import mergeDupStepReducer from "goals/MergeDuplicates/Redux/MergeDupsReducer"; -import { reviewEntriesReducer } from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReducer"; +import { reviewEntriesReducer } from "goals/ReviewEntries/Redux/ReviewEntriesReducer"; import { StoreState } from "types"; import analyticsReducer from "types/Redux/analytics"; diff --git a/src/types/goals.ts b/src/types/goals.ts index 0a7e995780..c2981dec8d 100644 --- a/src/types/goals.ts +++ b/src/types/goals.ts @@ -11,12 +11,13 @@ import { MergeStepData, MergesCompleted, } from "goals/MergeDuplicates/MergeDupsTypes"; +import { EntriesEdited } from "goals/ReviewEntries/ReviewEntriesTypes"; import { newUser } from "types/user"; export type GoalData = CharInvData | MergeDupsData; // Record is the recommended type for an empty object. export type GoalStep = CharInvStepData | MergeStepData | Record; -export type GoalChanges = CharInvChanges | MergesCompleted; +export type GoalChanges = CharInvChanges | EntriesEdited | MergesCompleted; export interface GoalProps { goal?: Goal; diff --git a/src/types/index.ts b/src/types/index.ts index 114069a2de..024d8c07b1 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -5,7 +5,7 @@ import { PronunciationsState } from "components/Pronunciations/Redux/Pronunciati import { TreeViewState } from "components/TreeView/Redux/TreeViewReduxTypes"; import { CharacterInventoryState } from "goals/CharacterInventory/Redux/CharacterInventoryReduxTypes"; import { MergeTreeState } from "goals/MergeDuplicates/Redux/MergeDupsReduxTypes"; -import { ReviewEntriesState } from "goals/ReviewEntries/ReviewEntriesComponent/Redux/ReviewEntriesReduxTypes"; +import { ReviewEntriesState } from "goals/ReviewEntries/Redux/ReviewEntriesReduxTypes"; import { AnalyticsState } from "types/Redux/analyticsReduxTypes"; import { GoalsState } from "types/goals"; diff --git a/src/utilities/goalUtilities.ts b/src/utilities/goalUtilities.ts index 21f1be80ca..e5e3abf8b2 100644 --- a/src/utilities/goalUtilities.ts +++ b/src/utilities/goalUtilities.ts @@ -6,7 +6,7 @@ import { MergeDups, ReviewDeferredDups, } from "goals/MergeDuplicates/MergeDupsTypes"; -import { ReviewEntries } from "goals/ReviewEntries/ReviewEntries"; +import { ReviewEntries } from "goals/ReviewEntries/ReviewEntriesTypes"; import { SpellCheckGloss } from "goals/SpellCheckGloss/SpellCheckGloss"; import { ValidateChars } from "goals/ValidateChars/ValidateChars"; import { ValidateStrWords } from "goals/ValidateStrWords/ValidateStrWords"; diff --git a/src/utilities/tests/utilities.test.ts b/src/utilities/tests/utilities.test.ts index d682457a30..513c3786d9 100644 --- a/src/utilities/tests/utilities.test.ts +++ b/src/utilities/tests/utilities.test.ts @@ -16,11 +16,11 @@ describe("utilities/utilities", () => { }); }); - describe("getNowDateTimeString", () => { + describe("getDateTimeString", () => { // This tests will fail intermittently if there is a bug with the 0-prepend it("returns string of correct length", () => { const expectedLength = "YYYY-MM-DD_hh-mm-ss".length; - expect(utilities.getNowDateTimeString().length).toBe(expectedLength); + expect(utilities.getDateTimeString()).toHaveLength(expectedLength); }); }); diff --git a/src/utilities/utilities.ts b/src/utilities/utilities.ts index b292d1068b..0f180ce4a4 100644 --- a/src/utilities/utilities.ts +++ b/src/utilities/utilities.ts @@ -35,19 +35,45 @@ export function quicksort(arr: T[], score: (item: T) => number): T[] { return [...quicksort(less, score), pivot, ...quicksort(greater, score)]; } -export function getNowDateTimeString(): string { - const now = new Date(Date.now()); +interface DateTimeSeparators { + date?: string; + dateTime?: string; + time?: string; +} + +export const friendlySep: DateTimeSeparators = { + date: "/", + dateTime: " ", + time: ":", +}; + +const pathSep: DateTimeSeparators = { + date: "-", + dateTime: "_", + time: "-", +}; + +/** Create a date-time string for the provided utc-string, or now() if not specified. + * Use path-friendly separators by default if not specified. */ +export function getDateTimeString( + utcString?: string, + sep?: DateTimeSeparators +): string { + const date = new Date(utcString ?? Date.now()); const vals = [ - now.getFullYear(), + date.getFullYear(), // Date.getMonth() starts at 0 for January. - now.getMonth() + 1, - now.getDate(), - now.getHours(), - now.getMinutes(), - now.getSeconds(), + date.getMonth() + 1, + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), ]; const strs = vals.map((value) => (value < 10 ? `0${value}` : `${value}`)); - return `${strs.slice(0, 3).join("-")}_${strs.slice(3, 6).join("-")}`; + // TODO: Consider localization of the date-time formatting. + const dateString = strs.slice(0, 3).join(sep?.date ?? pathSep.date); + const timeString = strs.slice(3, 6).join(sep?.time ?? pathSep.time); + return `${dateString}${sep?.dateTime ?? pathSep.dateTime}${timeString}`; } // A general-purpose edit distance. diff --git a/src/utilities/wordUtilities.ts b/src/utilities/wordUtilities.ts index e582b8f675..770bc5a98e 100644 --- a/src/utilities/wordUtilities.ts +++ b/src/utilities/wordUtilities.ts @@ -1,4 +1,12 @@ -import { Definition, Flag, Gloss, GramCatGroup, Sense, Word } from "api/models"; +import { + Definition, + Flag, + Gloss, + GramCatGroup, + GrammaticalInfo, + Sense, + Word, +} from "api/models"; import { HEX, colorblindSafePalette } from "types/theme"; import { newDefinition, newGloss } from "types/word"; @@ -55,7 +63,7 @@ export function firstGlossText(sense: Sense): string { } /** - * Given a word-array, return a string-array with any language code found in + * Given a word array, return a string array with any language code found in * a definition or gloss of any sense. */ export function getAnalysisLangsFromWords(words: Word[]): string[] { @@ -77,6 +85,27 @@ function wordReducer(accumulator: string[], word: Word): string[] { return [...new Set([...accumulator, ...newLangs])]; } +/** Given a grammatical-info array, return an array with one per GramCatGroup. */ +export function groupGramInfo( + infos: GrammaticalInfo[], + sep = " ; " +): GrammaticalInfo[] { + const catGroups = [...new Set(infos.map((i) => i.catGroup))].sort(); + + /** Concatenate all grammatical categories of a given group */ + const groupedGramCat = (group: GramCatGroup): string => { + const cats = infos + .filter((i) => i.catGroup === group) + .map((i) => i.grammaticalCategory); + return [...new Set(cats)].sort().join(sep); + }; + + return catGroups.map((c) => ({ + catGroup: c, + grammaticalCategory: groupedGramCat(c), + })); +} + /** Assign a different color to each grammatical category group. */ export function getGramCatGroupColor(group: GramCatGroup): HEX { switch (group) { From 2d6cbd434392f46652902a2b718a04f047d18a86 Mon Sep 17 00:00:00 2001 From: "D. Ror" Date: Fri, 1 Dec 2023 09:53:08 -0500 Subject: [PATCH 17/98] Export lift-ranges semantic domains in other languages (#2783) --- .vscode/settings.json | 1 + .../Controllers/LiftControllerTests.cs | 16 +- .../Mocks/SemanticDomainRepositoryMock.cs | 18 +- Backend.Tests/Services/LiftServiceTests.cs | 95 + Backend/BackendFramework.csproj | 6 - Backend/Data/sdList.txt | 1792 ----------------- Backend/Helper/FileStorage.cs | 6 + Backend/Helper/Language.cs | 2 +- Backend/Interfaces/ILiftService.cs | 1 + .../Repositories/SemanticDomainRepository.cs | 3 +- Backend/Services/LiftService.cs | 160 +- .../CellComponents/DomainCell.tsx | 13 +- src/types/semanticDomain.ts | 14 +- 13 files changed, 221 insertions(+), 1906 deletions(-) create mode 100644 Backend.Tests/Services/LiftServiceTests.cs delete mode 100644 Backend/Data/sdList.txt diff --git a/.vscode/settings.json b/.vscode/settings.json index e80e35b6ff..4c8b3939cc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -79,6 +79,7 @@ "signup", "sillsdev", "Sldr", + "Subdir", "subtag", "subtags", "targetdir", diff --git a/Backend.Tests/Controllers/LiftControllerTests.cs b/Backend.Tests/Controllers/LiftControllerTests.cs index cab3e9b365..6f812c9ffd 100644 --- a/Backend.Tests/Controllers/LiftControllerTests.cs +++ b/Backend.Tests/Controllers/LiftControllerTests.cs @@ -22,6 +22,7 @@ namespace Backend.Tests.Controllers public class LiftControllerTests : IDisposable { private IProjectRepository _projRepo = null!; + private ISemanticDomainRepository _semDomRepo = null!; private IWordRepository _wordRepo = null!; private ILiftService _liftService = null!; private IHubContext _notifyService = null!; @@ -52,8 +53,9 @@ protected virtual void Dispose(bool disposing) public void Setup() { _projRepo = new ProjectRepositoryMock(); + _semDomRepo = new SemanticDomainRepositoryMock(); _wordRepo = new WordRepositoryMock(); - _liftService = new LiftService(); + _liftService = new LiftService(_semDomRepo); _notifyService = new HubContextMock(); _permissionService = new PermissionServiceMock(); _wordService = new WordService(_wordRepo); @@ -543,9 +545,9 @@ public void TestRoundtrip(RoundTripObj roundTripObj) var path = Path.Combine(exportedProjDir, "audio", ChangeWebmToWav(audioFile)); Assert.That(File.Exists(path), Is.True, $"No file exists at this path: {path}"); } - Assert.That(Directory.Exists(Path.Combine(exportedProjDir, "WritingSystems")), Is.True); - Assert.That(File.Exists(Path.Combine( - exportedProjDir, "WritingSystems", roundTripObj.Language + ".ldml")), Is.True); + var writingSystemsDir = FileStorage.GenerateWritingsSystemsSubdirPath(exportedProjDir); + Assert.That(Directory.Exists(writingSystemsDir), Is.True); + Assert.That(File.Exists(Path.Combine(writingSystemsDir, roundTripObj.Language + ".ldml")), Is.True); Assert.That(File.Exists(Path.Combine(exportedProjDir, sanitizedProjName + ".lift")), Is.True); Directory.Delete(exportedDirectory, true); @@ -607,9 +609,9 @@ public void TestRoundtrip(RoundTripObj roundTripObj) var path = Path.Combine(exportedProjDir, "audio", ChangeWebmToWav(audioFile)); Assert.That(File.Exists(path), Is.True, $"No file exists at this path: {path}"); } - Assert.That(Directory.Exists(Path.Combine(exportedProjDir, "WritingSystems")), Is.True); - Assert.That(File.Exists(Path.Combine( - exportedProjDir, "WritingSystems", roundTripObj.Language + ".ldml")), Is.True); + writingSystemsDir = FileStorage.GenerateWritingsSystemsSubdirPath(exportedProjDir); + Assert.That(Directory.Exists(writingSystemsDir), Is.True); + Assert.That(File.Exists(Path.Combine(writingSystemsDir, roundTripObj.Language + ".ldml")), Is.True); Assert.That(File.Exists(Path.Combine(exportedProjDir, sanitizedProjName + ".lift")), Is.True); Directory.Delete(exportedDirectory, true); diff --git a/Backend.Tests/Mocks/SemanticDomainRepositoryMock.cs b/Backend.Tests/Mocks/SemanticDomainRepositoryMock.cs index 42da227bae..2c8c9f67df 100644 --- a/Backend.Tests/Mocks/SemanticDomainRepositoryMock.cs +++ b/Backend.Tests/Mocks/SemanticDomainRepositoryMock.cs @@ -8,10 +8,21 @@ namespace Backend.Tests.Mocks public class SemanticDomainRepositoryMock : ISemanticDomainRepository { private object? _responseObj; + private List? _validLangs; public Task?> GetAllSemanticDomainTreeNodes(string lang) { - return Task.FromResult((List?)_responseObj); + if (_validLangs is null) + { + return Task.FromResult((List?)_responseObj); + } + + List? semDoms = null; + if (_validLangs.Contains(lang)) + { + semDoms = new() { new(new SemanticDomain { Lang = lang }) }; + } + return Task.FromResult(semDoms); } public Task GetSemanticDomainFull(string id, string lang) @@ -33,5 +44,10 @@ internal void SetNextResponse(object? response) { _responseObj = response; } + + internal void SetValidLangs(List? validLangs) + { + _validLangs = validLangs; + } } } diff --git a/Backend.Tests/Services/LiftServiceTests.cs b/Backend.Tests/Services/LiftServiceTests.cs new file mode 100644 index 0000000000..dc53b992d8 --- /dev/null +++ b/Backend.Tests/Services/LiftServiceTests.cs @@ -0,0 +1,95 @@ +using System.Collections.Generic; +using System.IO; +using Backend.Tests.Mocks; +using BackendFramework.Interfaces; +using BackendFramework.Models; +using BackendFramework.Services; +using NUnit.Framework; + +namespace Backend.Tests.Services +{ + public class LiftServiceTests + { + private ISemanticDomainRepository _semDomRepo = null!; + private ILiftService _liftService = null!; + + private const string FileName = "file.lift-ranges"; + private const string ProjId = "LiftServiceTestsProjId"; + private const string UserId = "LiftServiceTestsUserId"; + + [SetUp] + public void Setup() + { + _semDomRepo = new SemanticDomainRepositoryMock(); + _liftService = new LiftService(_semDomRepo); + } + + [Test] + public void ExportInProgressTest() + { + Assert.That(_liftService.IsExportInProgress(UserId), Is.False); + _liftService.SetExportInProgress(UserId, true); + Assert.That(_liftService.IsExportInProgress(UserId), Is.True); + _liftService.SetExportInProgress(UserId, false); + Assert.That(_liftService.IsExportInProgress(UserId), Is.False); + } + + [Test] + public void StoreRetrieveDeleteExportTest() + { + Assert.That(_liftService.RetrieveExport(UserId), Is.Null); + Assert.That(_liftService.DeleteExport(UserId), Is.False); + + _liftService.SetExportInProgress(UserId, true); + Assert.That(_liftService.RetrieveExport(UserId), Is.Null); + Assert.That(_liftService.DeleteExport(UserId), Is.True); + Assert.That(_liftService.DeleteExport(UserId), Is.False); + + _liftService.StoreExport(UserId, FileName); + Assert.That(_liftService.RetrieveExport(UserId), Is.EqualTo(FileName)); + Assert.That(_liftService.DeleteExport(UserId), Is.True); + Assert.That(_liftService.RetrieveExport(UserId), Is.Null); + } + + [Test] + public void StoreRetrieveDeleteImportTest() + { + Assert.That(_liftService.RetrieveImport(UserId), Is.Null); + Assert.That(_liftService.DeleteImport(UserId), Is.False); + + _liftService.StoreImport(UserId, FileName); + Assert.That(_liftService.RetrieveImport(UserId), Is.EqualTo(FileName)); + Assert.That(_liftService.DeleteImport(UserId), Is.True); + Assert.That(_liftService.RetrieveImport(UserId), Is.Null); + } + + [Test] + public void CreateLiftRangesTest() + { + List frDoms = new() { new() { Lang = "fr" }, new() }; + List ptDoms = new() { new(), new() { Lang = "pt" } }; + List zzDoms = new() { new() { Lang = "zz" } }; + List projWords = new() + { + // First semantic domain of the second sense of a word + new() { Senses = new() { new(), new() { SemanticDomains = frDoms } } }, + // Second semantic domain of the first sense of a word + new() { Senses = new() { new() { SemanticDomains = ptDoms }, new() } }, + // Semantic domain with unsupported language + new() { Senses = new() { new() { SemanticDomains = zzDoms } } } + }; + + ((SemanticDomainRepositoryMock)_semDomRepo).SetValidLangs(new() { "en", "fr", "pt" }); + var langs = _liftService.CreateLiftRanges(projWords, new(), FileName).Result; + Assert.That(langs, Has.Count.EqualTo(2)); + Assert.That(langs, Does.Contain("fr")); + Assert.That(langs, Does.Contain("pt")); + + var liftRangesText = File.ReadAllText(FileName); + Assert.That(liftRangesText, Does.Not.Contain("\"en\"")); + Assert.That(liftRangesText, Does.Contain("\"fr\"")); + Assert.That(liftRangesText, Does.Contain("\"pt\"")); + Assert.That(liftRangesText, Does.Not.Contain("\"zz\"")); + } + } +} diff --git a/Backend/BackendFramework.csproj b/Backend/BackendFramework.csproj index a0dad68b4e..84190d946a 100644 --- a/Backend/BackendFramework.csproj +++ b/Backend/BackendFramework.csproj @@ -9,12 +9,6 @@ true $(NoWarn);CA1305;CA1816;CA1848;CS1591 - - - - - - NU1701 diff --git a/Backend/Data/sdList.txt b/Backend/Data/sdList.txt deleted file mode 100644 index 00a63a59bf..0000000000 --- a/Backend/Data/sdList.txt +++ /dev/null @@ -1,1792 +0,0 @@ -1`63403699-07c1-43f3-a47c-069d6e4316e5`Universe, creation`Use this domain for general words referring to the physical universe. Some languages may not have a single word for the universe and may have to use a phrase such as 'rain, soil, and things of the sky' or 'sky, land, and water' or a descriptive phrase such as 'everything you can see' or 'everything that exists'. -1.1`999581c4-1611-4acb-ae1b-5e6c1dfe6f0c`Sky`Use this domain for words related to the sky. -1.1.1`dc1a2c6f-1b32-4631-8823-36dacc8cb7bb`Sun`Use this domain for words related to the sun. The sun does three basic things. It moves, it gives light, and it gives heat. These three actions are involved in the meanings of most of the words in this domain. Since the sun moves below the horizon, many words refer to it setting or rising. Since the sun is above the clouds, many words refer to it moving behind the clouds and the clouds blocking its light. The sun's light and heat also produce secondary effects. The sun causes plants to grow, and it causes damage to things. -1.1.1.1`1bd42665-0610-4442-8d8d-7c666fee3a6d`Moon`Use this domain for words related to the moon. In your culture people may believe things about the moon. For instance in European culture people used to believe that the moon caused people to become crazy. So in English we have words like "moon-struck" and "lunatic." You should include such words in this domain. -1.1.1.2`b044e890-ce30-455c-aede-7e9d5569396e`Star`Use this domain for words related to the stars and other heavenly bodies. -1.1.1.3`a0d073df-d413-4dfd-9ba1-c3c68f126d90`Planet`Use this domain for words related to planets (large objects that circle the sun, looking like bright wandering stars in the sky), comets (objects that circle the sun, looking like a star with a tail), meteors (small objects that come from space and burn up when they hit the earth's atmosphere, causing a streak of light across the sky), and asteroids (small objects that circle the sun), planetary moons (large objects that circle the planets). Some cultures do not study the stars and will have few or no words in this domain. Others cultures that study the stars will have many words. There are only five planets that people can see in the sky--Mercury, Venus, Mars, Jupiter, and Saturn. The others are only known from the scientific study of astronomy. -1.1.2`e836b01b-6c1a-4d41-b90a-ea5f349f88d4`Air`Use this domain for words related to the air around us, including the air we breathe and the atmosphere around the earth. -1.1.2.1`18595df7-1c69-40db-a7c1-74d490115c0c`Blow air`Use this domain for words related to causing air to move. -1.1.3`b4aa4bbd-8abf-4503-96e4-05c75efd23d5`Weather`Use this domain for words related to the weather. -1.1.3.1`93b8bd61-137a-4ebc-b12f-52fa5d2b3ea4`Wind`Use this domain for words related to the wind. Some words refer to when the wind begins and ends. The wind changes in speed, so some words refer to how fast the wind is moving. Try to rank these on a scale from very slow to very fast. These words may also be distinguished by what the wind does, since a fast wind does more things. These words may also be distinguished by how long the wind blows. Some words refer to the speed of the wind becoming faster or slower. Some words distinguish a steady wind from a wind in which the speed keeps changing. Some words refer to when the speed of the wind becomes faster for a short time. A steady wind moves in a particular direction, so there are words that include the direction of the wind. The direction of the wind may refer to the points of the compass, a neighboring geographical feature or area, or the direction in which the speaker is moving. Some words refer to a wind that moves in a small circle, making a pillar of dust or a funnel-shaped cloud. Some words refer to what the wind does, such as when it moves or damages something. People can feel the wind, so some words refer to how it feels. The wind makes noise, so there are words that refer to the sound of the wind. In some cultures there is a relation between the wind and spirits, so some words may refer to the activity of the spirits in the wind, or that the wind brings disease. -1.1.3.2`5b12ea7b-790f-4f3e-8d07-893fc267773e`Cloud`Use this domain for words related to the clouds. -1.1.3.3`bfa3be74-0390-4e2e-bdb7-ed41eb67e4f1`Rain`Use this domain for words related to the rain. -1.1.3.4`ab8f12fb-57b0-4d61-8ae0-50d7cbc412df`Snow, ice`Use this domain for words related to snow, ice, sleet, and hail. -1.1.3.5`380b0d15-77a1-49ba-ad83-a508e7ffb83d`Storm`Use this domain for words related to storms. -1.1.3.6`63c69d11-1101-4870-aeb8-43ee364381b0`Lightning, thunder`Use this domain for words related to lightning and thunder. -1.1.3.7`349937e3-a2fd-41f8-b7c4-bd6fa106add4`Flood`Use this domain for words related to floods. -1.1.3.8`e6b21531-b7d0-4e37-b01b-3ca49a285168`Drought`Use this domain for words related to drought. -1.2`b47d2604-8b23-41e9-9158-01526dd83894`World`Use this domain for words referring to the planet we live on. -1.2.1`cce98603-ff8f-4213-945a-bd6746716139`Land`Use this domain for words referring to the ground we stand on, the earth versus the sky. -1.2.1.1`0ac5e5f9-e7fe-4d37-a631-eab1ceb1f8ae`Mountain`Use this domain for words related to mountains. -1.2.1.2`d50f3921-fcea-4ac9-b64a-25bf47dc3292`Volcano`Use this domain for words related to volcanoes. -1.2.1.3`4fb79b12-3bd1-46ed-8698-7d27052a5dc7`Plain, plateau`Use this domain for words referring to land that is flat. -1.2.1.4`cd403434-a5a1-4700-8ad3-b7c9aabd99d9`Valley`Use this domain for words related to valleys. -1.2.1.5`b3be00a9-41a4-42ae-ba51-320b5000a563`Underground`Use this domain for words referring to the area under the ground, and to holes in the ground. -1.2.1.6`7988974c-99fd-40dd-9b5e-2d81ec603ddc`Forest, grassland, desert`Use this domain for words referring to an area of land that has particular types of plants growing in it. -1.2.1.7`b3745f13-3632-4f13-b0cc-a74c51f8f2a1`Earthquake`Use this domain for words related to earthquakes. In some languages earthquakes are thought of as moving somewhere. In Amele (PNG) they say "mim nen" which means 'the earthquake came down (from above)'. In Northern Embera an earthquake is a "house-shaking". They say "a house-shaking went." -1.2.2`f899802d-bd32-427f-a101-c84219f7e14e`Substance, matter`Use this domain for general words referring to matter--what something is made out of, or a type of solid, liquid, or gas. -1.2.2.1`180a2220-942c-4e17-96ee-cd4f63a4c715`Soil, dirt`Use this domain for words referring to soil and dirt. -1.2.2.2`0f07adb7-4387-4723-9800-8362e825ad45`Rock`Use this domain for words referring to rock. -1.2.2.3`3df7d174-83d1-4e17-890e-1272e171ca41`Metal`Use this domain for words referring to metal. -1.2.2.4`56c9c38c-728a-42fe-b93c-6ca67fdf2a9a`Mineral`Use this domain for naturally occurring elements, compounds, and minerals--things you can find in the ground. -1.2.2.5`21bcc306-13cb-4162-98b3-2ba319ba14ea`Jewel`Use this domain for words referring to jewels and precious stones. -1.2.3`756728a8-9eb8-4329-aee2-d6a3d64585f2`Solid, liquid, gas`Use this domain for words describing the different states of matter (solid, liquid, and gas), and words for changing from one to another. -1.2.3.1`f56a2511-10cc-4829-940d-49051429bfba`Liquid`Use this domain for words referring to liquids. -1.2.3.2`962cb994-0183-4ac5-94b2-82a33f1d64e4`Oil`Use this domain for words referring to oil. -1.2.3.3`34c3edad-a158-44e7-989b-5b74401e6945`Gas`Use this domain for words referring to gas. -1.3`60364974-a005-4567-82e9-7aaeff894ab0`Water`Use this domain for general words referring to water. -1.3.1`79ebb5ce-f0fd-4fb5-9f22-1fa4965a555b`Bodies of water`Use this domain for general words referring to bodies of water. -1.3.1.1`14e9c20c-6eb5-49a4-a03f-3be26a934500`Ocean, lake`Use this domain for words referring to bodies of standing water. -1.3.1.2`31777669-e37b-4b77-9cce-0d8c33f6ebb9`Swamp`Use this domain for words referring to bodies of standing water with plants growing in them. -1.3.1.3`4153416a-784d-4f7c-a664-2640f7979a14`River`Use this domain for words referring to bodies of flowing water. -1.3.1.4`bf6e1719-11ee-4ace-9c84-72019c01aabc`Spring, well`Use this domain for words referring to a place where water comes out of the ground. -1.3.1.5`928741b5-bff6-4dd1-be37-ec6e7a4eb6ca`Island, shore`Use this domain for words referring to land in contrast with the sea or river. -1.3.2`50ab3705-a81e-4fcc-b3ae-95c075966f69`Movement of water`Use this domain for words referring to the way in which water and other liquids move. -1.3.2.1`60595d09-4a15-4499-b6e1-d36a704bcbe9`Flow`Use this domain for words referring to the way water moves over a surface, such as in a river or along the ground. -1.3.2.2`647603c2-6f32-48f3-91fa-1f7f0e44b539`Pour`Use this domain for words referring to water coming out of something (such as a container), or causing water to come out of something. -1.3.2.3`a9fbc056-3134-41af-baf4-9f63fa5bd5ae`Drip`Use this domain for words referring to drops of water and what they do. -1.3.2.4`741c417a-11e9-460c-9ab3-51b8220df016`Wave`Use this domain for words related to waves and what they do. -1.3.2.5`b09205d4-fbb4-4bcd-94ef-f8d83e298462`Calm, rough`Use this domain for words describing the surface of water. -1.3.2.6`c1a63ba2-1db6-410d-a4ed-5f64d1798bc1`Tide`Use this domain for words related to the tide. -1.3.3`f38f8344-838f-44ba-b103-22289c2d2793`Wet`Use this domain for words referring to when something has water on it or water has soaked into it. -1.3.3.1`0b0801a3-8a0c-40ea-bf41-07df80bd0d5f`Dry`Use this domain for words describing something that is dry. -1.3.4`bf25931d-4760-4c66-abe8-c05a6dc5adbe`Be in water`Use this domain for words referring to being in water or putting something in water. -1.3.5`e7e5dbf2-6d5b-4869-b357-8a7860c29002`Solutions of water`Use this domain for words referring to a mixture of water and a substance (such as salt or sugar) that dissolves in water. -1.3.6`4d19f09f-035b-477e-862c-a4157acdfe81`Water quality`Use this domain for words describing the quality or condition of water. -1.4`8d47c9ec-80c4-4309-9848-c453dcd71182`Living things`Use this domain for general words that relate to all living things. -1.4.1`06a89652-70e0-40ac-b929-ed42f011c9fc`Dead things`Use this domain for words referring to dead things--things that were alive before, but aren't now. -1.4.2`1c512719-6ecb-48cb-980e-4ff20e8b5f9b`Spirits of things`Use this domain for words referring to the spirits of things. -1.5`025da6f4-b1b6-423a-8c0f-b324f531a6f1`Plant`Use this domain for general words for all plants. Use a book of pictures to identify plant names and the scientific name. Languages divide plants into various domains that are not always comparable from language to language. Criterial features may be characteristics (trees and bushes are distinguished by size and number of trunks) and use (grass and weeds are distinguished by their desirability). A common distinction is between trees and non-trees, with trees described as being big, woody, and having a life expectancy of several years, while non-trees are small, non-woody, and have a life expectancy of typically not more than one year (Heine, Bernd and Karsten Legere. 1995. Swahili plants. Rudiger Koppe Verlag: Koln.). Agricultural societies will divide plants into wild and cultivated. However most plants for which there are names have some use. Therefore it does not seem helpful to divide plant names into domains for useful and non-useful plants. Since only parts of plants are eaten, edible parts of plants are listed under the domain 'Food'. Some languages may have more domains than are used in this list, others may have fewer. The classification system used here does not agree entirely with the system used by botanists. For instance botanists do not classify all the tree species together. The palm trees belong to the class Monocotyledoneae and are classified with lilies, bananas, and orchids. Apple and cherry trees belong to the class Dicotyledoneae and are classified in the rose family along with roses and blackberries. The acacia tree also belongs to the class Dicotyledoneae and is classified in the pulse family along with lupines and beans. However most folk taxonomies bring all the trees together. The scientific classification system for plants and animals is taken from: Carruth, Gorton, ed. 1989. The Volume Library, Vols. 1 and 2. The Southwestern Company: Nashville. -1.5.1`0ee5b933-f1ab-485f-894a-51fe239cb726`Tree`Use this domain for trees--flowering plants with roots, stems, and leaves, which are large and have a wooden trunk (Phylum Spermatophyta, Subdivision Angiospermae). Also include the evergreen trees (Phylum Spermatophyta, Subdivision Gymnospermae). Evergreen trees do not have flowers, but have cone like fruits (pinecones) that contain seeds. Their leaves are shaped like needles and are retained for over a year. -1.5.2`531af868-b5fb-41c2-ba50-764458f9102f`Bush, shrub`Use this domain for bushes and shrubs--plants that are smaller than trees and have several wooden trunks (Phylum Spermatophyta, Subdivision Angiospermae). -1.5.3`c345f278-91ff-463d-b9a6-8abac8a267eb`Grass, herb, vine`Use this domain for small plants that have roots, stems, flowers, and seeds, but do not have a wooden trunk (Phylum Spermatophyta, Subdivision Angiospermae). Also include the seedless plants, such as ferns (phylum Pteridophyta, class Felicineae), horsetails (phylum Pteridophyta, class Equisetineae), and club mosses (phylum Pteridophyta, class Lycopodineae). Plants of the Pteridophyta phylum have no flowers or seeds. Ferns have large, divided, feather-like leaves, or fronds. Club mosses are small (rarely over one meter) evergreen plants with simple leaves resembling pine or hemlock needles. Sometimes they grow upright, but often trail on the ground, where they propagate by means of runners. Horsetails send up tall, vertical, jointed stalks with branches covered with scale like leaves. -1.5.4`d06dae77-134a-403f-ba88-52ecd66c0522`Moss, fungus, algae`Use this domain for mosses (phylum Bryophyta, class Musci), liverworts (phylum Bryophyta, class Hepaticae), fungi (phylum Thallophyta, subdivision Fungi), algae (phylum Thallophyta, subdivision Algae), and lichens. These plants do not have true roots, stems, or leaves. The mosses are small, green, flowerless plants that grow in moist environments and look like velvety or feathery growths carpeting the ground, tree trunks, and rocks. The liverworts are similar to the mosses with a flat and branching growth pattern. The algae possess green chlorophyll. They vary from one-celled organisms, which sometimes live in colonies such as pond scum, to complex organisms such as seaweed. The fungi do not possess chlorophyll and feed off of other organic material. Lichens consist of a fungus and an algae growing together. They commonly grow on trunks of trees and rocks. Some are flat and leafy, and some are moss like. -1.5.5`d117aa22-3f18-47c4-9683-51ecf1dc7134`Parts of a plant`Use this domain for words that refer to parts of a plant. Start with general words that all plants have. Then think through each major type of plant. Finish by thinking of specific plants that are well known (usually cultivated crops) and that have words for specific parts (e.g. tassel on a corn/maize cob). -1.5.6`d2ca3194-e393-480e-ae1d-dd67bed55227`Growth of plants`Use this domain for words related to the growth of plants. -1.5.7`f7b7eb3c-b784-4ba5-8dac-a68fd27ce0ea`Plant diseases`Use this domain for words related to plant diseases. -1.6`944cf5af-469e-4b03-878f-a05d34b0d9f6`Animal`Use this domain for general words referring to animals. -1.6.1`73499b8b-76fc-4121-8bfa-1bdebe537259`Types of animals`Use this domain for words describing types of animals. Use a book of pictures to identify each species and its scientific name. This section is organized according to the scientific, biological classification of animals. It may not correspond to the local classification of animals (folk taxonomy), which are often based on how people relate to animals (tame/wild, edible/work). Use this domain for words referring to large classes of animals that do not correspond to the scientific classification. For instance this would be the place for a word like 'flying animal', which includes birds, bats, and flying insects. -1.6.1.1`5e9f361d-17dc-4ada-a312-8da269d22a64`Mammal`Use this domain for general words referring to mammals (phylum Chordata, class Mammalia). -1.6.1.1.1`40248a12-1809-4561-b786-e4e274c14d82`Primate`Use this domain for primates (phylum Chordata, class Mammalia, order Primates). -1.6.1.1.2`56ef3f06-7fb9-462e-a7d0-517f3ce1623f`Carnivore`Use this domain for carnivores--meat-eating animals (phylum Chordata, class Mammalia, order Carnivora). -1.6.1.1.3`bbd3c3f1-7387-4ec6-a75d-66c1355a94ef`Hoofed animals`Use this domain for even-toed hoofed animals (phylum Chordata, class Mammalia, order Artiodactyla), odd-toed hoofed animals (phylum Chordata, class Mammalia, order Perissodactyla), and elephants (phylum Chordata, class Mammalia, order Proboscidea). -1.6.1.1.4`a8b9e892-df3e-44c4-8c68-7a0f7f4468bb`Rodent`Use this domain for rodents--gnawing animals (phylum Chordata, class Mammalia, order Rodentia), insect eating animals (phylum Chordata, class Mammalia, order Insectivora), rabbits (phylum Chordata, class Mammalia, order Lagomorpha), and hyraxes (phylum Chordata, class Mammalia, order Hyracoidea). -1.6.1.1.5`31171aa9-e243-4b46-abd8-f3e52843cdfc`Marsupial`Use this domain for marsupials (phylum Chordata, class Mammalia, order Marsupialia). Marsupials carry their young in a pouch. -1.6.1.1.6`445f3084-f250-40fa-87ba-ebd233f9018f`Anteater, aardvark`Use this domain for mammals with few or no teeth--anteaters (phylum Chordata, class Mammalia, order Edentata), pangolins (phylum Chordata, class Mammalia, order Pholidota), aardvarks (phylum Chordata, class Mammalia, order Tubulidentata), and platypus--mammals that lay eggs (phylum Chordata, class Mammalia, order Monotremata). -1.6.1.1.7`e22d860a-d207-4649-8ab5-4592b838febb`Sea mammal`Use this domain for mammals that live in the sea--whales and dolphins (phylum Chordata, class Mammalia, order Cetacea), seals (phylum Chordata, class Mammalia, order Pinnipedia), and sea cows (phylum Chordata, class Mammalia, order Sirenia). -1.6.1.1.8`2c322d8b-d762-43ce-b905-aab41f9c7bbb`Bat`Use this domain for bats--flying mammals (phylum Chordata, class Mammalia, order Chiroptera). -1.6.1.2`83b483b8-f036-44be-8510-ea337d010a1c`Bird`Use this domain for birds (phylum Chordata, class Aves). -1.6.1.3`ee446395-781b-4651-afef-cad78b71f843`Reptile`Use this domain for general words referring to reptiles (phylum Chordata, class Reptilia). -1.6.1.3.1`7d472317-b5e8-4cae-a03f-913ecdaf4c29`Snake`Use this domain for words related to snakes. -1.6.1.3.2`36b3cfb6-0fea-4628-aa8d-f9b7af48f436`Lizard`Use this domain for words related to lizards. -1.6.1.3.3`faf0ae24-6584-4766-a93b-389c1cb06d8d`Turtle`Use this domain for words related to turtles. -1.6.1.3.4`c21c28e8-9731-4ee0-acbb-32501bf8abd1`Crocodile`Use this domain for words referring to crocodiles. -1.6.1.4`8d8a7656-8f8e-467e-b72e-535db6a17c6a`Amphibian`Use this domain for amphibians (phylum Chordata, class Amphibia). -1.6.1.5`85188748-1919-4210-a9e9-91171d9d6454`Fish`Use this domain for fish (phylum Chordata, class Osteichthyes). -1.6.1.6`3014de03-88e5-4330-9682-51963a41ca50`Shark, ray`Use this domain for sharks and rays--animals with cartilage instead of bones (phylum Chordata, class Chondrichthyes), and eels (phylum Chordata, class Cyclostomata). -1.6.1.7`ecc39bc2-6336-48ca-be46-cf5e49a3c267`Insect`Use this domain for the names of insect species (phylum Arthropoda, class Insecta). Note that insects have six legs and spiders have eight legs. However some languages may not distinguish insects from spiders and may use other characteristics to sub-divide the Arthropods. -1.6.1.8`cfb159f7-82f6-4789-b9b4-8f611820f350`Spider`Use this domain for spiders (phylum Arthropoda, class Arachnida). Note that insects have six legs and spiders have eight legs. However some languages may not distinguish insects from spiders and may use other characteristics to sub-divide the Arthropods. -1.6.1.9`38473463-4b92-4681-8fd0-0aca0342e88a`Small animals`Use this domain for the names of worms, animals with shells, and other animals that do not fit into any of the other categories. -1.6.2`ffd0547e-e537-4614-ac3f-6d8cd3351f33`Parts of an animal`Use this domain for the parts of animals, especially those of mammals. -1.6.2.1`e6221c7a-4608-4114-ba9f-532a3b943113`Parts of a bird`Use this domain for the parts of a bird, but not general parts that belong to all animals. -1.6.2.2`203f46d2-f0d0-4dda-8d1a-ddc15065b005`Parts of a reptile`Use this domain for the parts of a reptile. -1.6.2.3`73f3bd83-c9a5-4613-aeb1-0c5076d4850e`Parts of a fish`Use this domain for the parts of a fish. -1.6.2.4`0a37e7d5-b10e-4f1d-baf0-e71668425b3e`Parts of an insect`Use this domain for the parts of an insect. -1.6.2.5`5d72af95-facd-4be2-80e9-37528f0f34b5`Parts of small animals`Use this domain for the parts of small animals. -1.6.3`ac187298-85e8-43ed-ba85-cc06a62c08ba`Animal life cycle`Use this domain for words related to the life cycle of an animal. -1.6.3.1`b6a40216-fe93-4b0f-b85b-5622327031d0`Egg`Use this domain for words related to eggs. -1.6.4`e76227e8-4a04-4fbd-a16e-5baa3d9e97a9`Animal actions`Use this domain for actions of animals. -1.6.4.1`284433df-7b37-4e63-a614-78520c483213`Animal movement`Use this domain for ways in which animals move. Only include words specific for the movement of animals. For the movement of people use the domains under Movement. It is necessary to think through how each type of animal moves, especially the important ones. -1.6.4.2`8f68d85f-70f8-4662-9b4b-1dd2900a002a`Animal eating`Use this domain for words referring to animals eating. Because animals often eat in very different ways from people, many languages will have words that are specific to the way an animal eats. -1.6.4.3`cb99a086-8c6d-4f90-81db-6afa69ae5455`Animal sounds`Use this domain for the sounds animals make. It is necessary to think through the sounds each type of animal makes, especially the important ones. -1.6.5`17d5f429-6550-4a3a-a755-5ac3c3d7e04f`Animal home`Use this domain for animal homes. It is necessary to think through the homes of each type of animal, especially the important ones. -1.6.6`85646774-8145-4553-b8a7-6927cd077908`Animal group`Use this domain for words referring to groups of animals. -1.6.7`7c64f65b-2889-4f90-ba61-6b5f7634d4bc`Male and female animals`Use this domain for words referring to male and female animals. Most languages have special words for the male and female of a species only for domesticated animals. Sometimes there will be a word for the male and not the female, and vice versa (male dog, bitch). Sometimes the word for one is also used generically (cow for both female and generic). -1.7`aa57936d-f8a9-4603-8c3d-27abccd13531`Nature, environment`Use this domain for words referring to nature and the environment--the world around us. Include words that refer to how people damage or protect nature. -1.7.1`f4ed1712-c072-4213-b89d-eb3a9be233b2`Natural`Use this domain for words describing something that is natural--something in the world around us, as opposed to something that has been made or changed by people. -2`ba06de9e-63e1-43e6-ae94-77bea498379a`Person`Use this domain for general words for a person or all mankind. -2.1`1b0270a5-babf-4151-99f5-279ba5a4b044`Body`Use this domain for general words for the whole human body, and general words for any part of the body. Use a drawing or photo to label each part. Some words may be more general than others are and include some of the other words. For instance 'head' is more general than 'face' or 'nose'. Be sure that both general and specific parts are labeled. -2.1.1`d98c1c67-b70e-4a35-89db-2e744bd5197f`Head`Use this domain for the parts of the head. -2.1.1.1`bc8d0ad4-6ebf-4fa0-bc7e-60e8ec9c43db`Eye`Use this domain for words related to the eye. -2.1.1.2`2e97b83d-1152-473f-9cbe-347f0655041a`Ear`Use this domain for words related to the ear. -2.1.1.3`68ed3e51-ddc4-4cec-89ff-605259ac9fcf`Nose`Use this domain for words related to the nose. -2.1.1.4`e626c65e-eb79-4230-b07a-a6d975d3fe3d`Mouth`Use this domain for words related to the mouth. Do not use this domain for words referring to eating, drinking, or speaking. -2.1.1.5`c8602dc5-5c91-480a-b5ce-1c82fe3da83a`Tooth`Use this domain for words related to the teeth. -2.1.2`a80f12aa-c30d-4892-978a-b076985742d5`Torso`Use this domain for the parts of the torso. -2.1.3`c5282457-be5f-4ce9-a802-91140cb0a22b`Limb`Use this domain for words referring to a limb--either an arm or a leg. -2.1.3.1`c2f01aa8-9f94-43c9-9ada-b1e4a60aba07`Arm`Use this domain for the parts of the arm. -2.1.3.2`71f89512-17f0-484c-aca8-ddd226e3c794`Leg`Use this domain for the parts of the leg and foot. -2.1.3.3`9cfe4c5a-80d4-4b31-ba89-79b2e3d28a1c`Finger, toe`Use this domain for words related to the fingers and toes. -2.1.4`df2b9d7a-9b90-4704-8bc3-11dcffe985f4`Skin`Use this domain for words related to the skin. -2.1.5`2e5acfd2-3009-4496-9cc2-58d2a0088994`Hair`Use this domain for words related to hair. -2.1.6`1d8633e0-4279-4ddc-826e-16aa08a977e5`Bone, joint`Use this domain for words related to the bones and joints. -2.1.7`49c525b3-2163-48e1-b3bd-57e5cdc486a4`Flesh`Use this domain for words related to the soft tissue of the body. -2.1.8`4c862416-f7c4-4a3c-82ac-fe81e1efb879`Internal organs`Use this domain for words referring to the internal organs. -2.1.8.1`2d0b3058-d8bb-4110-a54a-e507b0d3a0e4`Heart`Use this domain for functions of the heart and blood veins. -2.1.8.2`b9a4b336-080a-4973-a7e3-a9af10fc347c`Stomach`Use this domain for words referring to the stomach and to the normal functions of the stomach. Do not use this domain for stomach illness. -2.1.8.3`7dbd7f43-4291-47f8-a392-6fdf3c98d522`Male organs`Use this domain for words related to the male reproductive organs. -2.1.8.4`3d5d93ce-00e0-46ff-b220-553c12c38381`Female organs`Use this domain for words related to the female reproductive organs and a woman's monthly menstrual cycle. Some of these terms may be taboo. Care must be exercised in which terms are included in the dictionary. A group of women should decide which terms are 'public' and can go in the dictionary, and which would be considered taboo, overly crude, or embarrassing. For example some societies have been afraid that their women will be taken advantage of if these terms are known. -2.2`7fe69c4c-2603-4949-afca-f39c010ad24e`Body functions`Use this domain for the functions and actions of the whole body. Use the subdomains in this section for functions, actions, secretions, and products of various parts of the body. In each domain include any special words that are used of animals. -2.2.1`a1959b00-9702-4b45-ac46-93f18d3bc5e6`Breathe, breath`Use this domain for words related to breathing. -2.2.2`8b52a9d6-a07e-4ac8-8f84-6eb5ba578d97`Cough, sneeze`Use this domain for words related to coughing, sneezing, and other actions of the mouth and nose. -2.2.3`75825d72-695b-4e92-9f33-0f3ab4d7dd11`Spit, saliva`Use this domain for words related to spitting. -2.2.4`591fd489-36e6-4ffd-a976-58876d851829`Mucus`Use this domain for words related to mucus in the nose. -2.2.5`8c41d2d1-6da6-4ab8-8b29-7e226192d64e`Bleed, blood`Use this domain for words related to blood and bleeding. -2.2.6`d395edc8-fb58-4ba4-8446-dacf8ea0477a`Sweat`Use this domain for words related to sweating. -2.2.7`e7f94aea-ba50-481d-b640-d5cd8bdedc72`Urinate, urine`Use this domain for words related to urination. -2.2.8`cbc24a98-1c64-467e-98aa-251a28e4c0b8`Defecate, feces`Use this domain for words related to defecation. -2.3`38bbb33a-90bf-4a2c-a0e5-4bde7e134bd9`Sense, perceive`Use this domain for general words related to all the senses--sight, hearing, smell, taste, and feeling. Some languages may not distinguish some of these senses, and some languages may have words for other senses. There are also other senses that animals have. If your language has words for other senses, include them here. -2.3.1`a8568a16-4c3b-4ce4-84a7-b8b0c6b0432f`See`Use this domain for words related to seeing something (in general or without conscious choice). -2.3.1.1`d7861def-70c1-470f-bca6-8230cbbaa3e9`Look`Use this domain for words that refer to looking at someone or something--to see something because you want to. -2.3.1.2`fda0c1ac-5728-4ba2-9f8e-827f161b5bb1`Watch`Use this domain for words that refer to watching someone or something--to look for some time at something that is happening because you are interested in it and want to know what is happening. -2.3.1.3`90c06635-a12c-4cd4-a190-46925ff0f43e`Examine`Use this domain for words referring to examining--to look carefully at something because you want to learn something about it. -2.3.1.4`273f4956-f79f-4b1e-b552-466280a65e60`Show, let someone see`Use this domain for words related to showing something to someone so that they can see it--to cause someone to see something. -2.3.1.5`3f4c559f-ab4f-411f-a23b-d2396c977005`Visible`Use this domain for words related to being able to see something--words that describe something that can be seen, something that cannot be seen, something that is easy to see, or something that is difficult to see. -2.3.1.5.1`79a33505-0c33-4e92-89b9-6a42e6ff2228`Appear`Use this domain for words referring to something appearing (becoming visible) and disappearing (becoming invisible). -2.3.1.6`cd6f1b37-5bdd-4237-8827-b1c947c8e1b4`Transparent`Use this domain for words that describe how well you can see through something. -2.3.1.7`ec118a28-fd23-48b3-8819-bfe1329f028d`Reflect, mirror`Use this domain for words related to reflecting light. -2.3.1.8`4275df2e-d4f6-461a-9279-39e0712dc082`Appearance`Use this domain for words related to how something appears. -2.3.1.8.1`e4517880-aa2d-4977-b55a-dcb0b6d1f533`Beautiful`Use this domain for words describing someone or something that is beautiful--pleasing in appearance,. -2.3.1.8.2`2f151c35-72e1-4665-bc05-6fc70a3ecff2`Ugly`Use this domain for words describing someone or something that is ugly--not pleasing in appearance. -2.3.1.9`e4e05724-01ec-4c61-90f0-b8658cc8ca51`Something used to see`Use this domain for words referring to glasses and other things people use to help them see. -2.3.2`8503660c-03af-49ee-86b6-525aab4da828`Hear`Use this domain for words related to hearing something (in general or without conscious choice). -2.3.2.1`0de28f92-c851-413c-bb6c-3ad21f5e267f`Listen`Use this domain for words related to listening--to deliberately hear something. -2.3.2.2`acf5e294-d169-45c1-a9d3-960536e018cc`Sound`Use this domain for words referring to sounds. -2.3.2.3`fd33670e-ef16-4566-a62e-aa077e58407b`Types of sounds`Use this domain for words referring to types of sounds. -2.3.2.4`6804db44-b71b-4452-98b1-b726bc7cf022`Loud`Use this domain for words that describe loud sounds. -2.3.2.5`d853597b-f3ed-470b-b6dd-8fe93b8e43eb`Quiet`Use this domain for words that describe quiet sounds. -2.3.3`8497fb66-8b91-46b9-a0d5-fb9385319561`Taste`Use this domain for words related to tasting something. -2.3.4`ed7930df-e7b4-43c9-a11a-b09521276b57`Smell`Use this domain for words related to smelling something. -2.3.5`72274e9d-5d3c-4ae7-93ab-db3617cdda1e`Sense of touch`Use this domain for words related to the sense of touch--to feel something with your skin, to feel hot or cold, to feel tired or rested. -2.3.5.1`295dc021-5b50-47b3-8340-1631c6d6fadc`Comfortable`Use this domain for words related to feeling comfortable--to feel good in your body because there is nothing around you that makes you feel bad. This includes comfortable clothes, chair, bed, temperature, or journey. -2.4`f7706644-542f-4fcb-b8e1-e91d04c8032a`Body condition`Use this domain for general words related to the condition of the body. -2.4.1`e949f393-2a5b-4792-af8f-75138322ceee`Strong`Use this domain for words that related to being strong, such as being able to lift a heavy object or being able to work hard. -2.4.2`94af09fa-ff23-433b-a881-ceaca87d9d18`Weak`Use this domain for words related to being weak. -2.4.3`2daede19-ce5f-46b6-ae68-32d6092441f1`Energetic`Use this domain for words related to being energetic. -2.4.4`b5700ad7-36a1-4608-8789-8f84007244f8`Tired`Use this domain for words related to being tired. -2.4.5`2c401e7f-6ce9-470f-b6b6-fadf7a798536`Rest`Use this domain for words related to resting. -2.5`32bebe7e-bdcc-4e40-8f0a-894cd6b26f25`Healthy`Use this domain for words related to a person being healthy--not sick. -2.5.1`7c6cad26-79c3-403a-a3aa-59babdfcd46f`Sick`Use this domain for words describing a person who is sick. -2.5.1.1`104d40c9-2a4f-4696-ad99-5cf0eb86ab2e`Recover from sickness`Use this domain for words referring to recovering from sickness or injury. -2.5.2`cf337287-c9fa-43d2-93c4-284f45e262c0`Disease`Use this domain for general words for disease and for words referring to specific diseases. -2.5.2.1`f0de6c5a-3df6-4483-8c63-2d8fcd6c97be`Malnutrition, starvation`Use this domain for words related to not having enough food. -2.5.2.2`4d2a67fb-91c8-4436-87f4-f4eab6cb0828`Skin disease`Use this domain for words related to skin diseases such as leprosy, boils, and rashes. -2.5.2.3`39dcb6b9-94df-45be-a128-c14c7a9dcdbd`Stomach illness`Use this domain for words related to stomach illness. -2.5.2.4`77f0d0dc-61ee-4373-9879-35a7059bd892`Tooth decay`Use this domain for words related to tooth decay. -2.5.3`9d865347-6656-4ab7-8613-bf2e8bc53aa7`Injure`Use this domain for words related to injuring someone. -2.5.3.1`5fcadae4-b4a8-4600-8d30-c4f67986d619`Amputate`Use this domain for words related to amputating or losing a limb or other part of your body. -2.5.3.2`962941b2-66bd-437f-aadc-b1921bcae5b4`Poison`Use this domain for words referring to poison--something that is bad for your body if you eat it, it gets on you, or an animal injects it into you. -2.5.4`c2dbe83a-d638-45ac-a6d5-5f041b9dde71`Disabled`Use this domain for general words for being disabled--to be injured or born with a condition, so that some part of your body does not work. -2.5.4.1`b602c0e1-5398-4cc9-850b-7cfb5c592d13`Blind`Use this domain for words related to being blind. -2.5.4.2`23fb1571-c04e-4850-b499-f170bc45247f`Poor eyesight`Use this domain for words related to having poor eyesight. -2.5.4.3`3be7e3fe-89d4-471a-92bd-8c70fcb146bb`Deaf`Use this domain for words related to being deaf. -2.5.4.4`d2f05cc8-1a3f-4bc2-9a2b-38174bb84091`Mute`Use this domain for words related to being mute--unable to speak (usually because of being unable to hear). -2.5.4.5`4a5c8fdb-c8a0-49d2-a0d6-342428682d65`Birth defect`Use this domain for words related to having a birth defect. -2.5.5`fa32115e-e389-47bd-91e1-61779172ccf2`Cause of disease`Use this domain for words referring to the cause of disease. -2.5.6`a894d991-d5da-45a6-9c62-009133257f36`Symptom of disease`Use this domain for words for symptoms of disease--something that happens to you when you get sick, something that shows that you are sick. -2.5.6.1`768aed05-dbc9-4caf-9461-76cb3720f908`Pain`Use this domain for words related to pain -2.5.6.2`5238fe9c-4bbe-444c-b5f6-18f946b3d6aa`Fever`Use this domain for words related to having a fever. -2.5.6.3`6eaba0c3-cdfe-435d-8811-7f2ddf6facbd`Swell`Use this domain for words related to swelling of the body. -2.5.6.4`d83ebe2c-c1d6-49ec-a4a9-1cdced843387`Lose consciousness`Use this domain for words related to losing consciousness, including fainting, being knocked out, and anesthesia. -2.5.6.5`81e03df2-33a8-4735-aa23-80ef1c63679e`Dazed, confused`Use this domain for words that describe the state of the mind when a person's mind is not working well or when he is not thinking very well. -2.5.6.6`5c091d8d-5bc4-40c3-8a30-2a08fb0794b8`Vision, hallucination`Use this domain for words related to having a vision--when a person sees something that isn't there because something unusual has happened to their mind. Include unusual, abnormal, and paranormal states of consciousness, visions, hallucinations, and spiritually induced trances. -2.5.7`101c16f8-ec76-4ec7-895a-fd814fef51dd`Treat disease`Use this domain for words related to the treatment of disease and injury. -2.5.7.1`c01bbcef-7d89-4753-bafd-3a7f23648982`Doctor, nurse`Use this domain for words referring to people who habitually take care of the sick and injured, such as those who do it for a living. -2.5.7.2`b82c7ba0-9f4e-44da-bcd0-d30f5b224de5`Medicine`Use this domain for words related to medicine, types of medicine, and the application of medicine. -2.5.7.3`f3627c41-5daf-4f73-ac42-8a0522035e0b`Medicinal plants`Use this domain for plants that are used for medicine. -2.5.7.4`250a52e4-ede0-427d-8382-46a5742d4f96`Hospital`Use this domain for words that refer to a place where the sick and injured are treated. -2.5.7.5`8e88ed6a-000d-400a-8cd8-7b3cc7f1818c`Traditional medicine`Use this domain for words related to traditional medicine. There may be no distinction in terminology between 'modern medicine' and 'traditional medicine.' In that case this domain should be ignored. (Our purpose here is not to judge the value of traditional medicine, but to collect and describe the words used for it.) -2.5.8`a01a1900-fc1f-462e-ba3d-ae822711b034`Mental illness`Use this domain for words related to being mentally ill or disabled. -2.6`50db27b5-89eb-4ffb-af82-566f51c8ec0b`Life`Use this domain for general words referring to being alive and to a person's lifetime. -2.6.1`ffcc57f8-6c6d-4bf4-85be-9220ca7c739d`Marriage`Use this domain for words related to the state of being married. -2.6.1.1`2e95bd1e-82f0-461d-8ca6-b5f1ce1fb180`Arrange a marriage`Use this domain for all the words related to arranging a marriage. Cultures vary widely in their practices. In some cultures marriages are arranged by the parents. In other cultures a man must seek a wife for himself. Some cultures allow either practice or a combination of the two. So some of the questions below may be inappropriate to your culture. -2.6.1.2`ed4a2ca6-c03c-4c72-9431-b72fb7294b8f`Wedding`Use this domain for words related to the wedding ceremony. -2.6.1.3`f7e625a6-53e3-4f9b-8764-119e3906f5cf`Unmarried`Use this domain for words related to being unmarried. -2.6.1.4`f6e416b3-50b1-4e48-8a39-2998725b1c79`Divorce`Use this domain for words related to divorce--to legally end your marriage. -2.6.1.5`edbfc928-049c-4cb7-8c88-8e8af38287c7`Romantic love`Use this domain for words related to romantic love. -2.6.2`c753fc8b-22ae-4e71-807f-56fb3ebd3cdd`Sexual relations`Use this domain for words related to sexual relations and having sex. Be careful that your domain label does not use a taboo word. -2.6.2.1`9f6754ae-a429-4bba-8f6f-2cd4ea0cbe45`Virginity`Use this domain for words related to being a virgin--a person who has never had sex. -2.6.2.2`23190f9e-2db2-4ef9-8c0e-495dbef05571`Attract sexually`Use this domain for words related to attracting someone sexually--to cause someone to want to have sex with you, and for words related to being sexually attracted to someone--to want to have sex with someone. -2.6.2.3`b0905fa9-2f90-410b-8eb5-7c7944c4f0f9`Sexual immorality`Use this domain for words referring to illicit sexual relations. -2.6.3`35e61ec4-0542-4583-b5da-0aa5e31a35aa`Birth`Use this domain for words related to giving birth and being born. -2.6.3.1`3cb4c07c-8760-4ff9-8d45-1c0bed80ffb3`Pregnancy`Use this domain for words related to being pregnant. -2.6.3.2`bd002dfa-e842-47d6-b11b-3c213cbf133a`Fetus`Use this domain for words related to a fetus--a baby that has not been born yet. -2.6.3.3`dbebc3bd-2d01-4d62-a009-866c18ee3527`Miscarriage`Use this domain for words related to the prevention or termination of a pregnancy, and for words related to killing babies. -2.6.3.4`56984b2b-3417-49b4-a082-1a383551a9e9`Labor and birth pains`Use this domain for words related to labor and birth pains. -2.6.3.5`5c468a85-e45f-4ea0-a3ba-68feda7e85a1`Help to give birth`Use this domain for words related to helping a woman to give birth. -2.6.3.6`f3d162d7-da79-4ce4-9610-040f03b57d9d`Unusual birth`Use this domain for words related to an unusual birth. -2.6.3.7`f4f99472-0b23-42b9-8b51-1d56fe24715b`Multiple births`Use this domain for words related to multiple births--when a woman give birth to more than one baby at the same time. -2.6.3.8`447f258b-2160-42c7-9431-ffeeb86edcb8`Fertile, infertile`Use this domain for words related to being unable to have children. -2.6.3.9`34a02a17-23fb-4260-9f97-c125842a3594`Birth ceremony`Use this domain for words related to a birth ceremony. -2.6.4`444407f2-0c75-4bb9-a84c-cbd52d0fa9c9`Stage of life`Use this domain for words referring to a stage of life--a time period in a person's life. -2.6.4.1`79ca34ea-68a7-4fe9-b5ac-4f3d6a1ab99d`Baby`Use this domain for words related to a baby. -2.6.4.1.1`a19e219a-6cc1-4057-a8d9-18554ae88de1`Care for a baby`Use this domain for words related to caring for a baby. -2.6.4.2`7d472dd5-636d-4499-bf66-83cf23c0dbe1`Child`Use this domain for words related to a child. -2.6.4.2.1`ca91e41a-81c3-4c96-87e6-f67477fcd686`Rear a child`Use this domain for words related to rearing a child--to take care of someone while they are a child so that their needs are met and they become a good person. -2.6.4.3`f74f28d1-8742-4c9f-95dc-d08336e91249`Youth`Use this domain for words referring to a youth. -2.6.4.4`fc82fcec-d03c-4fb0-bf62-714c71754402`Adult`Use this domain for words referring to an adult. -2.6.4.5`8fff393a-23c2-42bb-8da8-9b151e790904`Old person`Use this domain for words related to old age and older persons? -2.6.4.6`f718fc15-59b2-4b6a-a9e3-39b3e8d487d7`Grow, get bigger`Use this domain for words referring to people, animals, or plants growing and getting bigger. -2.6.4.7`adf6ad2b-7af9-4bd8-a7b4-f864b9dad86d`Initiation`Use this domain for words related to initiation rites--a ceremony when a child becomes an adult. -2.6.4.8`9e587127-4f2c-4796-9c67-d37332b57303`Peer group`Use this domain for words referring to a peer group--all the people who were born during the same time period. -2.6.5`0db5817e-05bf-4703-a6b9-e239ac44f857`Male, female`Use this domain for words referring to male and female people. -2.6.5.1`04582a28-b94a-4e7f-8cc4-5cdefa8a39f0`Man`Use this domain for words referring to a man or any male person. -2.6.5.2`ae6f73ab-432d-42e8-aa1a-c848652a13f0`Woman`Use this domain for words referring to a woman or any female person. -2.6.6`1c3c8af0-56b9-4617-862e-21f39b388606`Die`Use this domain for words related to dying. -2.6.6.1`b8d2fdb9-22ea-4040-8abb-aeeff0399f23`Kill`Use this domain for words related to killing someone--to cause someone to die. -2.6.6.2`7e2b6218-0837-4b16-a982-c9535cccdb21`Corpse`Use this domain for words referring to a corpse--the body of a person who has died. -2.6.6.3`08d5e632-0aed-4924-b3bb-d43de3420385`Funeral`Use this domain for words related to a funeral and other things that are done after a person dies. -2.6.6.4`f2d0f288-5bbe-4fa0-9e8f-ddcc74891701`Mourn`Use this domain for words related to mourning a death--to feel bad because someone died and to show this feeling in various ways. Include whatever cultural practices are used. -2.6.6.5`ca9c215a-e568-4d09-b3a9-b5727cd831d6`Bury`Use this domain for words related to disposing of a dead body. Different cultures have practices other than burying a body in the ground. Include words for all practices used by the culture. -2.6.6.6`32cf3835-bced-4ea1-9c7a-f7ff653e59fe`Grave`Use this domain for words related to a grave--the place where a dead body is put. -2.6.6.7`1ec85151-eba0-48f4-b56d-4f8040602a4b`Inherit`Use this domain for words related to inheriting something from your parents after they die. -2.6.6.8`0281fb1d-ab12-41b9-a3dc-09ef6b1e4733`Life after death`Use this domain for words related to life after death. -3`f4491f9b-3c5e-42ab-afc0-f22e19d0fff5`Language and thought`Use this domain for general words referring to mental and verbal activity. This domain is primarily for grouping many related domains. Therefore there may be no general word in a language to cover such a broad area of meaning. -3.1`1cb79293-d4f7-4990-9f50-3bb595744f61`Soul, spirit`Use this domain for general words related to the immaterial, non-physical part of a person, as opposed to the body. -3.1.1`6fe11b6a-8d01-4a0b-bdeb-e4e6f420340a`Personality`Use this domain for words that describe a person's personality (the way he usually thinks, talks, and how he acts with other people). -3.1.2`a2508183-7ea5-434e-a773-00d53087d27b`Mental state`Use this domain for words referring to a person's mental state. -3.1.2.1`e9ef98d9-8844-4804-88a5-614493d150f5`Alert`Use this domain for words referring to a mental state when the mind is working hard. -3.1.2.2`267b98aa-e17c-4ebb-a752-ed4210701867`Notice`Use this domain for words related to noticing something. -3.1.2.3`5b5bcd42-09bb-4c2f-a2da-569cfa69b6ac`Attention`Use this domain for words referring to a mental state when the mind is working hard. -3.1.2.4`878a313b-a201-444e-8bdb-67048d60c63e`Ignore`Use this domain for words related to ignoring someone--to not look at, listen to, or talk to someone because you think they are not important or you don't like them. -3.2`df9ee372-e92e-4f73-aac5-d36908497698`Think`Use this domain for words related to thinking, thought processes, and kinds of thinking. -3.2.1`7185bd93-5281-46de-80af-767f0ec40ff6`Mind`Use this domain for general words referring to the mind--the part of a person that thinks. -3.2.1.1`2a2af155-9db9-41c5-860a-fe0a3a09d6de`Think about`Use this domain for words related to thinking about something for some time. -3.2.1.2`be89e0ba-4c6a-4986-ac0d-859a901b89a1`Imagine`Use this domain for imagining things--to think about something that does not exist, or to think about something happening that has never happened. -3.2.1.3`48ac206f-2706-4500-bb63-2e499b790259`Intelligent`Use this domain for words that describe a person who thinks well. -3.2.1.4`1f3519f8-d946-4857-a1fd-553d98dddf6d`Stupid`Use this domain for words that describe a person who does not think well. -3.2.1.5`6866ee4c-78cd-47d1-ba4a-8461fdcc5e2a`Logical`Use this domain for words describing logical thinking. -3.2.1.6`3fd34185-19a1-44bd-8555-bc76e2847bee`Instinct`Use this domain for words related to instinct--to know something without being told, to know what to do without taught how to do it. -3.2.2`a42db5b4-6317-4d3f-beff-cb92dbaca914`Learn`Use this domain for words referring to learning something, acquiring information, gaining knowledge (whether done intentionally or unintentionally), or discovering the answer to some question. -3.2.2.1`f0e68d2f-f7b3-4722-80a4-8e9c5638b0d4`Study`Use this domain for words referring to studying--to try to learn something. -3.2.2.2`f39b14c4-52cf-4afa-956c-f0f5815ef6ac`Check`Use this domain for words referring to checking something--when you think something is true or correct, but you aren't sure, you do something to find out if it is true or correct. -3.2.2.3`167bfba5-0785-4bb5-a083-3ffbefa57897`Evaluate, test`Use this domain for words referring to the process of determining the truth or falsehood of something, or for determining the nature or value of something. -3.2.2.4`f1af3f4c-6e0e-4cfa-adcf-9dcddf05feab`Guess`Use this domain for words referring to answering a question when one is unsure of the answer. -3.2.2.5`909a3113-88bc-470b-8d48-7c0d37966982`Solve`Use this domain for words related to solving something--finding the answer to something that is difficult to understand. -3.2.2.6`eac4b58e-1fd7-4ce1-9a68-c7516470e876`Realize`Use this domain for words related to realizing something. -3.2.2.7`880647e5-6543-46dd-9178-8edae9272add`Willing to learn`Use this domain for words referring to being willing to learn or unwilling to learn. -3.2.3`07476166-c5e5-4701-97d3-d97de8b5be6f`Know`Use this domain for words referring to the results of thinking. -3.2.3.1`14954a0f-5c8a-4680-90b0-53398bd3a2a7`Known, unknown`Use this domain for words that describe whether or not something is known. -3.2.3.2`e3300171-d7b2-4fb4-a103-e8fdcf3ff2ed`Area of knowledge`Use this domain for words referring to an area of knowledge. -3.2.3.3`e0e8af5a-04c1-49a1-9955-9a2af7879068`Secret`Use this domain for words that describe whether or not something is known. -3.2.4`d10301f3-573c-4005-ad65-1c73fb80b3b6`Understand`Use this domain for words referring to understanding a topic or the meaning of something. -3.2.4.1`cab8e9dc-5e4f-4a12-8b3d-4acbb7ad2059`Misunderstand`Use this domain for when a person does not understand a topic or the meaning of something. -3.2.4.2`cba1f6cc-58ac-4d09-aa6a-1661f5945787`Understandable`Use this domain for words that describe something that is easy to understand. -3.2.4.3`6ea13b69-b2a8-41f9-b0bc-14316ebc5118`Mysterious`Use this domain for words that describe something that is difficult to understand. -3.2.5`541dfa10-bf97-4713-a534-9cbcc7f66bc9`Opinion`Use this domain for situations in which a question or issues are being debated, more than one option is possible, and a person chooses to think in one way about the question or issue. -3.2.5.1`c0f4715e-55c9-4379-ab6f-ad561a5e7151`Believe`Use this domain for words referring to believing that something is true. -3.2.5.1.1`691bdba3-c216-4b42-877c-674bbdb517a7`Trust`Use this domain for words referring to trusting someone--believing that someone is honest and will not do something bad to you. -3.2.5.2`0f46cb61-7bb5-410d-abc5-4a75dc80a24f`Disbelief`Use this domain for words referring to not believing something or someone. -3.2.5.3`6fc8ae4d-9fad-462e-9ea0-c613c3c1cb5e`Doubt`Use this domain for words related to doubt--not being sure if something is true or not. -3.2.5.4`fd9b8618-1f62-419b-85c3-365a12e85523`Agree with someone`Use this domain for when two people agree on something, think the same way about something, or agree on a decision. -3.2.5.4.1`1d5c798b-0f2d-49f2-bde6-cbcf2ef8fd02`Disagree`Use this domain for when two people disagree about something. -3.2.5.4.2`2855cda6-a031-46aa-bf3f-718d94374d46`Protest`Use this domain for words related to protesting--to say publicly that you do not like something. -3.2.5.5`b8e633f7-ca67-40cb-84e7-8b42887d161b`Philosophy`Use this domain for words referring to a set of beliefs about truth. -3.2.5.6`81e366fa-450b-42ad-b23f-7074dc7823e2`Attitude`Use this domain for words referring to a person's attitude--the way you think and feel about something. -3.2.5.7`3aab9c42-b696-4440-8e28-8380f5d25199`Extreme belief`Use this domain for words referring to an extreme belief--something that you believe, that most people think is not good. -3.2.5.8`6c6259f0-eca6-4a30-8662-eedbaf293527`Change your mind`Use this domain for words related to changing your mind--to change what you think about something, or change your plans or decisions. -3.2.5.9`a3f1d702-8ca1-457a-a569-eb6fdf696bbe`Approve of something`Use this domain for words related to approving of doing something--to think that doing something is good. -3.2.6`9f868391-f1df-4682-bdcb-2c2c799006cf`Remember`Use this domain for words referring to remembering something you know. -3.2.6.1`ce30eb9c-8260-476b-878c-0a078d596955`Forget`Use this domain for words referring to forgetting something. -3.2.6.2`a86b2e14-1299-4f59-842c-c4c5a401aace`Recognize`Use this domain for words referring to recognizing something. -3.2.6.3`65a928b8-8587-48be-8f23-41f85549c547`Memorize`Use this domain for words referring to memorizing something--to think hard about something so that you will not forget it. -3.2.6.4`45e90d41-a462-4671-968f-92166378b3f0`Remind`Use this domain for words referring to reminding someone about something--to make someone remember something. -3.2.7`5e3bb9e5-fd70-4c5a-95a0-938bc4876a47`Expect`Use this domain for words referring to thinking about the future. -3.2.7.1`aaf63abd-c8a5-4546-8fc1-a51c6e607683`Hope`Use this domain for words related to hoping that something will happen--to want something good to happen in the future. -3.2.7.2`218c1d59-0ebb-4936-b9cf-0a93e88aa729`Hopeless`Use this domain for words related to feeling hopeless--to thinking that nothing good will happen in the future. -3.2.7.3`c956a98a-4c85-4c85-868d-f27f44bd6422`Predict`Use this domain for words referring to predicting the future--saying what you think will happen. -3.2.8`05f95abb-163a-4927-83c5-8c81ef7b769c`Tendency`Use this domain for words indicating that the speaker thinks that something tends to be a certain way. -3.3`b50f39cb-3152-4d56-9ddc-4b98f763e76a`Want`Use this domain for words related to wanting something or wanting to do something. -3.3.1`af4ac058-d4b3-4c7a-ade8-6af762d0486d`Decide, plan`Use this domain for words related to deciding to do something. -3.3.1.1`b6b73d41-e23f-4f22-b01e-7e75f4115fce`Purpose, goal`Use this domain for words referring to a goal--something that you want to do or something that you want to happen. -3.3.1.2`fed2b7bd-2315-4085-b0a7-2ced988120f3`Choose`Use this domain for words related to choosing something--to want one thing (or person) from a group of things, or to choose to do one thing from several possible things you could do. -3.3.1.3`7337b2dd-b574-4a41-affa-2dfad7f6cdbc`Cast lots`Use this domain for words referring to casting lots--to make a decision by chance. -3.3.1.4`7bf77556-64df-428e-bfdd-095af5bfeeda`Intend`Use this domain for words related to intending to do something--to do something intentionally and not by accident. -3.3.1.5`26bc089a-a989-4763-be6c-05d127d1c0e8`Deliberately`Use this domain for words related to doing something deliberately--to intend to do something, as opposed to doing something accidentally. -3.3.1.6`15fb022e-1b45-41e9-bd8a-09ddc9dc6acd`Determined`Use this domain for words related to being determined to do something--deciding to do something and not letting anything stop you. -3.3.1.7`cc121082-2d07-484e-8a6f-7382f7d71f39`Stubborn`Use this domain for words related to being stubborn--to be unwilling to change a decision; to be unwilling to do something someone wants you to do; or to do what you want to do, even though other people do not want you to do it. -3.3.1.8`41b80f5d-0298-4d3c-b1a3-6d5e6c3985b1`Lust`Use this domain for words related to lusting for something--to want something bad or forbidden. -3.3.2`45f7b003-ade3-4efc-8dee-259dcbf80a4a`Request`Use this domain for words related to requesting something--to ask for something, or ask someone to do something. -3.3.2.1`d2e73238-ff99-4ba3-8ce6-d8ae98721710`Agree to do something`Use this domain for words related to agreeing to do something. -3.3.2.2`1137590c-6f2f-4b69-b04e-f6a890a335a2`Refuse to do something`Use this domain for words related to refusing to do something. -3.3.2.3`593073d6-9893-4670-98fb-c485406a950b`Intercede`Use this domain for words related to interceding for someone--to say something to someone because you want them to do something good for someone else. -3.3.2.4`6b19e828-f597-4d0d-b7a6-f52f3bbd041f`Willing`Use this domain for words related to being willing to do something. -3.3.3`5ea9301a-9906-4e81-97cf-48ee95a54c63`Influence`Use this domain for words related to influencing someone--to do something because you want someone to change his thinking. -3.3.3.1`8ea4e0d4-71a2-4583-a1fe-f1a941af8478`Suggest`Use this domain for words referring to suggesting something--saying that something might be good. -3.3.3.2`6bfb7813-3a7d-47e2-88e1-d54034c07e5d`Advise`Use this domain for words referring to giving someone advice or counsel, for instance recommending a wise course of action. -3.3.3.3`9d428e57-e125-4575-b165-9bc6fd4ec507`Persuade`Use this domain for words related to persuading someone--to try to get someone to do something or to change his thinking. -3.3.3.4`ad56dc48-9c39-43f6-9386-f7df80d93cd4`Insist`Use this domain for words related to insisting--to say strongly or repeatedly that someone must do something, because the other person does not want to do it. -3.3.3.5`6fbe39fb-a4cb-4fcf-830b-8875fd4324e0`Compel`Use this domain for words related to compelling someone to do something--to cause or force someone to do something that they do not want to do. -3.3.3.6`e6ec43ef-0100-4cf4-a047-c575ee8613b4`Control`Use this domain for words related to controlling someone--to force someone to do what you want them to do by ordering them to do it, or by doing something so that they have no choice. Also use this domain for words related to controlling something, for instance to control a machine, so that it does what you want it to do. -3.3.3.7`3445e61b-61a3-4ede-93f5-402ebe9ca51c`Warn`Use this domain for words related to warning someone--saying something to someone so that he will not do something bad. -3.3.3.8`c1c1dcb4-8fe5-43ac-9b91-b2b2bc33de5b`Threaten`Use this domain for words related to threatening someone--to say that you will do something bad to someone if they don't do what you want them to do. -3.3.4`8383b4cb-e14a-4d04-a8c3-9c5276384953`Ask permission`Use this domain for words related to asking permission to do something. This domain is part of a scenario: You have authority over me. I want to do something. I ask you for permission to do it. You give permission or refuse permission. I obey you or disobey you. -3.3.4.1`a3e905b8-107b-4311-bb50-0abe151131b3`Give permission`Use this domain for words related to giving someone permission to do something. This domain is about a scenario: You have authority over me. I want to do something. I ask you for permission to do it. You give permission or refuse permission. -3.3.4.2`8f46496a-d5b2-411d-944d-9d4d4b6f2e31`Refuse permission`Use this domain for words related to refusing to permit someone to do something. -3.3.4.3`b6baa8bf-7691-431d-8715-3937372b9da0`Exempt`Use this domain for words related to being exempt from a law or obligation. -3.3.4.4`66fc9a08-3661-4dd5-94b0-1eea41fb4554`Prevent`Use this domain for words related to preventing someone from doing something. -3.3.4.5`c8c74ec6-3f7a-4b45-b0e9-399b97c4a800`Free to do what you want`Use this domain for words related to freedom--when you can do the things that you want to do. -3.3.5`7c9c6263-9f7d-472c-a4c9-1767015d41fe`Offer`Use this domain for words related to offering to do something for someone. -3.3.5.1`dafc4b97-2b70-4986-b2b4-c05eb060786d`Accept`Use this domain for words referring to accepting something such as an offer, invitation, or request. -3.3.5.2`612424b8-997e-4661-a452-772e14a3c4a0`Reject`Use this domain for words referring to rejecting something such as an offer, invitation, or request. -3.4`cb95189c-8c74-465b-af07-48e08dbf7c39`Emotion`Use this domain for general words related to feelings and emotions. -3.4.1`474aa982-8350-47e2-a983-e1e2bce9d928`Feel good`Use this domain for general words related to positive emotions. -3.4.1.1`d030f0c7-31a3-47da-be35-46f1eba63ae9`Like, love`Use this domain for words related to liking something or someone, or liking to do something. -3.4.1.1.1`50eb32a2-6dbb-4b7c-b370-aacdcfeaf5fc`Enjoy doing something`Use this domain for words related to enjoying doing something. -3.4.1.1.2`ce6d5e60-7cf6-46ab-bd02-453ec7b04f7a`Self-esteem`Use this domain for words related to feeling good about yourself. -3.4.1.1.3`ef409fc6-bd89-4cc6-ade5-abb882272313`Prefer`Use this domain for words related to preferring one thing over another--to like something more than something else. -3.4.1.1.4`ac550d1f-ec74-46a8-bf81-7832ace533ee`Popular`Use this domain for words describing something that many people like. -3.4.1.1.5`e54cd744-d106-4bcf-bd07-b8783c075c21`Fashionable`Use this domain for words describing something that many people like. -3.4.1.1.6`f0fdbdfa-094e-4bec-ae19-af23d2c02ed6`Contentment`Use this domain for words related to feeling contented. -3.4.1.1.7`4aedd6d3-8f4b-4986-8d51-b0ace0137bf0`Happy for`Use this domain for words related to feeling happy for someone--to feel good because something good happened to someone. The opposite is jealousy and envy. -3.4.1.1.8`46b13a77-fe12-49fb-afbe-826480ec97f4`Pleased with`Use this domain for words related to feeling pleased with someone--to feel good because someone did something good. -3.4.1.2`afa77a2a-8b0f-4a39-91bc-040e90ffbb3a`Happy`Use this domain for words related to feeling happy--to feel good when something good happens (such as receiving a gift, hearing good news, or watching something good happening). -3.4.1.2.1`26fb2e94-b8fe-4216-9057-ca17a71df83b`Relaxed`Use this domain for words related to feeling relaxed--to feel good when you are not working and nothing bad is happening. -3.4.1.2.2`9351d5b6-5a87-422a-9e82-ca6a0bacd3e9`Calm`Use this domain for words related to feeling calm. -3.4.1.3`0e590da7-c027-42e0-b580-f65686cee461`Surprise`Use this domain for words related to feeling surprised--to feel something when something unexpected, unusual, or amazing happens. -3.4.1.4`f9d020d6-b129-4bb8-9509-3b4a6c27482e`Interested`Use this domain for words related to feeling interested. -3.4.1.4.1`00364f0c-9a3a-4910-a82e-1ffbc4d4137f`Excited`Use this domain for words related to feeling excited--to feel good when something good has happening or is about to happen. -3.4.1.4.2`85912845-21b0-41eb-8b8c-1f5c3d53df08`Enthusiastic`Use this domain for words related to feeling enthusiastic--to feel very good because you want to do something or you want something to happen. -3.4.1.4.3`1c0c4951-03b6-49b8-8a8e-724397cfd5a7`Obsessed`Use this domain for words related to feeling obsessed--to be very interested in something for a long time. -3.4.1.4.4`bb2a112f-af6f-4a54-bbf0-ba7b8289e58b`Attract`Use this domain for words related to attracting someone's attention to something. In a typical situation, a person sees something with an interesting quality. The person moves closer, pays close attention to the thing, and possibly does something to it. -3.4.1.4.5`5c31bdf6-901f-4f14-ab64-7a99524710fc`Indifferent`Use this domain for words related to feeling indifferent about something. -3.4.1.4.6`0fa0be21-2246-40b2-86b1-ca572fe8c16c`Uninterested, bored`Use this domain for words related to feeling uninterested or bored--when someone is not interested in something. -3.4.1.5`e0a8e1d9-c43e-4092-a8dc-476a3417924e`Confident`Use this domain for words related to feeling confident--to feel sure that you can do something. -3.4.2`60dc7cf6-0a41-4cd3-99a6-0b7a71488e7e`Feel bad`Use this domain for general words related to feeling bad. -3.4.2.1`6142c173-161a-47d5-bdec-c827518fd67c`Sad`Use this domain for words related to feeling sad--to feel bad because something bad has happened (such as losing something, hearing bad news, or watching something bad happening). -3.4.2.1.1`82ecb5b3-9128-4b38-b9c5-612857417ceb`Dislike`Use this domain for words related to not liking someone or something. -3.4.2.1.2`97393c87-07e2-4633-88f9-c8bf4d9b935c`Hate, detest`Use this domain for words related to hating someone or something--to dislike someone or something very much. -3.4.2.1.3`8d5c28b8-91be-40b0-b6c2-4d5adbb495a3`Disgusted`Use this domain for words related to feeling disgusted--to dislike something so much that you feel sick. -3.4.2.1.4`2e30f02d-d1e6-489c-a1fb-8b9fb6ecd819`Disappointed`Use this domain for words related to feeling disappointed--to feel bad because something did not happen that you wanted to happen or someone did not do something that you wanted them to do. -3.4.2.1.5`39611e8d-cc67-4c84-977c-094c5cbe9dbc`Lonely`Use this domain for words related to feeling lonely--to feel bad because you are alone and not with people you love. -3.4.2.1.6`bfe8902a-32a7-4092-93b2-9dcf3dce205f`Upset`Use this domain for word related to feeling upset--to feel very bad because someone has done something bad to you or because something bad has happened to you, so that your thinking and behavior is affected. -3.4.2.1.7`67d10a00-fda8-4a3a-becd-f3ae3b00fcca`Shock`Use this domain for words related to feeling shocked--feeling both surprised and angry when something very bad suddenly happens or when someone does something very bad. -3.4.2.1.8`262fc4ae-7735-465b-934b-2125d95de147`Jealous`Use this domain for words related to feeling jealous--to feel bad when someone does well, has something good, receives something good, or something good happens to them, because you want what they have. Also use this domain for words for when a husband (or wife) is jealous because he thinks his wife loves someone else. -3.4.2.1.9`f3654a7f-d16e-4870-9ef0-4b4268faeffb`Discontent`Use this domain for words related to feeling discontent. -3.4.2.2`da39c0d9-a5c1-4f10-bd3b-4e988abcab5a`Sorry`Use this domain for words related to feeling sorry--to feel bad about something bad that you did. -3.4.2.2.1`43cb3488-711b-4d9d-9d0e-03d0c1f6eb8b`Ashamed`Use this domain for words related to feeling ashamed--to feel bad because people think you did something bad. -3.4.2.2.2`e08e252a-9227-42e4-bcb8-b803d25071b6`Embarrassed`Use this domain for words related to feeling embarrassed--to feel bad in front of other people because you did or said something that makes you seem stupid. -3.4.2.3`2a62f8e4-7da3-4f37-bf44-e24033c99c00`Angry`Use this domain for words related to feeling angry--to feel bad when someone does something wrong and to want to do something bad to them. -3.4.2.3.1`8ce6709f-f772-4638-a1aa-c132666f3563`Annoyed`Use this domain for words related to feeling annoyed--to feel a little angry because someone keeps doing something you don't like. -3.4.2.4`2b6f9af7-04ee-4030-a2cd-87d55959caa8`Afraid`Use this domain for words related to fear--to feel bad because you think something bad might happen to you. -3.4.2.4.1`ba1e8d2b-7d3e-4b65-a9be-ee1a4063c796`Worried`Use this domain for words related to feeling worried--to feel bad because you think something bad might happen. -3.4.2.4.2`64e3d6b1-1d61-454c-97ab-e1d7cb0a8917`Nervous`Use this domain for words related to feeling nervous--to be worried and frightened that something bad may happen, so that you are unable to relax. -3.4.2.4.3`100e62a6-b6f4-4b30-b317-0517d6b102a9`Shy, timid`Use this domain for words related to feeling shy--to feel bad (afraid) when you are with people because you think they might think something bad about you if you say or do something (for instance, being afraid to talk, feeling inadequate to do what is required in a social situation, or not feeling as good as other people). -3.4.2.5`8052744f-7a9a-49da-89e3-4c518126180b`Confused`Use this domain for words related to feeling confused--to be worried and uncertain about what something means or what to do. -3.5`c9aee4df-ac3e-4159-bd1a-060db1a5f070`Communication`Use this domain for general words referring to communication of all kinds. -3.5.1`9efa7949-de15-499a-b382-4560e06c4fb4`Say`Use this domain for words related to saying something. -3.5.1.1`1e9a0881-f715-4057-9af8-251cb8eec9da`Voice`Use this domain for words referring to a person's voice and the way it sounds--the kind of sound a person makes when they speak or sing. -3.5.1.1.1`8c7da1d1-d7d7-470c-b6a3-edefb0e9a4d2`Shout`Use this domain for words related to shouting--to speak loudly. -3.5.1.1.2`9612bdd6-15cb-4269-aaf9-481c7b35b5dd`Speak quietly`Use this domain for words that describe a person speaking quietly. -3.5.1.1.3`b2fa4109-1165-4c1f-9613-c5b2d349d2d4`Speak a lot`Use this domain for words related to speaking a lot. -3.5.1.1.4`78b0ad1b-0766-41ba-b788-d176addd5e9f`Speak little`Use this domain for words related to speaking a little, either because you do not like to talk, or you think you should not talk. -3.5.1.1.5`f5642647-9b9c-499b-a66e-349593c863f1`Say nothing`Use this domain for words related to being silent--to say nothing for some time. -3.5.1.1.6`e482bb5a-5a32-4bc5-a0de-32cbe0aa7908`Speech style`Use this domain for words describing the way a person talks in a particular social situation. -3.5.1.1.7`e96f6860-0914-4324-9c49-48f24a0ff7f1`Speak well`Use this domain for words related to speaking well. -3.5.1.1.8`8f779877-7d86-4683-8a8b-298c7fc62815`Speak poorly`Use this domain for words related to speaking poorly. -3.5.1.2`e45b8bac-9623-4f84-a113-9dec13a8db64`Talk about a subject`Use this domain for words related to talking about a subject. -3.5.1.2.1`1148684a-0f44-4b5a-9e3e-3823163cd4a1`Announce`Use this domain for words related to announcing something--communicating something to many people. -3.5.1.2.2`dc1ab28c-3e1e-474c-8359-2548b7ad5595`Describe`Use this domain for words related to describing something--to say some things about something. -3.5.1.2.3`e080687b-0900-4dd0-9677-e3aaa3eae641`Explain`Use this domain for words related to explaining something--to help someone to understand something. -3.5.1.2.4`7ad54364-ca8c-4b7c-9748-f83efb44d0ea`Mention`Use this domain for words related to mentioning something--to talk about something but without saying much about it. -3.5.1.2.5`67d282f8-151d-429b-8183-6a7d2f5ac98d`Introduce`Use this domain for words related to introducing a new subject--to start talking or writing about something new for the first time. -3.5.1.2.6`0539de86-f407-4b3d-b1b8-028822fb9f26`Repeat`Use this domain for words related to repeating something--saying something a second time. -3.5.1.2.7`728bbc7c-e5b3-47d8-8532-72239e5c88bb`Summarize`Use this domain for words referring to summarizing what you have said or what someone else has said. -3.5.1.2.8`49cd2c20-098a-46d9-9e47-6bf109308793`Emphasize`Use this domain for words related to emphasizing something--to say something in a way that other people know that you think this thing is important. -3.5.1.2.9`06b23bcd-69df-471a-b5a5-4ca8cab7f0d9`Be about, subject`Use this domain for words that express the idea that something (said, written, thought, or made) depicts or is about a subject, or that something is logically related to some topic. Also use this domain for words that mark the topic or subject of what is being thought about, talked about, or written about. Verbs of thinking, knowing, or speaking (including other types of expression) can take a 'topic' role. We can think of a 'topic' as the main idea. Use this domain also for the important thing in a picture. -3.5.1.3`ac2e424b-6aee-4031-8864-7b3f4a6fb5a3`True`Use this domain for words that indicate if something is true, if it agrees with reality, or if it is not true. -3.5.1.3.1`3bc961d1-9f4f-4f1b-ada7-b1e9a2928ea4`Tell the truth`Use this domain for words related to telling the truth. -3.5.1.3.2`9f0bcab1-8256-47a1-853c-408f025e04e7`Tell a lie`Use this domain for words related to lying--to say something that is not true. -3.5.1.3.3`02b6da2b-fae3-49f4-83f0-fd014024e117`Contradict`Use this domain for words related to contradicting someone--to say that something someone has said is not true. -3.5.1.3.4`016e3f5b-b527-446e-9da6-49af34870001`Expose falsehood`Use this domain for words related to exposing falsehood--to do something to show that someone has told a lie. -3.5.1.3.5`51d9d243-35cc-4a1e-bcdd-f2749975f5fd`Real`Use this domain for words that indicate if something is real. -3.5.1.3.6`ab8ca07c-b23c-43dc-b705-7fe34ddf6d4d`Exaggerate`Use this domain for words referring to exaggerating--reporting information but saying something untrue that makes the information seem bigger or more important than it really is. -3.5.1.4`ec1bcace-fc10-45df-8e1f-29bce1ef786a`Speak with others`Use this domain for words referring to carrying on a conversation with other people. -3.5.1.4.1`14a32765-81b0-411e-89fa-91e092a70818`Call`Use this domain for words related to calling someone--to say something loud because you want someone who is far away to listen to you. -3.5.1.4.2`e033ca92-ee8c-4ab9-9368-5f6f4e942987`Contact`Use this domain for words related to contacting someone--to communicate with someone who is far away from you using some communication device such as a telephone. -3.5.1.4.3`52b04e15-7062-4fb2-9eaa-4fe8726f302a`Greet`Use this domain for words related to greeting someone. -3.5.1.4.4`a9625460-7162-447c-b400-84fbc5744f1b`Say farewell`Use this domain for words related to saying farewell. -3.5.1.4.5`45b9bf61-3138-4206-9478-b4d3f082358b`Speak in unison`Use this domain for words related to speaking in unison--to say something at the same time as someone else. -3.5.1.5`77b4d6c1-87bf-4839-b4be-6a45119b700a`Ask`Use this domain for words related to asking a question. -3.5.1.5.1`5fdf3946-7e47-4fd2-906f-4da7ce5fa490`Answer`Use this domain for words related to answering a question. -3.5.1.5.2`a30e0391-ea64-4938-9eca-023c351d60af`Disclose`Use this domain for words that refer to discovering and revealing unknown information. -3.5.1.5.3`16dbd62c-f60d-4530-ba4e-0e74221e4681`Hide your thoughts`Use this domain for words related to hiding your thoughts. -3.5.1.6`eafdea8e-521e-4614-8fd5-e8446adf9203`Debate`Use this domain for words referring to debating--for two or more people to discuss some issue and try to persuade the other person to accept one's view. -3.5.1.6.1`ebac5ec8-dc4c-4b2b-a727-3ca82404cdbb`Demonstrate`Use this domain for words referring to demonstrating something--to do something that shows the truth of a statement, or shows how to do something. -3.5.1.6.2`e5020b79-6fb0-4be4-a359-d4f899da5c7e`Quarrel`Use this domain for words related to quarreling--to fight with words. -3.5.1.7`a4958dd9-03cc-4863-ab76-cd0682060cb0`Praise`Use this domain for words related to praising someone or something--to say something good about someone, or to say that someone did something good. -3.5.1.7.1`27048124-c204-4585-9997-c51728f085d6`Thank`Use this domain for words related to thanking someone--to tell someone that you feel good about something they did for you. -3.5.1.7.2`53d34f16-2f94-4afa-9530-7ac75e05b8d4`Flatter`Use this domain for words referring to flattering someone--saying something nice to someone but not meaning it. -3.5.1.7.3`80415fac-b3d8-4e3c-bdb8-dc92f3c6dad8`Boast`Use this domain for words related to boasting--to say something good about yourself, especially to make it seem that you are better than you really are. -3.5.1.8`bc9d763c-e4fe-48ab-ad44-87a36f6cc06f`Criticize`Use this domain for words related to criticizing someone or something--to say that something is bad, especially something that someone did. -3.5.1.8.1`c79d49f1-74ec-4dba-a5aa-5e861af63d05`Blame`Use this domain for words related to blaming someone for something--to say that someone did something, and because of this something bad happened. -3.5.1.8.2`81b62078-984c-4e82-94c4-39fa44dd3e56`Insult`Use this domain for words related to insulting someone--to say that someone is bad. -3.5.1.8.3`e2d3294b-4463-48bb-95e4-8c9b5238ecec`Mock`Use this domain for words referring to mocking someone--doing or saying something to make people laugh at someone because you don't like them. -3.5.1.8.4`7bca1201-31f8-4f65-8da9-af0eff36b388`Gossip`Use this domain for words related to gossip--to say something bad about a person who is not with you. -3.5.1.8.5`f3dbb078-6265-4861-a6e3-46cc151c5d72`Complain`Use this domain for words related to complaining--to say that you don't like something. -3.5.1.9`3dba39bc-48f2-4bcb-9357-c8fbed6922ca`Promise`Use this domain for words related to promising to do something--to say that you will do something in the future. -3.5.2`05472990-3f51-40b3-bca8-df3cf383328b`Make speech`Use this domain for words related to making a speech--to talk for a long time to many people. -3.5.2.1`cc3f1dc8-a31e-4459-ba13-f82b45df37b5`Report`Use this domain for words related to reporting something--to say that something has happened and to tell about it. -3.5.2.2`f2342d42-bdc4-449c-9891-58f90318b9f1`News, message`Use this domain for words referring to something someone says, which relays information from someone else, or about something someone has done. -3.5.2.3`22e8f542-0ab1-4f25-af50-fd0d02917fda`Figurative`Use this domain for words referring to figurative speech--saying something that is not meant to be understood literally (according to the normal meaning of each word), or saying something that compares one thing to another. -3.5.2.4`7158c621-c46e-4173-80c1-188f514a920f`Admit`Use this domain for words referring to admitting something--saying that you have done wrong, or that your beliefs were wrong -3.5.3`bc96b3e3-6185-4925-b79e-8f0f9555bfb7`Language`Use this domain for words referring to a language. -3.5.3.1`29a8ebbe-ebc4-4295-b6af-84331d019361`Word`Use this domain for words that refer to words and groups of words. -3.5.3.2`4a388000-d5c6-4127-91cd-f4e0c9fac6f1`Information`Use this domain for words referring to information--something someone says about something. -3.5.4`3160b7ad-e4e8-4a46-8e2e-d5e601969547`Story`Use this domain for words referring to a story. -3.5.4.1`f0404b23-db91-46c7-87e1-9f1be0712980`Fable, myth`Use this domain for words referring to a fable or myth--a story that people tell that is not true. -3.5.4.2`65ef6aae-019f-4980-b6d9-5b7ad2c8e68f`Saying, proverb`Use this domain for words referring to a saying or proverb--a short thing that people say to teach something. -3.5.4.3`26d32f3e-ced6-45fc-afd0-7e017fa252c6`Riddle`Use this domain for words referring to a riddle--something someone says that is hard to understand. -3.5.4.4`f0f3c371-166e-4a66-849f-60d6fa7ad889`Poetry`Use this domain for words related to poetry. -3.5.4.5`2629943b-3a69-4c6b-9956-2aa59ebd03d3`History`Use this domain for words related to history. -3.5.4.6`a4fa9f98-73c6-4c3e-9dad-d73d2634be3b`Verbal tradition`Use this domain for words referring to verbal tradition--something that your ancestors told to each successive generation. -3.5.5`f4b77866-c607-43f0-b816-95459c269525`Foolish talk`Use this domain for words related to foolish talk--something someone says that other people think is silly or stupid. -3.5.5.1`59a95939-44d7-4396-9ef7-3a80c17e9fb1`Obscenity`Use this domain for obscene words related to sex, defecation, death, damnation, and other taboo or offensive subjects. It is important to check the appropriateness of including obscene words in the dictionary. It should be the choice of the speakers of the language whether a word should be included or excluded. Obscene words included in the dictionary should be clearly marked as such. Obscenity is often used to heighten the emotion of an expression, and is often used when someone is angry. Obscenity is often associated with sex or defecation. Cursing is often associated with God, religion, or the afterlife. Insults often involve equating a person with an animal that is associated with an undesirable characteristic, questioning someone's parentage/legitimacy, questioning someone's character, or questioning someone's intelligence/sanity. -3.5.6`767aa167-af3d-4e11-a68b-ec31f9d2ef1a`Sign, symbol`Use this domain for words referring to a sign or symbol--a picture or shape that has a meaning. -3.5.6.1`96a1ad48-1a70-425b-bd20-59294902581f`Gesture`Use this domain for words referring to gesturing--moving a part of the body to communicate a message. -3.5.6.2`ef876104-eb3e-420d-9c7b-124538a7b2a6`Point at`Use this domain for words related to pointing at something--to move a part of your body toward something so that people will look at it. -3.5.6.3`339f54a5-125b-435f-bf37-cfc2a2bd26d3`Facial expression`Use this domain for facial expressions--ways in which people move the parts of their faces to show feeling or communicate something. -3.5.6.4`cbc0a8f5-9cba-41d2-a7e5-565fbf09c8c4`Laugh`Use this domain for words related to the expression of good feelings, including laughing--the sounds a person makes when he is enjoying himself or thinks something is funny. -3.5.6.5`b4fe4698-54a2-4bcd-9490-e07ee1ee97af`Cry, tear`Use this domain for words related to crying--when water forms in the eyes because of sadness or pain. -3.5.7`70eac6be-66e8-4827-8f2f-d15427efff60`Reading and writing`Use this domain for general words related to reading and writing. -3.5.7.1`af700054-258a-458a-9e38-e90397833e51`Write`Use this domain for words related to writing. -3.5.7.2`8db7c016-bdc9-410b-9523-3197602358f4`Written material`Use this domain for words referring to written material--something that has writing on it. -3.5.7.3`710828bc-5dfb-4685-b1a5-156700ab08f1`Read`Use this domain for words related to reading. -3.5.7.4`50ac28ab-7385-408f-b5eb-3e27b191fcf4`Publish`Use this domain for words related to publishing books. -3.5.7.5`ba8d18bd-2556-47a0-aa33-3ebef3e90814`Record`Use this domain for words related to a record--something written because people need to remember it. -3.5.7.6`b7801f6e-683b-4d5d-9bab-57f6e593db8c`List`Use this domain for words related to a list of things. -3.5.7.7`d586a164-ac8f-4356-8aa8-07721c2b5e09`Letter`Use this domain for words referring to letter--a written message that is sent to someone. -3.5.8`c4330001-83ca-485d-8b9b-09f7e1be60cc`Interpreting messages`Use this domain for words referring to interpreting something someone says--to try to understand the meaning of something someone says and express it in other words. -3.5.8.1`8894cac9-c82a-4616-856e-0516d2ed1df7`Meaning`Use this domain for words related to the meaning of something that is said. -3.5.8.2`edf17f72-7e7a-4f8d-a5ee-f4889492d73a`Meaningless`Use this domain for words describing something that is meaningless--something someone says that doesn't mean anything. -3.5.8.3`751bd45c-abfb-443f-ac55-aad3472c20de`Unintelligible`Use this domain for words related to being unintelligible--to say something that someone cannot understand. -3.5.8.4`8225de87-35a3-4c7a-b35c-f45b152caebe`Show, indicate`Use this domain for words referring to showing or indicating something--if something (such as an object, something said, or something that happens) shows something, it makes people think of something or understand something (e.g. When his face turns red, it indicates he is angry.) -3.5.9`cac1d7a8-7382-466e-ba4a-ba2bfe50f13b`Mass communication`Use this domain for words related to radio, television, newspapers, magazines and other forms of mass communication. -3.5.9.1`eef8c50e-c391-482c-9f60-1bba2d8892b3`Radio, television`Use this domain for words related to radio and television. -3.5.9.2`32bf055a-d666-4d6e-a3c6-6c984e2c9868`Telephone`Use this domain for words related to the telephone. -3.5.9.3`12781062-ee36-4703-9bc0-cee4ed467ee5`Newspaper`Use this domain for words related to newspapers and magazines. -3.5.9.4`4f516445-e044-4d9c-ac9b-a3178f72b405`Movie`Use this domain for words related to movies and the cinema. -3.5.9.5`80dc5ca1-44ce-4406-add8-2bbe19c122ab`Recorded music`Use this domain for words related to recording music. -3.5.9.6`8d266c98-9db3-4d3e-b204-956aa848ffa5`Communication devices`Use this domain for words related to communication devices. -3.6`6137239a-b469-46be-b7cb-b9ac22fcc195`Teach`Use this domain for words related to teaching. -3.6.1`4093bfe8-54b3-4ffc-bfe3-3999279840b5`Show, explain`Use this domain for words related to showing someone how something works, or explaining something to someone. -3.6.2`3fdba5e5-eb24-4b2f-a6fc-d1ed7397c39c`School`Use this domain for words related to school. -3.6.3`1fa683b9-78fd-4feb-9978-55d5953f38ec`Subject of teaching`Use this domain for words related to a subject that is taught or a subject that you study at school. -3.6.4`e4bacc52-dcaa-4e68-b736-f0b5d9aeca41`Class, lesson`Use this domain for words related to a class--the period of time when a subject is taught. -3.6.5`87dd09b8-689c-4a56-b3f6-846a849f71b8`Correct`Use this domain for words related to correcting a mistake. -3.6.6`1886ffc9-0a18-41ea-b2f6-c17c297f1681`Science`Use this domain for words related to science. -3.6.7`1688280e-27c4-47a8-87b7-8fe31b174ab8`Test`Use this domain for words related to a test. -3.6.8`51d4e258-430c-4032-94e3-ee53095e7045`Answer in a test`Use this domain for words related to the answer to a question in a test. -4`62b4ae33-f3c2-447a-9ef7-7e41805b6a02`Social behavior`Use this domain for very general words having to do with how people behave in relationship to other people. -4.1`0e79435b-f5ff-4061-81ff-49557ba2aed4`Relationships`Use this domain for words related to relationships between people and groups of people. -4.1.1`646dab64-5c2f-4f45-8e28-4d13437639d4`Friend`Use this domain for words related to friendship. -4.1.1.1`b40637e5-be76-4a82-96bb-c55306ee293d`Girlfriend, boyfriend`Use this domain for words referring to a girlfriend or boyfriend. -4.1.2`995751ef-d71b-429c-a4ee-032f5b309bd7`Types of people`Use this domain for words referring to different types of people. -4.1.2.1`513771eb-8467-468a-8bc8-e52567e66df9`Working relationship`Use this domain for words related to a relationship between people who work together. -4.1.3`469b0a30-3c26-4cfd-b948-7bb952eeff41`Know someone`Use this domain for words referring to knowing someone. -4.1.3.1`b5d679e3-506a-4994-81a2-be48a698d945`Meet for the first time`Use this domain for words related to meeting someone for the first time. -4.1.4`d49f2c9d-1b4a-4370-b107-71f9b9fbdc8e`Neighbor`Use this domain for words referring to a neighbor--someone who lives nearby. -4.1.4.1`aec8c246-0ef7-414a-94a6-b9fdd6812a7c`Social class`Use this domain for words related to social class. -4.1.5`9ac6dec6-1b8f-463c-8239-e2acb93586b1`Unity`Use this domain for words related to unity--when a group of people agree with each other and are not fighting. -4.1.6`d59a84e1-5e12-4cb7-b72b-15c51810ad48`Disunity`Use this domain for words related to disunity--when a group of people do not agree with each other and are fighting. -4.1.6.1`eaed8c63-9f97-4116-927c-19f364a99e72`Unfriendly`Use this domain for words related to being antisocial--when someone does not want to talk to other people or be friends with them. -4.1.6.2`a8b2abb3-d09f-4ff1-89ce-6ae99f16401c`Set self apart`Use this domain for words related to setting yourself apart from other people and not relating to them. -4.1.6.3`4651aef1-e18f-481e-9c3e-d9dfff4a6b51`Alone`Use this domain for words related to being alone. -4.1.6.4`0ac81210-20ff-4a89-948f-5d154668f05c`Independent person`Use this domain for words describing an independent person--someone who does things without other people's help. -4.1.6.5`c223335b-4803-4f1b-bf4d-f1ee077513cf`Private, public`Use this domain for words describing something that is private--something that only concerns you, and for words describing something that is public--something that concerns many people. -4.1.7`675d67bb-da64-456e-8825-bdf074bb82be`Begin a relationship`Use this domain for words related to beginning a relationship. -4.1.7.1`06341e45-c407-49d0-98d8-74ecc303fb02`End a relationship`Use this domain for words related to ending a relationship. -4.1.8`aeb20093-26ba-492b-a69d-af18d5ba51eb`Show affection`Use this domain for words related to showing affection. -4.1.9`e7c58c11-2911-446a-96b0-2113247f3792`Kinship`Use this domain for general words for family relationships, not for specific terms. -4.1.9.1`529140d1-6e8e-44fe-99f0-95289e933607`Related by birth`Use this domain for words referring to being related by birth--when one of your ancestors and one of someone else's ancestors are the same person. -4.1.9.1.1`d1e58469-52e3-4b50-b0de-00bf9f09f8d4`Grandfather, grandmother`Use this domain for words referring to grandparents and ancestors. -4.1.9.1.2`44dc42e4-e9c7-4aa9-ac9b-1008385244b1`Father, mother`Use this domain for words related to parents. -4.1.9.1.3`bb29001e-97f3-4bb4-8946-7c33b9835fcb`Brother, sister`Use this domain for words related to siblings. -4.1.9.1.4`87c499b3-5fab-45e0-9999-9c4fcbba1e2b`Son, daughter`Use this domain for words referring to your children. -4.1.9.1.5`f47d681b-4f0d-43ca-a465-2e1724825752`Grandson, granddaughter`Use this domain for words referring to your grandchildren. -4.1.9.1.6`75202262-cdba-4c43-9343-764c84138797`Uncle, aunt`Use this domain for words related to your uncles and aunts. -4.1.9.1.7`f957a4aa-d3d4-4dad-93d1-20565b5158d4`Cousin`Use this domain for words referring to your cousins. -4.1.9.1.8`eb0c9e02-e4c1-4e5e-84b6-be63aaf439d5`Nephew, niece`Use this domain for words referring to your nephews and nieces. -4.1.9.1.9`89944377-8694-4394-bced-153cc22a0e30`Birth order`Use this domain for words related to birth order. -4.1.9.2`49bc0d75-4f07-44b4-a50f-bc9a557dc15e`Related by marriage`Use this domain for words referring to being related by marriage. -4.1.9.2.1`a4627ca8-f27b-44ce-91f5-cc992332bc86`Husband, wife`Use this domain for words related to your spouse. -4.1.9.2.2`89ad4e41-bf08-4d93-a4f3-f72e8cc62bed`In-law`Use this domain for words referring to being related by marriage. -4.1.9.3`04370e1f-25aa-4d9e-97c5-de9b59156666`Widow, widower`Use this domain for words referring to widows and widowers. Some languages also have words for a parent who has lost a child, someone who has lost a brother or sister, or a general word for someone who has lost a relative. -4.1.9.4`57237095-23cf-43ba-aa6c-89cecdd35ff8`Orphan`Use this domain for words referring to orphans. -4.1.9.5`0656f6a7-9a88-4c03-a8ab-ace8c0f52ebf`Illegitimate child`Use this domain for words referring to an illegitimate child. -4.1.9.6`4405e74c-f64c-4609-8f7b-99ba563d659a`Adopt`Use this domain for words related to adopting a child. -4.1.9.7`fa41dbc5-adbb-4ad0-9fd2-0278d4689a28`Non-relative`Use this domain for words that refer to people who are not related by blood or marriage. -4.1.9.8`a781d57d-174d-47a6-b6a1-ae635a13df84`Family, clan`Use this domain for words that refer to social groups composed of related people. -4.1.9.9`6cbdaf94-8e2c-4b26-936a-d2f86d158250`Race`Use this domain for words referring to different races of people--the large groups of people in the world that are different in color and appearance. -4.2`57225f57-ba51-45d7-b6d2-b22052877ea4`Social activity`Use this domain for general words referring to social activities. -4.2.1`935da513-126e-4cab-8e07-625458821181`Come together, form a group`Use this domain for words referring to coming together to form a group. -4.2.1.1`7459c0d8-4da1-4944-a95e-bc64cde860f5`Invite`Use this domain for words referring to inviting people to meet together--to say something to someone because you want to meet with them. -4.2.1.2`6709cc78-cb0b-493e-b3e6-8590a2f20c95`Encounter`Use this domain for words referring to encountering someone. -4.2.1.3`c358b041-7a1a-43d6-8e61-26b9507f559f`Meet together`Use this domain for words related to meeting together. -4.2.1.4`4f19ab95-428a-4a0b-a069-ca8be6b72b08`Visit`Use this domain for words related to visiting someone. -4.2.1.4.1`252886c4-9317-4c6b-a69e-13520eb89736`Welcome, receive`Use this domain for words related to welcoming a visitor. -4.2.1.4.2`17851b86-f8fb-4850-9b33-c1a9fcb0aec1`Show hospitality`Use this domain for words related to showing hospitality to a visitor. -4.2.1.5`54b6dff4-a21d-490d-8279-69f36a179c93`Meeting, assembly`Use this domain for words referring to a meeting. -4.2.1.6`efd03c89-bf8b-4d46-a921-06cc06f28356`Participate`Use this domain for words related to participating in a group--to do things with a group. -4.2.1.7`87eb572c-bae2-45d8-a36a-919561b55d0d`Crowd, group`Use this domain for words referring to a crowd or group of people. -4.2.1.8`86f90eff-158b-4f6d-82e9-fab136dfd141`Organization`Use this domain for words referring to an organization. -4.2.1.8.1`e3a6f918-4b0f-4515-bd6c-4f3370bcbf67`Join an organization`Use this domain for words related to joining an organization. -4.2.1.8.2`e173f481-ec57-4d1c-b517-be38ccb038f5`Leave an organization`Use this domain for words related to leaving an organization. -4.2.1.8.3`92ef1096-bae2-4bc5-b4b8-c16f429c4867`Belong to an organization`Use this domain for words related to belonging to an organization. -4.2.1.9`f81b7632-3e5a-4a2d-8a93-648872a6616b`Social group`Use this domain for words referring to an organization. -4.2.2`c4b110cf-d968-4bc6-ac0c-7e70cbad2756`Social event`Use this domain for words referring to a social event. -4.2.2.1`71cbefc3-e0a5-4b97-9672-fa0cb34c59e4`Ceremony`Use this domain for words referring to a ceremony. -4.2.2.2`ddc96103-4bc5-44d3-9412-c57569d2a9f5`Festival, show`Use this domain for words referring to a festival or show--a large social event during which some people entertain other people. -4.2.2.3`aff720bd-fb3d-4f85-bbc4-41d5fc5b83f8`Celebrate`Use this domain for words related to celebrating. -4.2.3`5446b5cf-f05a-4bb2-89eb-ce63e27040f3`Music`Use this domain for words related to music. -4.2.3.1`aa0f165d-3013-4a0c-b68c-14ea317013f9`Compose music`Use this domain for words related to composing music. -4.2.3.2`7fed6281-326a-4a15-8cbf-dc574594da19`Play music`Use this domain for words related to playing music. -4.2.3.3`de6b15d3-6409-4998-b03d-903133f4ad70`Sing`Use this domain for words related to singing. -4.2.3.4`0a1b26b2-2152-45e2-9b63-4a68fca73a90`Musician`Use this domain for words related to a musician. -4.2.3.5`91ddf495-a28b-4a32-90dc-6f997d0cd069`Musical instrument`Use this domain for words referring to musical instruments and people who play a particular instrument. -4.2.4`4b3a9b5a-df7d-4ec2-9576-2c07fe396021`Dance`Use this domain for words related to dancing. -4.2.5`e27adda9-0761-4b7f-abbf-24938ce1c01a`Drama`Use this domain for words related to drama. -4.2.6`6745c89d-1fcd-44b8-be4b-9fd9d62f64e7`Entertainment, recreation`Use this domain for words related to entertainment and recreation. -4.2.6.1`721e7782-9add-41fa-a7cf-659d5ca33926`Game`Use this domain for words referring to games. Some languages do not make a distinction between "Games" and "Sports." -4.2.6.1.1`ac4a936e-6c05-4e73-8d40-dfe4223b47fa`Card game`Use this domain for words related to a particular game. The example words are from the card games. If you do not play card games in your culture, you can rename this domain and use it for one of your games. Add other domains for each of your games. -4.2.6.1.2`2d92e248-1512-4e89-b886-425814c6dd32`Chess`Use this domain for words related to a particular game. The example words are from the game of chess. If you do not play chess in your culture, you can rename this domain and use it for one of your games. Add other domains for each of your games. -4.2.6.2`01441207-4935-49a5-a192-16d949f5606c`Sports`Use this domain for words related to sports. -4.2.6.2.1`6187e620-89bd-4b9d-9896-0c0c788e7740`Football, soccer`Use this domain for words related to a particular sport. The example words are from the sport of football (also called soccer). If you do not play football in your culture, you can rename this domain and use it for one of your sports. Add other domains for each of your sports. -4.2.6.2.2`21ebc64a-a1b8-45bd-b7f6-143a053f1d31`Basketball`Use this domain for words related to a particular sport. The example words are from the sport of basketball. If you do not play basketball in your culture, you can rename this domain and use it for one of your sports. Add other domains for each of your sports. -4.2.6.3`28e874fb-b2e7-4afa-a4d7-600306ad2583`Exercise`Use this domain for words related to exercise. -4.2.6.4`42133f78-9860-4bb7-8083-5559083f0714`Gambling`Use this domain for words related to gambling. -4.2.7`a3d95c6a-4b0b-4af0-aca8-addd042becd2`Play, fun`Use this domain for words related to playing and fun. -4.2.8`c27b87cf-1211-4df2-96b1-12c416edabbe`Humor`Use this domain for words related to humor. -4.2.8.1`37a08f65-5a79-4e17-8e19-0975d6531d64`Serious`Use this domain for words related to being serious--not laughing or joking. -4.2.9`4e791773-94c8-4667-93f8-92dc0100ddfe`Holiday`Use this domain for words related to a holiday. -4.2.9.1`e791df50-8880-4080-a5ee-d4e58bb7b8ca`Free time`Use this domain for words related to a holiday. -4.3`8e11dd10-459b-4fb3-b876-7d80ec5f8a4d`Behavior`Use this domain for general words referring to a person's behavior. -4.3.1`30e6b42c-6bbf-4659-99e7-aa4b8e68c9ce`Good, moral`Use this domain for words related to being good or moral in behavior. -4.3.1.1`744d1402-05f5-4491-9c15-a5af03595edb`Bad, immoral`Use this domain for words related to being bad or immoral in behavior, and for words describing a bad person. -4.3.1.2`a6797fd1-e368-422b-9710-96e0af39552d`Meet a standard`Use this domain for words related to meeting a standard. -4.3.1.2.1`1461c106-d9e0-417d-9487-a57e6d0cced0`Below standard`Use this domain for words related to behaving below a standard. -4.3.1.3`4260e110-7b04-4d40-9391-486a57aa3031`Mature in behavior`Use this domain for words related to acting maturely--to act like an adult rather than a child. -4.3.1.3.1`2b846476-00cf-4d82-97a1-26e1eda880ca`Immature in behavior`Use this domain for words related to behaving in an immature way--for either a child or an adult to act like a child. -4.3.1.3.2`de1ffd73-af3b-47a2-8e98-ac1659a84cac`Sensible`Use this domain for words related to being sensible--to think about what you do. -4.3.1.4`cb783ad9-4650-416e-bf63-88c4ca43fe6a`Reputation`Use this domain for words related to having a good reputation--when most people think well of someone because he does good things and doesn't do bad things. -4.3.1.5`afc25fbb-9060-4af2-8225-3fddbab2227d`Patient`Use this domain for words related to being patient--if you are patient, you don't get angry or do anything bad even though something bad happens to you for a long time. -4.3.1.5.1`8d490e91-6383-45ea-a3d7-b9c950822f98`Impatient`Use this domain for words related to being impatient--if you are impatient, you get angry or do something bad when something bad happens to you for a long time. -4.3.1.5.2`93489181-ad8c-4a18-8dbc-fd7a9c871126`Bad-tempered`Use this domain for words related to being bad-tempered--to behave in an angry, unfriendly way. -4.3.2`9b0fef63-5935-447d-801a-bb02dd6212bb`Admire someone`Use this domain for words related to admiring someone--to feel good about someone because you think that he is a good person. -4.3.2.1`a2a3e21a-819c-4400-b2e6-e6c1a0a0ded3`Despise someone`Use this domain for words related to despising someone--to feel bad about someone because you think they are not as good as you. -4.3.2.2`5d21b3f1-85d5-4999-af64-c4d0101050c0`Humble`Use this domain for words related to being humble--to not think that you are better than other people, or to not think that you are better than you really are, and to not talk or act as if you were better than other people. -4.3.2.3`18b3ca02-18fe-4ab5-8709-c20957a0a2fb`Proud`Use this domain for words referring to being proud--to think that something or someone is very good and to feel very good about them, especially to think and feel very good about yourself--to think that you are better than others, to think that you are better than you really are, or to talk and act as if you were better than other people. -4.3.2.4`054e81ce-abd8-4069-989d-13e2fa58851c`Show off`Use this domain for words referring to showing off--to behave in a way that attracts people's attention because you want them to admire you. -4.3.3`e7caa24f-155d-47cd-946d-cc0d06dfc764`Love`Use this domain for words related to loving someone--to feel good about someone, want good things to happen to them, and want to do good things for them. -4.3.3.1`642ff468-e6c8-4fd0-8f52-262efa8f7774`Hate, ill will`Use this domain for words referring to hating someone--to want something bad to happen to someone, or to want to do something bad to someone. -4.3.3.2`b553e989-2b2a-4b1e-a987-ae75f3862501`Not care`Use this domain for words related to not caring about someone. -4.3.3.3`611aa361-4ddd-450b-a152-94984a274575`Abandon`Use this domain for words related to abandoning someone or something--to leave and not return to them. -4.3.4`771e3882-f672-4e67-8580-edd82d7e5090`Do good to`Use this domain for words referring to doing good to someone. -4.3.4.1`ec79e90e-ecd3-497f-bc14-ac64181f53d7`Do evil to`Use this domain for words related to doing evil to someone. -4.3.4.2`87d344ac-94cc-49d6-9878-ebc86a933033`Help`Use this domain for words related to helping someone. -4.3.4.2.1`60e63d4a-702e-4238-a42b-d97f6be09c29`Hinder`Use this domain for words related to hindering someone. -4.3.4.3`50dfffe4-dfe8-445f-bdde-4cc8d83ebd6b`Cooperate with`Use this domain for words related to cooperating with someone to do something. -4.3.4.3.1`92e441df-7e56-4e2c-b205-79a95800f567`Compete with`Use this domain for words related to competing with someone. -4.3.4.4`e6cf2c28-7630-41d7-835d-bd171ab67378`Altruistic, selfless`Use this domain for words describing a person who acts in an altruistic, selfless manner--to act out of concern for the welfare of others without concern for your own welfare. -4.3.4.4.1`5dcf3ce8-aa00-4478-b00e-691549fa29e8`Selfish`Use this domain for words related to being selfish. -4.3.4.4.2`a7e4f8a8-3fe3-4c86-85df-059f8983df26`Use a person`Use this domain for words related to using someone for your own purpose or gain without helping them. -4.3.4.5`b5b36c31-c56d-44b9-933c-fe0e62d80c25`Share with`Use this domain for words related to sharing with other people. -4.3.4.5.1`0f323bee-0d8a-4564-9691-87880f55d910`Provide for, support`Use this domain for words referring to providing someone with what they need to live each day, such as providing for an elderly parent who can no longer earn what they need. -4.3.4.5.2`50e28fa7-f6c3-45bc-871d-12ef771d532c`Care for`Use this domain for words related to caring for someone--to do something good for someone, because they need something and cannot do it. -4.3.4.5.3`5d9ef67a-e4ba-47ca-8c8c-ea0f512a66cd`Entrust to the care of`Use this domain for words related to entrusting something to the care of someone. -4.3.4.6`fe66d433-5135-498e-a29d-b42bf0317252`Meddle`Use this domain for words referring to meddling--involving oneself in something that does not concern oneself, such as someone else's business or affairs, or a fight between other people. -4.3.4.6.1`57c9a370-0f46-4475-98fd-c7a8b3f5074c`Spoil`Use this domain for words referring to spoiling something that is happening, such as an event, work, relationship, or feeling, by doing something that makes it less attractive, less enjoyable, or less effective--to do something bad to something that is happening, so that people can't do what they were doing or don't enjoy it as much. -4.3.4.7`9060339e-d697-4c35-bc83-ced6bebfee63`Enter by force`Use this domain for words related to entering a place, such as a house, by force. -4.3.4.8`b0e5042d-1ade-4fb1-a6fd-9a165f5c4763`Kidnap`Use this domain for words related to kidnapping someone. -4.3.4.9`80b48f92-0a83-4eeb-bfe0-6980285feb65`Cruel`Use this domain for words related to being cruel. -4.3.5`7d54d3dd-5fb2-4640-9bcf-c234696af894`Honest`Use this domain for words related to being honest--words describing someone who does not cheat, steal, or break the law. -4.3.5.1`5658ae3d-ea15-44db-bae4-47df792da12e`Dishonest`Use this domain for words related to being dishonest. -4.3.5.2`eea7c79b-6150-4aba-8105-a94b7e6aeab7`Faithful`Use this domain for words related to being faithful--to continue to love and do good to someone so that they can always trust you. -4.3.5.3`99ee1558-34b2-4a1b-bfd2-eb4ccbfe7728`Reliable`Use this domain for words related to being reliable--words describe a person who can be relied on to do what he is supposed to. -4.3.5.4`81855f47-aa24-435d-a123-7dfe61c80702`Unreliable`Use this domain for words related to being unreliable. -4.3.5.5`a730d0b4-b6db-45ac-bf6e-cefc96ae3fbb`Deceive`Use this domain for words related to deceiving someone. -4.3.5.6`9bf21458-0acc-4d8d-ba9a-7b9fb6b8ee0b`Hypocrite`Use this domain for words related to being a hypocrite. -4.3.6`8add7f4d-333b-4b2c-9999-48a14162152b`Self-controlled`Use this domain for words referring to self-control--deciding not to do something that you want to do, because you think it would be bad to do it; or deciding to do something, because you know it is good. -4.3.6.1`3e546c11-bcb6-4024-b2f3-c15be40e257f`Lack self-control`Use this domain for words related to a lack of self-control. -4.3.6.2`4acc430b-9c98-4a49-a8b4-15edc0f6d19b`Tidy`Use this domain for words referring to being tidy in your habits, such as keeping your belongings neat and organized,. -4.3.6.3`9a9c7174-4148-43c2-875c-0d2f884a5fe3`Untidy`Use this domain for words related to being untidy--to not keep your things tidy and orderly. -4.3.6.4`cd8b2a8b-687b-42e9-91e7-cfb8812b64ee`Mistake`Use this domain for words referring to mistakes--something bad that someone does by accident. -4.3.7`721e2ee8-7ea5-4d17-94cc-d77d8e92bd27`Polite`Use this domain for words related to social refinement. -4.3.7.1`f4ec8f2e-f89e-40c1-ae50-900927d20af6`Impolite`Use this domain for words related to being impolite. -4.3.7.2`fc193988-26ca-49e9-849a-b12456d98792`Crazy`Use this domain for words related to being crazy--to act stupid or strange. -4.3.8`bce3f390-452c-4ca9-8c36-5fbcfd6b4755`Change behavior`Use this domain for words related to changing your behavior either for the better or for the worse. -4.3.8.1`0efe342d-4969-4bd1-95be-556f6c62adfc`Conform`Use this domain for words related to conforming to the behavior of others--to try to behave the same way as other people, or to try to behave the way other people want you to act. -4.3.9`73a59333-134f-4a1d-aba7-e134bdefe059`Culture`Use this domain for general words referring to culture--the way a group of people (such as a tribe) behaves that is different from other groups. -4.3.9.1`f5567550-e3c9-4589-8f88-8159eadcd194`Custom`Use this domain for words referring to customs--a particular practice of a cultural group. -4.3.9.2`6a6bbf65-b521-4b74-bf35-dede87217d3c`Habit`Use this domain for words referring to a habit--a pattern of behavior of a person; something a person does frequently or regularly. -4.4`9bb173c6-cf38-47cd-803f-ebdf964ca2fc`Prosperity, trouble`Use this domain for general words referring to prosperity and trouble -4.4.1`c1144a6e-3fce-4084-93d6-6f305eda8b1f`Prosperity`Use this domain for words related to prosperity--when good things are happening. -4.4.2`01459db0-bf2a-422b-8d55-0ab505aea2b4`Trouble`Use this domain for words referring to bad things that happen in life. -4.4.2.1`4c823e93-3966-461f-bd64-3a9303966338`Problem`Use this domain for words related to problems. -4.4.2.2`e0e83cc9-b876-47f6-8e66-60c9c505b927`Danger`Use this domain for words referring to danger--things and events that threaten to inflict damage, pain, or death. -4.4.2.3`9ec62ffe-69be-4b9b-944c-29a0f4f133db`Accident`Use this domain for words related to accidents--something bad that happens without anyone wanting it to happen or doing anything to cause it to happen. -4.4.2.4`c8c8b1f6-a898-4d5b-a1ce-fa7284915e8f`Disaster`Use this domain for words related to a disaster. -4.4.2.5`97885cab-cd96-4d34-a62a-3e3daac0c165`Separate, alone`Use this domain for words referring to a person being separate or alone. -4.4.2.6`9a7604b4-d42f-44b7-9aef-47847dc93f0b`Suffer`Use this domain for words related to suffering--to feel very bad because of something very bad that has happened to you. -4.4.3`65bb0844-9a71-4eec-9b86-bf4b4b508a28`Respond to trouble`Use this domain for words related to responding to trouble. -4.4.3.1`76a4a286-1c8a-4c4a-9eaf-dca040be574a`Brave`Use this domain for words describing someone who is brave--not afraid to do something dangerous. -4.4.3.2`401bbbe4-a33a-4a1e-b26a-18a756e002c4`Cowardice`Use this domain for words related to feeling cowardly--to be afraid to do something because you think something bad might happen to you. -4.4.3.3`20fadd54-6cec-4bb3-a47c-66c29aaff227`Avoid`Use this domain for words related to avoiding something bad, such as trouble or someone you don't want to meet. -4.4.3.4`a90e47fb-667c-46f7-beab-5ec4e9e6edb5`Caution`Use this domain for words related to being cautious. -4.4.3.5`05811fbe-2361-4219-a5d3-be3dc487f6fa`Solve a problem`Use this domain for words related to solving a problem. -4.4.3.6`2aabd548-5ee2-4962-8f10-84d1b0427c41`Endure`Use this domain for words related to enduring a problem. -4.4.3.7`7babf463-5e62-4a82-96d3-ef5989803c41`Survive`Use this domain for words referring to surviving--to live through a time of danger. -4.4.4`3dd684e6-75d9-41f4-aaa3-fb0cb3c7d400`Respond to someone in trouble`Use this domain for words related to responding to someone in trouble. -4.4.4.1`51c2e2e4-438c-414b-bd15-773b664dd289`Mercy`Use this domain for words related to having mercy on someone who has done something bad. -4.4.4.2`7ec98665-275f-4d57-8022-2740b9e90059`Show sympathy, support`Use this domain for words related to showing sympathy and support to someone in trouble. -4.4.4.3`65926a7a-bc46-4a40-a2c9-bf84696a3903`Gentle`Use this domain for words related to being gentle. -4.4.4.4`06ac577a-4d61-4898-ac9d-e3f18b7504af`Save from trouble`Use this domain for words related to saving someone or something from trouble (something bad is happening) or danger (something bad will happen). -4.4.4.5`0a42fd83-3b30-4c85-bb68-f5132e9ffeee`Protect`Use this domain for words related to protecting someone from danger or being hurt. -4.4.4.6`6c282031-f1ca-492a-b94c-b48e74e6f25d`Free from bondage`Use this domain for words related to freeing someone from bondage. -4.4.4.7`290f0994-ce8e-4922-975f-fa091f566823`Relief`Use this domain for words related to relief. -4.4.4.8`0eda983b-633e-4b11-b5c8-28be60067782`Risk`Use this domain for words referring to risk--exposing oneself or something to danger. -4.4.5`b5499348-b8ca-4fae-8486-b23863560ae5`Chance`Use this domain for words related to chance--when something happens that no one intended. -4.4.5.1`99b40843-54bf-4c59-ae1d-d7146cebec48`Lucky`Use this domain for words related to being lucky. -4.4.5.2`ce6a862d-a4bb-4378-b14d-439806870c41`Unlucky`Use this domain for words related to being unlucky. -4.5`aad7c9b0-aff3-4684-86d5-657a20e39288`Authority`Use this domain for words related to authority. -4.5.1`67087306-0211-4c28-b17e-0b6827723f07`Person in authority`Use this domain for words related to a person in authority. -4.5.2`b8f59ddd-48de-4b3d-af47-687c9237ccd9`Have authority`Use this domain for words related to having authority. -4.5.3`577017b0-ae87-4fa2-a51b-4f430497be75`Exercise authority`Use this domain for words related to exercising authority. -4.5.3.1`f70907c6-a064-425a-830f-e669319c38da`Lead`Use this domain for words referring to one person leading or controlling other people because they have authority over them. -4.5.3.2`94f919c2-bf8b-4ae5-a611-8c0cd4d7a5d2`Command`Use this domain for words related to commanding someone to do something. -4.5.3.3`a84a5ffc-006c-4d29-b71f-5215cc40a5a8`Discipline, train`Use this domain for words related to disciplining someone. -4.5.3.4`bf0bdeeb-564d-407b-8bdf-31221aff7364`Appoint, delegate`Use this domain for words related to appointing someone to a position of authority, or delegating authority to someone. -4.5.4`b0a9a631-e0dc-47d4-a762-e9a627732218`Submit to authority`Use this domain for words related to submitting to authority. -4.5.4.1`b632b00b-b03f-4549-8e02-6402c05a4f06`Obey`Use this domain for words related to obeying someone. -4.5.4.2`28ba8f5c-5baa-4500-a6f5-be292caa673f`Disobey`Use this domain for words related to disobeying someone. -4.5.4.3`430ce279-1464-4d55-8483-5525a3c3094d`Serve`Use this domain for words related to serving someone. -4.5.4.4`e1ac83c2-352f-4a2e-9612-99e66d6d3d0c`Slave`Use this domain for words referring to a slave--a person owned by another and obligated to work without wages. -4.5.4.5`896d57d4-4c25-4f0b-9985-a30974f64704`Follow, be a disciple`Use this domain for words related to being a disciple of someone. -4.5.4.6`c60cf6a1-7868-4536-ac73-387bfa26e04b`Rebel against authority`Use this domain for words related to rebelling against authority. -4.5.4.7`e9947962-a243-4a44-a94d-64d68718d88c`Independent`Use this domain for words related to being independent. -4.5.5`4a8c6c2e-7a8f-4dd6-97d3-20a35d7d10e9`Honor`Use this domain for words related to honoring someone. -4.5.5.1`bc61bd8d-295b-4965-a183-703d21a56996`Title, name of honor`Use this domain for words related to a title of honor. -4.5.5.2`bd9bb361-3c12-4c70-8098-40b0df9824ce`Lack respect`Use this domain for words related to lacking respect. -4.5.6`785e7f1f-21ed-46b6-8599-c6ced4fd26d8`Status`Use this domain for words related to a person's social status. -4.5.6.1`a977c4b6-1004-448f-b6b0-daf5ce87d76d`High status`Use this domain for words related to high social status. -4.5.6.2`9ed42115-8532-4f99-b0c0-36abfe9db652`Low status`Use this domain for words related to low social status. -4.6`7558d071-a885-447b-9aa2-604c29669492`Government`Use this domain for words related to government. -4.6.1`7ddbd56f-e458-4a72-a9bc-9b7db6bde75a`Ruler`Use this domain for words related to the ruler of a country. -4.6.1.1`ded0e58d-8ad7-4909-b0f1-b9ab9c10bb0d`King's family`Use this domain for words related to the king's family. -4.6.1.2`5f3e44b8-e94c-49b4-9e2d-1acd93dddf75`Government official`Use this domain for words related to a government official. -4.6.2`134c68a9-ac3f-4b7e-8fca-63642d796a75`Citizen`Use this domain for words related to a citizen of a country. -4.6.2.1`d2f516f4-df1c-44f6-8704-76dd52201317`Foreigner`Use this domain for words related to a foreigner--a person who visits or lives in a country but is not a citizen. -4.6.3`562f55de-efc7-41a7-b450-6f9dea2813e2`Government organization`Use this domain for words related to a government organization. -4.6.3.1`f9935962-9a14-485d-9bef-bd4a52dd92c1`Governing body`Use this domain for words related to a governing body--an organization within the government. -4.6.4`ff0a16f2-c44d-4ed4-9520-c214acfb68e5`Rule`Use this domain for words related to ruling. -4.6.5`bf007cd9-925d-4073-a1d6-16d64a45ca25`Subjugate`Use this domain for words related to a person subjugating someone to their authority. -4.6.6`5e7a5899-df78-4aa7-bec9-b354acfe087f`Government functions`Use this domain for words related to government functions--the things a government does. -4.6.6.1`16d2c60a-52d7-4ec5-a5b1-c559dc078bf3`Police`Use this domain for words related to the police. -4.6.6.1.1`0448c78b-dbb7-417c-afc5-b227a1475825`Arrest`Use this domain for words related to arresting a criminal. -4.6.6.1.2`d7349bac-efc0-41ba-ba60-f23d38e97a36`Informal justice`Use this domain for words related to informal justice--punishing someone when you are not in a position of authority, as when a mob catches and kills a criminal. -4.6.6.2`8b6aecfb-071d-439d-9ee0-efa3c57967a0`Diplomacy`Use this domain for words related to diplomacy between nations. -4.6.6.3`57ed66ee-f82b-4e80-955f-7492d85372b0`Represent`Use this domain for words related to representing another person. -4.6.6.4`b53deac1-26c7-4fe9-9109-8496e248e8c7`Election`Use this domain for words related to an election. -4.6.6.5`d8631167-08bd-4571-bc7c-57a4407da51c`Politics`Use this domain for words related to politics--the activities of politicians and political parties. -4.6.7`c8d94c8f-db0b-4016-bdd2-e41a2eae4288`Region`Use this domain for words referring to a region--a part of a country, or a part of the earth. -4.6.7.1`a7dae83a-dce6-47ea-ab3f-ac8a3af4cce9`Country`Use this domain for words related to a country. -4.6.7.2`b536622c-80a3-4b31-9d22-4ed2fb76324d`City`Use this domain for words related to a city. -4.6.7.3`0f983449-1c43-4974-b388-7695b1af4bfa`Countryside`Use this domain for words related to the countryside--the area away from a city -4.6.7.4`ec998dc6-d509-4832-8434-d2abac34ba70`Community`Use this domain for words related to a community. -4.7`87bd0d45-8a94-41cb-9864-90d53a11a4b9`Law`Use this domain for words related to the law. -4.7.1`f51bcafa-e624-4555-b8f1-b5726d74734d`Laws`Use this domain for words referring to a specific law or set of laws. -4.7.2`05a7bbdc-7cf5-47d3-830b-84e1591b11cc`Pass laws`Use this domain for words related to passing a law. -4.7.3`1dc717b9-c5e8-4482-b076-22102da9d553`Break the law`Use this domain for words related to breaking the law. -4.7.4`30ea3057-753d-4c4c-9b1f-ed30e569feea`Court of law`Use this domain for words related to a court of law. -4.7.4.1`cca44b46-437c-42ee-93d7-a8820d61d0c8`Legal personnel`Use this domain for words related to legal personnel. -4.7.5`85214614-ab45-4805-9014-092750d47511`Trial`Use this domain for words related to the legal process. -4.7.5.1`e10b9449-08a3-4c13-aff2-31486749b62f`Investigate a crime`Use this domain for words referring to investigating a crime, accident, or criminal--to try to learn something about something bad that has happened because you want to know who did it, or to try to learn something about someone because you think they did something bad. -4.7.5.2`67d74de1-33f9-4d39-8fa5-5dd27e7cd1d1`Suspect`Use this domain for words related to suspecting someone--to think that someone might have done something bad. -4.7.5.3`fa660c9d-8787-4335-8744-3dbc139b2df1`Accuse, confront`Use this domain for words related to accusing someone of doing something bad. -4.7.5.4`e83586c6-8d8e-4a23-bdda-a1731a5ece22`Defend against accusation`Use this domain for words related to defending someone who has been accused of breaking a law. -4.7.5.5`ca511a0c-5628-4726-8a6e-aa9fa3b73bfc`Witness, testify`Use this domain for words related to testifying in a court of law. -4.7.5.6`70963c34-dd34-40c2-bb21-e9cea73c7923`Drop charges`Use this domain for words related to dropping legal charges against someone. -4.7.5.7`59d19623-0f3b-484d-96eb-a9093b020c8d`Take oath`Use this domain for words related to taking an oath. -4.7.5.8`2cd48908-8f12-4e0f-a22e-87237618ce9f`Vindicate`Use this domain for words referring to vindicating someone--to prove that someone is innocent of an accusation made against them. -4.7.6`bd7d0c9c-791e-4c34-b9ed-ebddad8f9724`Judge, render a verdict`Use this domain for words related to judging someone. -4.7.6.1`0c1bcc98-9bc3-4da0-8eac-ff8a6eecbf84`Acquit`Use this domain for words related to acquitting a person. -4.7.6.2`0ede51d2-69bd-411e-97f9-da0d5118bbff`Condemn, find guilty`Use this domain for words related to condemning someone. -4.7.6.3`8570f05c-a152-4117-9f54-4edfa9c06a32`Fault`Use this domain for words related to something being someone's fault. -4.7.7`6bf7569e-dc79-49da-9ce1-e2e03303828a`Punish`Use this domain for words related to punishing someone. -4.7.7.1`ba98f891-77df-4910-8657-38f4ba79d3a5`Reward`Use this domain for words related to rewarding someone. -4.7.7.2`feca6b23-1ca1-4d99-ac79-3672d1d1f7db`Fine`Use this domain for words referring to a fine--a payment (usually of money) made to a victim or the government for a crime committed against them. -4.7.7.3`13f62fa1-589c-4a46-9bbc-b0fd1001e21f`Imprison`Use this domain for words related to imprisoning someone. -4.7.7.4`bf5175f6-fbe4-4ac6-9041-f8aa78b7ac78`Execute`Use this domain for words related to executing someone for a crime. -4.7.7.5`55a7b809-4196-4c5a-a6d6-09b586ce71e7`Ostracize`Use this domain for words referring to ostracizing someone--excluding someone from society as punishment for some wrong. -4.7.7.6`9fcae400-ce8f-4e30-9516-97ab794c30a9`Pardon, release`Use this domain for words related to pardoning someone who has been found guilty of a crime. -4.7.7.7`62efa729-0920-4933-93f3-b6a48519a5c7`Atone, restitution`Use this domain for words referring to atoning for a past sin--doing something to make up for something bad you did, or giving something to pay for something bad you did. -4.7.8`ef6d136e-ac1d-48b9-819d-252485534557`Legal contract`Use this domain for words related to a legal contract. -4.7.8.1`69455770-fca7-4f41-9e7d-236e8f094ce6`Covenant`Use this domain for words related to a covenant between two people or groups of people. -4.7.8.2`6aa8133a-2578-4617-bd9c-6428e897a4f1`Break a contract`Use this domain for words related to breaking a contract. -4.7.9`596ab399-e442-4afe-8796-633a49de65a7`Justice`Use this domain for words related to justice. -4.7.9.1`38bdff04-c7a9-41fa-a6a2-7aa214de308c`Impartial`Use this domain for words related to being impartial. -4.7.9.2`793d3124-8b77-4ff0-82ec-09a3a9d8d865`Unfair`Use this domain for words related to being unfair. -4.7.9.3`5737714d-49e4-4eb4-8e46-03203ee5340b`Deserve`Use this domain for words related to deserving something--if you do something, either good or bad, something can happen to you as a result of what you did. For instance you can receive a reward for doing good, or a punishment for doing wrong. If what happened to you is like what you did, people can think it is right that this thing happened to you. -4.7.9.4`f9516c66-ac2c-49dd-951a-0d3606450463`Discriminate, be unfair`Use this domain for words related to being unfair to someone. -4.7.9.5`bd31529c-ab67-419b-89a4-949aee8b3b11`Act harshly`Use this domain for words related to acting harshly. -4.7.9.6`bb4e0a69-db20-4757-beff-5dcb1c5e0f92`Oppress`Use this domain for words related to oppressing someone or a particular group of people--when a person uses his power or authority to harm others who are innocent. -4.8`f7da1907-e6c5-4d21-a8e8-81376f3467df`Conflict`Use this domain for general words referring to conflict between people, including quarreling, fighting, and war. The words in this domain should be very general, rather than referring to specific kinds of conflict. -4.8.1`189f8c29-f0ff-44b6-a0db-5b287c412a75`Hostility`The words in this domain describe a situation in which people disagree about something so strongly that they might start fighting. But these words imply that they have not started fighting yet. -4.8.1.1`763fa2e0-c119-4f50-a307-81ed8c3497ed`Oppose`Use this domain for words referring to opposing something that you think is wrong. -4.8.2`55201761-fe2e-40d5-a2a7-8079e00a2c32`Fight`Use this domain for words referring to fighting someone. The words in this domain describe a situation in which two people or groups of people fight each other over something or in order to reach some goal. A fight can use words, various kinds of weapons, or other actions. For fights that only use words use the domain 'Quarrel'. -4.8.2.1`e072bd42-eb0f-48c8-97fd-ae9ca8bc3a75`Fight for something good`Use this domain for words referring to fighting for something good. -4.8.2.2`37e6c8b5-f63c-4f5b-8c16-eccd727d6618`Fight against something bad`Use this domain for words referring to fighting against something bad. -4.8.2.3`80563285-4de7-4040-8080-a5b22208e7d5`Attack`Use this domain for words referring to attacking someone--to begin fighting someone. -4.8.2.3.1`5489f4ae-34a7-4f8b-9086-4247b0d8b3de`Ambush`Use this domain for words related to ambushing someone--to attacking someone without warning. -4.8.2.4`243d8a57-d5ed-4d7f-bd5e-f2605634f0fc`Defend`Use this domain for words related to defending someone from attack. -4.8.2.5`530ff7e0-e3cb-4dc3-9c1c-3034969e1ce8`Revenge`Use this domain for words related to revenge--to do something bad to someone because they did something bad to you. -4.8.2.6`8594cb26-9f3c-48f5-b00b-f055eb5a5e61`Riot`Use this domain for words related to a riot--when lots of people are fighting and breaking the law. -4.8.2.7`0066f0f7-02dd-4f8e-afa5-59b8cb5a434a`Betray`Use this domain for words related to betraying someone. -4.8.2.8`8a7fdd75-01dc-4d40-84ff-fa0484da3abb`Violent`Use this domain for words related to being violent--a word describing someone who is likely to attack and injure or kill people. -4.8.2.9`77f27500-aad8-409c-a28e-92df73794dce`Enemy`Use this domain for words related to an enemy--someone you are fighting against. -4.8.3`a3ba10f3-66e3-4ad5-8057-453b8941e497`War`Use this domain for words related to war--fighting between countries. -4.8.3.1`225c48dd-9fc2-4467-944f-16a098b4e518`Defeat`Use this domain for words related to defeating someone. -4.8.3.2`c8595a5f-4dde-4260-b8d8-265d0554ce93`Win`Use this domain for words related to winning a victory. -4.8.3.3`17102138-b97a-4f1d-81bc-9be4af90889e`Lose a fight`Use this domain for words related to losing a fight. -4.8.3.4`8a5c87ad-2d15-40c2-9f15-d7942ac80261`Surrender`Use this domain for words related to surrendering to an enemy. -4.8.3.5`21461d78-02f9-4be6-80e3-6a4498ce8f4c`Prisoner of war`Use this domain for words related to a prisoner of war. -4.8.3.6`f595deab-1838-4ddb-9ebe-55fb3007b309`Military organization`Use this domain for words related to military organizations. -4.8.3.6.1`d90db6d4-6c78-4ac8-9764-0cafa79b8b31`Army`Use this domain for words related to the army. -4.8.3.6.2`7d629c80-e5c2-409f-a592-39c56e9ace6d`Navy`Use this domain for words related to the navy. -4.8.3.6.3`eb842dc1-ad9c-4c1a-9eb2-a48b7f3092be`Air force`Use this domain for words related to the air force. -4.8.3.6.4`f5e2ad18-5ad4-4186-9572-b1542096759e`Soldier`Use this domain for words related to a soldier. -4.8.3.6.5`362a2bdd-985e-4bc0-a41c-358bd1babb12`Spy`Use this domain for words related to a spy. -4.8.3.6.6`98830eda-3997-4f4a-9ba4-664df669e7e2`Fort`Use this domain for words related to a fort. -4.8.3.7`738a09a5-59df-40f9-8a4e-176e00d03bbf`Weapon, shoot`Use this domain for words related to a weapon and using a weapon. -4.8.3.8`3615c3d1-fd5b-40c5-80ad-80bfd6451d56`Plunder`Use this domain for words related to plundering--stealing something from an enemy during a war. -4.8.4`0b7b9a1c-588b-475a-ac14-00f0999cbfe9`Peace`Use this domain for words related to peace--when people or countries are not fighting. -4.8.4.1`6eafbb5a-26ba-44b5-a0d5-21b9e7750ece`Rebuke`Use this domain for words related to rebuking someone--to tell someone that he has done something wrong. -4.8.4.2`9afb64d6-feae-4490-9b7e-95768627f643`Make an appeal`Use this domain for words related to making an appeal. -4.8.4.3`fd7e03f8-61c9-47e9-afa4-ab8917db03a5`Appease`Use this domain for words related to appeasing someone. -4.8.4.4`675eccbb-9858-4cd4-8405-5f0d0faa792c`Negotiate`Use this domain for words related to negotiating with someone. -4.8.4.5`9b9ccd76-76d6-457b-93d2-c4d242a395f8`Renounce claim, concede`Use this domain for words related to renouncing a claim. -4.8.4.6`1ca26512-75f6-4a7a-a7cc-07d08aa799d9`Repent`Use this domain for words related to repenting. -4.8.4.6.1`4b669bed-ba46-41cc-bcba-c2ef8e129c85`Request forgiveness`Use this domain for words related to asking for forgiveness. -4.8.4.7`7d7c81d5-9713-423f-b12e-8e11e451f0a7`Forgive`Use this domain for words related to forgiving someone. -4.8.4.8`a1dd1d94-fa8e-4325-9f72-b39bcac69755`Make peace`Use this domain for words related to making peace--to try to prevent or end a war. -4.8.4.8.1`9e2b0c61-304e-4cad-9708-792bfde880b4`Stop fighting`Use this domain for words related to stopping fighting. -4.8.4.9`3f069313-4827-4fc5-b73b-b9fbd42ca38c`Reconcile`Use this domain for words related to reconciling with someone. -4.9`7556a257-3703-40d3-91d3-c891fb250947`Religion`Use this domain for general words referring to religion and the supernatural. -4.9.1`b60bf544-7774-4623-8c67-19b32b53dea2`God`Use this domain for words related to God--the supreme being in the universe. Each theological system will have different beliefs concerning the existence and nature of God. Our purpose here is to collect and define the terms used to refer to the supreme deity. If there is no such person in the theological system, then use this domain for other terms for the pantheon of gods, ultimate reality, nirvana, and similar concepts. However most theological systems, even atheism, have the concept of a supreme God and use words to refer to him. -4.9.2`7f6c81fb-02a4-415f-a363-fb11cc6b9254`Supernatural being`Use this domain for words referring to supernatural beings--gods, spirits, other types of beings, which normally cannot be seen and do not belong to this world. Some people accept the existence of certain supernatural beings and not others. Mythological beings are those that were believed in during previous times but that are no longer believed in. Fictional beings are those that no one has ever believed in. An indication of whether most people believe in the supernatural being should be put in the definition. -4.9.3`25bf6690-6ed1-42e9-8a4a-3518f9cf382c`Theology`Use this domain for words related to theology--the study of God and what people believe about God. -4.9.3.1`e9fdc131-addb-4db6-8f79-ae0044e1eb81`Sacred writings`Use this domain for words related to sacred writings. Examples are only given for the Christian sacred writings. However you should include words referring to the holy books of all religions . -4.9.4`61f52196-a8b2-496d-96ea-8c15dc7d377a`Miracle, supernatural power`Use this domain for words related to miracles--the use of supernatural power to do something good. -4.9.4.1`b6e45998-9f6a-4b19-9cda-62410a11afa2`Sorcery`Use this domain for words related to sorcery--the use of supernatural power to do something bad. -4.9.4.2`3ea52505-aa6c-4f28-b475-f15ac1820ec1`Demon possession`Use this domain for words referring to demon possession--when a demon or spirit influences or controls the behavior of a person. Use this domain for all words related to the relationship between spirits and people, including communication between people and spirits. Also use this domain for words referring to casting out demons--causing a demon to stop influencing or controlling a person. -4.9.4.3`38d1a6fe-0811-4eb0-a1d8-f69b6ad978e0`Bless`Use this domain for words related to blessing someone--saying something that causes something good to happen, or requests God to do something good to someone. -4.9.4.4`106c2c42-36fd-4b0a-94f7-e998f6eae6f5`Curse`Use this domain for words related to cursing someone. -4.9.4.5`7c7f62d8-0293-45ba-8658-956c38bafc66`Destiny`Use this domain for words related to destiny--decisions and actions by God, spirits, or by impersonal forces that determine or influence what happens to a person. -4.9.4.6`147c2e58-9ae8-460f-8cab-bf04a668945d`Prophecy`Use this domain for words referring to speaking for God, including foretelling the future through divine knowledge. -4.9.4.7`b2830b72-c642-484f-9485-24682aa11ed8`Omen, divination`Use this domain for words related to supernatural knowledge. -4.9.5`b9c752a4-66be-493c-8955-cfa5324a54c1`Practice religion`Use this domain for words related to practicing religion. -4.9.5.1`4cb8b433-4efa-4698-8ebd-0f00f8fc3f66`Devout`Use this domain for words related to being devout. -4.9.5.2`00dde3be-e53d-42c3-b3ff-717e25cbffb6`Pray`Use this domain for words related to praying--talking to God. -4.9.5.3`2ccab97a-fb98-4054-a29b-e5ceac8ca1b4`Worship`Use this domain for personal expressions of devotion to God, in whatever ways the religion defines and expresses it. -4.9.5.4`5a4a8ae5-a209-4946-8fa1-3c3bd5083e0d`Religious ceremony`Use this domain for words related to religious ceremonies. -4.9.5.5`9f792202-8023-4ef3-b269-5ae4b6908a0b`Offering, sacrifice`Use this domain for words related to offering a sacrifice. -4.9.5.6`b790470f-ed4e-42ac-932d-cd15ef701b03`Religious purification`Use this domain for words related to religious purification. -4.9.5.6.1`24361be2-49be-4860-bb56-4e46dd1e8b0c`Taboo`Use this domain for words referring to things that are taboo--something to be avoided; a religious, social, or cultural restriction on behavior, as opposed to a government law. -4.9.5.7`6105a207-4311-4920-8c19-63259424bfaf`Salvation`Use this domain for the primary goal or goals of a religion, for instance in Christianity salvation from sin, death and Hell. Each religion has different beliefs about salvation. Our purpose here is not to preach or argue, but to list those words that people use to talk about this topic. -4.9.5.8`62ed8254-e53a-4781-935e-79869619e40a`Dedicate to religious use`Use this domain for words related to dedicating someone or something to religious use. -4.9.5.9`79f3b53a-eb56-4188-87f8-48317f76e7ce`Fasting`Use this domain for words related to fasting--to not eat for a period of time. -4.9.6`1c3f8996-362e-4ee0-af02-0dd02887f6aa`Heaven, hell`Use this domain for words related to heaven and hell--the place where people go after they die. -4.9.6.1`ff505092-6d88-4b5e-8095-04e471d7ad4c`Resurrection`Use this domain for words related to resurrection--life after death, or living again after dying. -4.9.7`2470ad05-636e-4c85-96ab-cd880da58741`Religious organization`Use this domain for words referring to official religions, groups within a religion, and religious meetings. Each religion will have different names for its groups. Answer each question for each religion. -4.9.7.1`ef860ee3-a4a5-4a42-b810-fdf41e35d151`Religious person`Use this domain for words referring to religious practitioners--people who practice a religion, who are members of the religion, believe in the religion, leaders of the religion, and followers of the religion. Each religion has its own terms for religious practitioners. List these terms separately for each religion. The examples given below are for the Christian religion. -4.9.7.2`1229dd8f-5cfc-4644-93c3-d256fc34d054`Christianity`Use this domain for words used in Christianity. -4.9.7.3`ab8f5391-ad8b-42dc-a43c-22590a09ce77`Islam`Use this domain for words used in Islam. -4.9.7.4`4ce22ed0-6fe3-47ae-83e4-e7c7310cb1d4`Hinduism`Use this domain for words used in Hinduism. -4.9.7.5`df647b1a-ed79-4a8e-b781-56ed25fe4405`Buddhism`Use this domain for words used in Buddhism. -4.9.7.6`f211defe-d80f-4e40-9842-af19cb0719e7`Judaism`Use this domain for words used in Judaism. -4.9.7.7`f6134be5-3f96-4750-a03e-fca381a42db1`Animism`Use this domain for words used in Animism--the belief in spirits. -4.9.8`e311cc3a-a387-449e-a05a-07ed9678411d`Religious things`Use this domain for words related to a religious object. -4.9.8.1`b97531df-8256-4796-8335-f69753a8f2e3`Idol`Use this domain for words related to idols and their use. -4.9.8.2`9b476afd-58c2-46a2-8294-449ac4aad3a9`Place of worship`Use this domain for words related to places of worship. Each religion has different types of places of worship. These questions must be answered according to the practices of each religion and for each separate type of place. -4.9.9`725d78eb-8cac-4b2f-b5a4-f0a9adb80f5d`Irreligion`Use this domain for words related to thinking and acting against God or religion. -5`0f883eb0-00a1-44cc-b719-97fb6ec145d4`Daily life`Use this domain for words related to daily life at home. -5.1`bd4a2527-f66c-4f48-922e-8b180bba8ef6`Household equipment`Use this domain for words related to household equipment and tools. -5.1.1`44bf22fd-3725-4c49-bd3c-434402c33493`Furniture`Use this domain for words related to furniture. -5.1.1.1`f732bdb5-9a04-468a-b50b-510f94d20fb4`Table`Use this domain for words related to a table. -5.1.1.2`4fc734f2-a91d-4693-8caf-e7fe51a2df8a`Chair`Use this domain for words related to a chair. -5.1.1.3`943eb131-2761-4c98-90a0-0bdfb0f8584d`Bed`Use this domain for words related to a bed. -5.1.1.4`fe89a0f4-2155-424b-bf90-c1133dc41c8d`Cabinet`Use this domain for words related to a cabinet. -5.1.2`a220a734-af03-4de3-8d05-369a3cad14cf`Household decoration`Use this domain for words related to household decorations. -5.2`4098899a-0ad0-4d71-9f9f-b99d5ba2e0d5`Food`Use this domain for general words referring to food. -5.2.1`1fda68d4-5941-4695-b656-090d603a3344`Food preparation`Use this domain for words related to food preparation. -5.2.1.1`fc0afb69-a4d4-439a-91cd-ed0ce67677b5`Cooking methods`Use this domain for words referring to various ways of cooking food. It is necessary to think through different kinds of food and how they are cooked. An example is given below for cooking eggs. -5.2.1.2`726923d4-b25c-46eb-8ab0-427207177ae3`Steps in food preparation`Use this domain for words related to the steps in food preparation. One way to find the words in this domain is to describe how each type of food is prepared. -5.2.1.2.1`6e83c471-0fe8-4641-8ecf-68b63df29ab7`Remove shell, skin`Use this domain for words related to removing the shell or skin from food. -5.2.1.2.2`8a9b5484-eda8-4194-95ca-c2e76e83ae67`Pound in mortar and pestle`Use this domain for words related to pounding food in a mortar. -5.2.1.2.3`ac7de73d-0059-4f35-9317-462a1813edba`Grind flour`Use this domain for words related to grinding flour. -5.2.1.3`dbd3e164-3f70-4395-9728-1c24c8900da6`Cooking utensil`Use this domain for words related to cooking utensils. -5.2.1.4`1b399fa1-e4f7-4d7b-a33e-3972b8b556e2`Food storage`Use this domain for words referring to food preservation and storage. -5.2.1.5`cd01db6c-8aa6-42d1-93ac-05e81a8be523`Serve food`Use this domain for words related to serving food. -5.2.2`0f568473-880d-43bd-b5ce-590100fdcaf6`Eat`Use this domain for words related to eating. -5.2.2.1`8242fc85-a703-4efa-a78a-0556a84e811e`Bite, chew`Use this domain for words referring to biting and chewing with the teeth. -5.2.2.2`02d404d7-f3d7-492c-92a0-c6c9ff1a1908`Meal`Use this domain for words related to a meal. -5.2.2.3`08788e9a-93b8-4a2e-ab01-dea177f061e8`Feast`Use this domain for words related to a feast. -5.2.2.4`12b6934d-3a4a-4623-995f-865f401349ab`Manner of eating`Use this domain for words describing the manner in which a person eats. -5.2.2.5`0a27d9d1-0f1f-475a-92a2-bbccf5b15f41`Hungry, thirsty`Use this domain for words related to being hungry or thirsty. -5.2.2.6`40ff5cee-31d8-4c89-a212-877347212a0e`Satiated, full`Use this domain for words related to being full of food. -5.2.2.7`6de42a33-35b2-49c6-b2c4-fa9c0c5094f0`Drink`Use this domain for words related to drinking. -5.2.2.8`b4e6c077-4f5e-44f3-8868-1f7ae3486585`Eating utensil`Use this domain for words related to eating utensils. -5.2.2.9`b3d3dd7d-0cb1-4c25-bcae-cc402fcfa3ea`Fast, not eat`Use this domain for words related to fasting--to not eat for a period of time. -5.2.3`5bcd08a6-cb46-41bb-a732-0d690b5ea596`Types of food`Use this domain for words related to types of food. -5.2.3.1`32125c5f-d69a-442f-ba66-6277ec0a3b15`Food from plants`Use this domain for words related to food from plants. -5.2.3.1.1`1447278f-efff-4807-b9ea-c487dea1ba5e`Food from seeds`Use this domain for words related to food from seeds. -5.2.3.1.2`9cae4ee3-03cf-46f7-9475-21d66c93ae04`Food from fruit`Use this domain for words related to food from fruit. -5.2.3.1.3`929720f5-c264-49fd-b817-3e1ebff6e1de`Food from vegetables`Use this domain for words related to food from vegetables. -5.2.3.1.4`e496a6d3-a00c-470e-81c3-314f3f97840e`Food from leaves`Use this domain for words referring to food from leaves and stems. -5.2.3.1.5`462f5606-5bd8-4543-aa35-26b0cffd7163`Food from roots`Use this domain for words referring to food from roots. -5.2.3.2`1f608e18-958e-4bb3-a977-04879fb5acd5`Food from animals`Use this domain for words referring to eating meat and to types of animals that are eaten. Only include those animals that are commonly eaten, especially those that are domesticated. -5.2.3.2.1`5c348090-12f4-4c83-8331-e10971bbc8d3`Meat`Use this domain for words referring to meat and types of animals that are eaten. Only include those animals that are commonly eaten. -5.2.3.2.2`d4769748-7c4e-4359-9da5-2ea64d5948d9`Milk products`Use this domain for words related to milk products. -5.2.3.2.3`aa5658da-8926-4519-83a5-d451dc5a6b49`Egg dishes`Use this domain for words related to food made from eggs. -5.2.3.3`36ad58e3-ade7-49b9-9922-de0b5c3f13c3`Cooking ingredients`Use this domain for general words referring to ingredients--the things that are added together when preparing food. -5.2.3.3.1`9bb6f1ed-7170-4caa-a14c-747fd95ca30e`Sugar`Use this domain for words related to sugar. -5.2.3.3.2`7beca90c-3671-4b3c-bf9a-fb8f08ff914b`Salt`Use this domain for words related to salt. -5.2.3.3.3`bf0b24d2-4bd6-4e9c-8775-a623ace8db56`Spice`Use this domain for spices--things that are added to food to make them taste better. -5.2.3.3.4`e11d6360-6fa9-45a9-a23e-2252a301cf86`Leaven`Use this domain for leaven--things that are added to food to make them ferment. -5.2.3.3.5`c7c1c25a-d89d-4720-846c-d6e1dd723a17`Cooking oil`Use this domain for words related to cooking oil. -5.2.3.4`effc49dd-6322-4302-899c-4cf540f0e2e4`Prepared food`Use this domain for words referring to prepared food. Cultures vary widely in the number and types of foods they prepare, and in how they classify them. For instance the English distinction between main dish and side dish is not found in the classification system of other languages. If your language has well-recognized subcategories, you can set up a separate subdomain for each. The questions below are based on the main ingredient in the dish. -5.2.3.5`2eba12c6-7817-4dfd-9e7c-94c8b8b389ef`Prohibited food`Use this domain for words that describe food that is prohibited by the culture or religion. Do not list the foods that are prohibited. -5.2.3.6`31dc3d15-c6f8-4405-a33b-8f3a52f8671a`Beverage`Use this domain for words referring to things people drink. -5.2.3.7`2d894eca-8f6c-4b63-b265-0914a65d9be9`Alcoholic beverage`Use this domain for types of beverages containing alcohol. -5.2.3.7.1`ee8a20b7-4202-489a-b8cd-bdebaf770313`Alcohol preparation`Use this domain for words related to making alcoholic beverages. -5.2.3.7.2`d067b555-e53c-4c16-bb09-5314862d8bae`Drunk`Use this domain for words related to drinking alcohol and the effect it has on a person. -5.2.4`c6688928-6694-4264-8048-a60b665b5793`Tobacco`Use this domain for words related to using tobacco. -5.2.5`3710e019-46c9-44db-a0aa-9054d3126161`Narcotic`Use this domain for words related to narcotics and drugs that are not used as medicine but as stimulants. Narcotics are often addicting and harmful to a person's health. -5.2.6`029e0760-3306-41cc-b032-40befb22303e`Stimulant`Use this domain for words related to stimulants--substances that are drunk, eaten, or chewed to make a person more alert or give him more energy. -5.3`8a11e609-e88d-4247-8c5f-224ddb20de10`Clothing`Use this domain for words related to clothing. -5.3.1`ee6e993c-5551-42ae-b35e-26bc6aeeb3a4`Men's clothing`Use this domain for words related to men's clothing. -5.3.2`410a3d81-290f-416b-8012-3aa16eaa9e55`Women's clothing`Use this domain for words related to women's clothing. -5.3.3`5b41c1ed-95bb-4cca-8cff-87361acb5683`Traditional clothing`Use this domain for words related to traditional clothing. -5.3.4`c3b808d4-d94e-4c8e-b7b2-87b4f4a83198`Clothes for special occasions`Use this domain for words referring to special clothes worn on special occasions. It is necessary to think through all the various special occasions in the culture and think of any special clothes worn on those occasions. Two examples are given below for work and graduation, but there are many others. -5.3.5`c817af65-7cc8-4105-a8ed-47067d97b73b`Clothes for special people`Use this domain for special clothes worn by special people. It is necessary to think through all the various special types of people in the culture and think of any special clothes worn by them. Several examples are given below, but there are many others. -5.3.6`40516af2-d413-418e-8b68-8443847ee169`Parts of clothing`Use this domain for words related to parts of clothing. -5.3.7`4445cccd-e9b9-4f25-9e8c-2ef58408297d`Wear clothing`Use this domain for words related to wearing clothing. -5.3.8`5450043d-907b-4884-a9e5-35cfd5935947`Naked`Use this domain for words related to being naked--not wearing any clothes, and for words referring to how a person feels about being naked. It is a part of universal human experience that people do not want to be naked. So there are words that refer to feeling bad if one does not have enough clothes on (shame). Other words refer to wanting to have enough clothes (modest). Other words refer to how people feel about other people who do not wear enough clothes (indecent). -5.3.9`72d9b7cd-aa06-4f7b-a66b-b992171d2cd4`Style of clothing`Use this domain for words related to clothing styles. -5.4`15947464-997a-4f44-9a4b-ac4916e7e19b`Adornment`Use this domain for words related to adornment. -5.4.1`844f922b-6fb6-49aa-864b-b1c49edaa1ae`Jewelry`Use this domain for objects such as jewelry that are put on or attached to the body or to the clothes as decoration. -5.4.2`5bdb3c06-fbee-4f5f-991a-e2128f65bb86`Cosmetics`Use this domain for words related to cosmetics--things you put on your skin to make yourself beautiful in appearance. -5.4.3`6b8366b9-b5e8-42b8-991c-c568d4442a81`Care for hair`Use this domain for words related to caring for your hair. -5.4.3.1`fc1e4ea7-15fa-4bbf-8697-f312762504ba`Comb hair`Use this domain for words related to combing your hair. -5.4.3.2`b0e3486c-bd3d-4b5c-be9a-40cd2c0ce2a1`Plait hair`Use this domain for words related to plaiting your hair. -5.4.3.3`64fa0ba7-73cb-40e9-a8d2-3e61fff146c9`Dye hair`Use this domain for words related to dying your hair. -5.4.3.4`041b5ac9-99be-4281-a17e-654eff33d793`Hairstyle`Use this domain for words related to hairstyles. -5.4.3.5`9c21f9bd-a7e0-4989-99f1-7fa2853ab73c`Cut hair`Use this domain for words related to cutting hair. -5.4.3.6`84d67c87-86ff-4e71-8a26-abe048132f8f`Shave`Use this domain for words related to shaving. -5.4.4`c81004a7-499e-4e05-84c8-3d74a17e97fd`Care for the teeth`Use this domain for words related to caring for your teeth. -5.4.5`03e22b05-8505-442d-9c3b-7e691bd525e0`Anoint the body`Use this domain for words related to anointing the body. -5.4.6`6ea9bfc6-723c-466f-9efc-0992879ae47d`Ritual scar`Use this domain for words related to ritual scarring. -5.4.6.1`7f1dfb68-bf07-472d-a481-b802d2591ca6`Circumcision`Use this domain for words related to circumcision. -5.4.7`93de2257-8303-490d-b2fe-6d1d838b08c6`Care for the fingernails`Use this domain for words related to caring for the fingernails. -5.5`ff7e3abd-6810-4128-83c9-701b4925c2fe`Fire`Use this domain for general words that refer to fire and for words referring to types of fire. These words may be specific for what is being burned (forest fire 'a fire burning a forest'), the size of the fire (inferno 'a very large hot fire'), or the place where the fire burns (hellfire 'the fire in hell'). -5.5.1`1438c623-c4ce-4559-b71b-cfb86a71e6d7`Light a fire`Use this domain for words related to lighting a fire. -5.5.2`9a456463-3c71-4f9a-8117-dc2fcb087bd3`Tend a fire`Use this domain for words that refer to tending a fire--to keep a fire burning so that it burns well and does not go out. -5.5.3`514974a2-c2fd-4b25-a24d-2ff52fa3d798`Extinguish a fire`Use this domain for all the ways a person can stop a fire. -5.5.4`2933a9c1-aa62-46fb-a03c-68aed7fae9b7`Burn`Use this domain for verbs that are used of fire: "The fire is ____." In some languages there are verbs for what is happening to the thing that is burning: "The house is ____." -5.5.5`b93bdfa4-486c-44a0-8266-557ccdc78b31`What fires produce`Use this domain for words related to the things that fires produce. -5.5.6`9fc25175-3b4a-4248-bc7f-b86012ec584f`Fuel`Use this domain for types of fuel and for words used in making, collecting, storing, or using fuel. This domain includes the scenario of collecting firewood. -5.5.7`70164474-a65b-4506-9953-f26afb6b497a`Fireplace`Use this domain for any place where fires are normally burned. -5.6`bbb897b5-f09b-4263-9f81-826ca61084f1`Cleaning`Use this domain for general words related to cleaning things. -5.6.1`46ad1505-9049-41d8-831b-768f46f12500`Clean, dirty`Use this domain for words describing whether something is clean or dirty. -5.6.2`dd12ac0f-55cc-4c79-a50c-d23cc7ea60b3`Bathe`Use this domain for words related to bathing. -5.6.3`9d79be9a-f21e-4189-be39-779db79da027`Wash dishes`Use this domain for words related to washing dishes. -5.6.4`dae6488c-7fea-4fa3-84c9-b611d017b6a5`Wash clothes`Use this domain for words related to washing clothes. -5.6.5`dc71598d-21a2-4598-9c12-13978796d2c9`Sweep, rake`Use this domain for words related to cleaning the floor or ground. -5.6.6`c09eedd3-c4e1-4cf9-b6d1-a01624c6426a`Wipe, erase`Use this domain for words related to wiping dirt off of things. -5.7`d502512c-966b-4752-8636-716fb29facfe`Sleep`Use this domain for words related to sleeping. -5.7.1`a3fe0ca2-64fe-44db-ac3f-14513385bc25`Go to sleep`Use this domain for words related to going to bed and going to sleep. -5.7.2`6736dafe-2916-40f6-b6b7-b6300100933b`Dream`Use this domain for words related to dreaming. -5.7.3`2158eb7d-eb59-4740-9628-9080d7f51a97`Wake up`Use this domain for words related to waking up from sleep. -5.8`716b3e9d-9bb9-42a6-ba56-829b1c018b28`Manage a house`Use this domain for words related to managing a house. -5.9`f07f867d-808f-4750-92ca-859aea59e58c`Live, stay`Use this domain for words related to living in a place. -6`c82fa28f-7e26-489e-a244-4d69cea87b94`Work and occupation`Use this domain for general words related to working. -6.1`d68911f6-6507-483a-b015-44726fdf868a`Work`Use this domain for words related to working. -6.1.1`8be94377-a3cc-4187-a6e2-51523e953503`Worker`Use this domain for words related to a worker. -6.1.1.1`b6ead5e6-dab5-4941-9017-d03452182709`Expert`Use this domain for words related to being an expert--someone who can do something well. -6.1.2`d8366daf-ae1d-4b2c-a447-478c73580639`Method`Use this domain for words related to the method of doing something. -6.1.2.1`3393b3b2-b324-408d-9c59-057a0de9c3bd`Try, attempt`Use this domain for words indicating that someone is trying to do something. -6.1.2.2`64493789-1c2c-4b24-a7e6-f00ff9be923e`Use`Use this domain for words related to using something to do something. -6.1.2.2.1`8411fa09-b1a5-4b62-aa47-f28bee9f6616`Useful`Use this domain for words related to being useful--words describing something that can be used to do something. -6.1.2.2.2`29d131d2-5e52-49e3-83b1-c872d331cf03`Useless`Use this domain for words related to being useless--words describing something that cannot be used to do anything. -6.1.2.2.3`34dd26b6-d081-42f5-8be9-c5fe7a7253b2`Available`Use this domain for words related to something being available to use. -6.1.2.2.4`b4dc89dc-3811-4d45-b0ee-0b71e28305cc`Use up`Use this domain for words related to using something up. -6.1.2.2.5`424ced39-d801-419a-86fe-265942a9b74b`Take care of something`Use this domain for words related to taking care of something. -6.1.2.2.6`a72515ec-998d-4b48-bd69-c67cf9245abc`Waste`Use this domain for words related to wasting something. -6.1.2.3`d6c29733-beeb-4fc9-975f-5e78a8acc273`Work well`Use this domain for words related to working well. -6.1.2.3.1`5b3c7b4d-d5bb-488e-8f3f-fe8206fb0e55`Careful`Use this domain for words related to being careful. -6.1.2.3.2`398ffed0-bfa7-452c-8521-7d37b3082dcf`Work hard`Use this domain for words related to working hard. -6.1.2.3.3`0d935e77-e437-426f-acff-dccfb516ec8c`Busy`Use this domain for words related to being busy. -6.1.2.3.4`303539ba-7253-4590-b8c4-7751caa52c65`Power, force`Use this domain for words related to the power used to do something. -6.1.2.3.5`80f26fbc-ca89-4789-996d-4c09547f2504`Complete, finish`Use this domain for words related to completing a task. -6.1.2.3.6`5f63805f-1c8e-440a-a13c-222c5d81eb9c`Ambitious`Use this domain for words related to being ambitious. -6.1.2.4`b760a3a7-ea7f-4a4b-a4b5-81752f2ca158`Work poorly`Use this domain for words related to working poorly. -6.1.2.4.1`6e04a3e2-3b3a-4d0b-bf71-1596ca0aa211`Careless, irresponsible`Use this domain for words related to being careless. -6.1.2.4.2`0c21ae3d-10b1-481f-8d8f-66e2590c4578`Lazy`Use this domain for words related to being lazy. -6.1.2.4.3`a2ae0c29-df1c-486d-a44b-96fcc4e0aa8c`Give up`Use this domain for words related to giving up. -6.1.2.5`53ba3b61-4f4e-4749-8a7f-0d2b327a113d`Plan`Use this domain for words related to planning. -6.1.2.5.1`da203891-90a2-48f0-955a-8a80b6c62af9`Arrange an event`Use this domain for words related to arranging an event, such as a meeting. -6.1.2.5.2`6fceec81-1967-4fe5-81f3-86bcaf3f1c2f`Cancel an event`Use this domain for words related to canceling a plan, decision, or event. -6.1.2.6`889de305-82ad-4d1a-9a97-63733ed27bfc`Prepare`Use this domain for words related to preparing to do something. -6.1.2.6.1`f77053f4-ed5a-4376-bcba-17552ea447ba`Prepare something for use`Use this domain for words related to preparing something so that it can be used for some purpose. -6.1.2.7`6eb2ef50-7e6b-41b8-a82e-6eb307c908ca`Effective`Use this domain for words related to being effective. -6.1.2.8`6dd16e6e-fbdb-4df1-9730-4877651e68f3`Efficient`Use this domain for words related to being efficient. -6.1.2.9`a7568031-43e3-4cf9-b162-ac2fe74125f1`Opportunity`Use this domain for words related to an opportunity to do something. -6.1.3`31ccb9e3-d434-4430-ac84-486cc5a1c53d`Difficult, impossible`Use this domain for words describing something that is difficult or impossible to do. -6.1.3.1`77bcdcab-e9fd-48ba-8dcd-63f425367735`Easy, possible`Use this domain for words describing something that is easy or possible to do. -6.1.3.2`58eeb55b-c57d-4f59-a7d6-9bf663fbf831`Succeed`Use this domain for words related to succeeding in doing something. -6.1.3.3`a764174f-ccb7-48b1-add7-158bc89a5e81`Fail`Use this domain for words related to failing to do something. -6.1.3.4`7c6ba6e5-d81e-4a50-a111-c946a0793378`Advantage`Use this domain for words related to having an advantage--something that helps you succeed that other people don't have. -6.1.4`2e9f06f3-c986-43da-a035-e3cc9aef13d4`Job satisfaction`Use this domain for words related to being satisfied with your job. -6.1.5`b285bc3b-ba9f-4160-8e79-81dd43dfdbaa`Unemployed, not working`Use this domain for words related to being unemployed. -6.1.6`67247ab3-7b3a-4035-a0d0-a05c8e615c71`Made by hand`Use this domain for words describing something made by hand instead of by a machine. -6.1.7`97f40359-f4e8-4545-9ba5-980b47487540`Artificial`Use this domain for words describing something that is artificial--something that is made by people. -6.1.8`5d92b4a7-baf7-495e-bb43-4f733cc55935`Experienced`Use this domain for words related to being experienced at doing something. -6.1.8.1`ea839451-f89e-4432-b361-3086ca4f13fd`Accustomed to`Use this domain for words related to being accustomed to something. -6.2`5bb29704-fe0f-4594-9622-ce0aa42b93c8`Agriculture`Use this domain for words related to agriculture--working with plants. -6.2.1`cb362fc7-b3aa-46f4-b9a8-0f8c97fb16fe`Growing crops`Use this domain for general words related to growing crops. If one crop is cultivated extensively and there are many words related to it, set up a separate domain for it. -6.2.1.1`36a2c83f-f7aa-41b0-9b17-f801f3720e4f`Growing grain`Use this domain for general words related to growing grain crops such as barley, maize (corn), millet, oats, rice, rye, sesame, sorghum, and wheat. If one crop is cultivated extensively and there are many words related to it, set up a separate domain for it. This has already been done for rice, wheat, and maize, since they are so common around the world. -6.2.1.1.1`7d7bc686-faf5-484b-8519-b2529ac581bf`Growing rice`Use this domain for words related to growing rice. -6.2.1.1.2`d7e4e538-039f-47bb-aa42-a2cf455668cc`Growing wheat`Use this domain for words related to growing wheat. -6.2.1.1.3`37f6a1d9-985d-465e-b62d-37c1f9bf855b`Growing maize`Use this domain for words related to growing maize. -6.2.1.2`7524887a-5cf0-4459-96d1-fd8262bef7d4`Growing roots`Use this domain for words related to growing root crops such as beets, carrots, cassava, garlic, ginger, leeks, manioc, onions, peanuts, potatoes, radishes, rutabagas, taro, turnips, and yams. If one crop is cultivated extensively and there are many words related to it, set up a separate domain for it. This has already been done for potatoes and cassava, since they are so common around the world. -6.2.1.2.1`c982941c-0cff-47aa-9e08-5234a8e0d6e8`Growing potatoes`Use this domain for words related to growing potatoes. -6.2.1.2.2`139cd00c-429c-465a-a227-512af0c48039`Growing cassava`Use this domain for words related to growing cassava. -6.2.1.3`2854734e-834a-42cb-8812-d9e7028916dc`Growing vegetables`Use this domain for words related to growing vegetables, such as asparagus, beans, broccoli, cabbage, celery, chard, cucumbers, eggplant, melons, peas, peppers, pumpkins, spinach, squash, tomatoes, and watermelons. If one type of vegetable is cultivated extensively and there are many words related to it, set up a separate domain for it. -6.2.1.4`af5bcf27-56e2-4072-b321-30a31b58af78`Growing fruit`Use this domain for words related to growing fruit, such as berries, cranberries, grapes, raspberries, and strawberries. If one type of fruit is cultivated extensively and there are many words related to it, set up a separate domain for it. This has already been done for grapes and bananas, since they are so common around the world. -6.2.1.4.1`7d9f48f5-aba3-486f-b49d-cd2cb0ac03f8`Growing grapes`Use this domain for words related to growing grapes. -6.2.1.4.2`b7662b2b-e57c-400b-8ef6-6fb612f5ee9f`Growing bananas`Use this domain for words related to growing bananas. -6.2.1.5`198436ae-c3c6-4f3c-8fe0-ea10c867f1c6`Growing grass`Use this domain for words related to growing grass, such as sod, hay, alfalfa, bamboo, papyrus, sugarcane, and tobacco. If one type of grass is cultivated extensively and there are many words related to it, set up a separate domain for it. This has already been done for sugarcane and tobacco, since they are so common around the world. -6.2.1.5.1`31426c31-9439-406c-9867-bc98c6ca0565`Growing sugarcane`Use this domain for words related to growing sugarcane. -6.2.1.5.2`99d0d129-b427-4468-b4c6-91005be63e18`Growing tobacco`Use this domain for words related to growing tobacco. -6.2.1.6`bf1f9360-6dd4-4ee3-b9f8-a5539baeb53b`Growing flowers`Use this domain for words related to growing flowers. If one type of flower is cultivated extensively and there are many words related to it, set up a separate domain for it. -6.2.1.7`ef5ee2be-8a32-452a-818b-80191edb8e41`Growing trees`Use this domain for words related to growing trees. If one crop is cultivated extensively and there are many words related to it, set up a separate domain for it. This has already been done for coconuts and coffee, since they are so common around the world. -6.2.1.7.1`18043b8c-3ff0-46a5-87cc-626f62f967cc`Growing coconuts`Use this domain for words related to growing coconuts. -6.2.1.7.2`22300e2c-3d7d-4c36-a2b7-e2bbb247f793`Growing coffee`Use this domain for words related to growing coffee. -6.2.2`d345142f-d51e-4023-a25a-2a4c0f1fbcbf`Land preparation`Use this domain for words related to preparing land for planting crops. -6.2.2.1`685d474d-3b84-4339-98c6-2aac28b9870c`Clear a field`Use this domain for words related to clearing a field. -6.2.2.2`62030451-c0f2-4e80-8085-05c6400fc914`Plow a field`Use this domain for words related to plowing a field. -6.2.2.3`58de3766-8729-48e2-97fe-937a441eb722`Fertilize a field`Use this domain for words related to fertilizing a field. -6.2.3`be280123-dda6-49a0-bd8c-5e2855b56159`Plant a field`Use this domain for words related to planting a field. -6.2.4`811e8c93-d97a-4aab-bd67-268b7783ff11`Tend a field`Use this domain for words related to tending a field. -6.2.4.1`32f868e0-54a7-4d04-8689-ac10e13396e5`Cut grass`Use this domain for words related to cutting grass. -6.2.4.2`9e98c76f-6c1c-4b7d-8f71-38f9f0e8750e`Uproot plants`Use this domain for words related to uprooting plants. -6.2.4.3`a2ce1453-9832-447c-9481-70c9e2da4227`Irrigate`Use this domain for words related to irrigating a field. -6.2.4.4`a9fe3347-12ae-4624-b55e-45ea42cdbf9b`Trim plants`Use this domain for words related to trimming plants. -6.2.4.5`0698b0f4-0a31-4a70-9262-8d36677d8faa`Neglect plants`Use this domain for words related to neglecting plants. -6.2.5`c2630384-2f72-4a96-baed-3fff03383362`Harvest`Use this domain for words related to harvesting crops. If there is an important crop and there are a lot of words that refer to harvesting it, set up a special domain for it, such as 'Harvest rice' or 'Harvest coconuts'. If there is more than one such crop, set up a separate domain for each of them. -6.2.5.1`0e5a6bd0-470f-4231-9f57-a73b725807f4`First fruits`Use this domain for words referring to the first fruits or crops to be harvested. -6.2.5.2`35faefb3-7498-4735-9b05-e7035dd368fc`Crop failure`Use this domain for words related to crop failure. -6.2.5.3`a8bfd196-8b54-4084-b11a-fe6e8bc5da4c`Gather wild plants`Use this domain for words related to gathering wild plants. In a hunter-gatherer culture this domain might need to be extensively developed. -6.2.5.4`4bedae6a-1df4-40e5-8a2f-ab0a1f41997e`Plant product`Use this domain for words referring to materials and substances that are taken from plants and used for various purposes. It is necessary to think through various types of plants to think of what materials are taken from each. -6.2.6`8080c7ed-e69a-4a8a-bd8d-bf3447b13630`Process harvest`Use this domain for words related to processing the harvest. -6.2.6.1`8fb9a1a6-844d-45a5-86c7-977d3e420149`Winnow grain`Use this domain for words related to winnowing grain--to separate the chaff from the grain. -6.2.6.2`69d0a37d-f5b3-48a5-9486-5654d37b030b`Mill grain`Use this domain for words related to milling grain. -6.2.6.3`47ed6c39-b728-4ae7-be7c-c45c714c3153`Thresh`Use this domain for words related to threshing grain. -6.2.6.4`ceedce41-cdef-4766-9c5e-8ff5608c5464`Store the harvest`Use this domain for words related to storing the harvest. -6.2.7`ff9dfc70-526d-405e-b613-5a2a21c1b2d8`Farm worker`Use this domain for words related to farm workers. -6.2.8`0d972590-5947-4983-a092-443697baec24`Agricultural tool`Use this domain for words related to agricultural tools. -6.2.9`c7990233-ef2e-4ea6-8d1e-ccf56e540394`Farmland`Use this domain for words related to farmland. -6.3`79b580ff-64a7-445b-abcb-b49b9093779c`Animal husbandry`Use this domain for words related to animal husbandry--working with animals. -6.3.1`8c28c640-db5b-43e2-a1e6-b0e381962129`Domesticated animal`Use this domain for words related to domesticated animals. Add extra domains for specific domesticated animals in your culture such as elephants in east Asia, camels in the Middle East, and llamas in South America. -6.3.1.1`32fc19fd-a04e-4b69-9442-f7d57348ec55`Cattle`Use this domain for words related to cattle and the care of cattle. -6.3.1.2`26b97047-edb1-44e9-8c7b-463de9cfbe78`Sheep`Use this domain for words related to sheep. -6.3.1.3`c36131c3-b5e1-4aac-a7b5-7c9cfa1e8f74`Goat`Use this domain for words related to goats. -6.3.1.4`c888c7ac-8cf4-49d2-a33e-20d19d84c47b`Pig`Use this domain for words related to pigs. -6.3.1.5`10a82711-8829-461a-b172-fc8fff3d555c`Dog`Use this domain for words related to dogs. -6.3.1.6`49c878dd-277f-4bc9-b8ad-9ba192709108`Cat`Use this domain for words related to cats. -6.3.1.7`e545baab-581d-4af8-81f2-5a884e272349`Beast of burden`Use this domain for words related to animals that are used as a beast of burden--either to ride, to carry loads, or to pull vehicles. The questions refer to horses, but can be applied to any animal. -6.3.2`167a5bae-f06f-424c-bfcb-ec547a076c8d`Tend herds in fields`Use this domain for words related to tending a herd in the fields. -6.3.3`d85391fa-680a-4715-81ac-c0835acac8c5`Milk`Use this domain for words related to milking an animal. -6.3.4`71a2cc77-f968-4341-84c1-6c16d007a093`Butcher, slaughter`Use this domain for words referring to killing animals and cutting them up for food. -6.3.5`c880c81f-65dc-4d93-8c39-22920fdbe4c7`Wool production`Use this domain for words related to wool production--cutting the hair off of a sheep. -6.3.6`b2bb077a-92c8-4e54-8dfa-c89efd60b82d`Poultry raising`Use this domain for words related to raising birds. -6.3.6.1`d7da5318-dccf-477f-967d-1e3f6a421860`Chicken`Use this domain for words related to chickens. -6.3.7`040e4b3e-2f36-430a-ab09-1917f96a09de`Animal products`Use this domain for words related to animal products. -6.3.8`71dbaf5f-2afa-4282-b9b8-8a50d8c8e5e9`Veterinary science`Use this domain for words related to treating animal diseases. -6.3.8.1`acddd447-bf8a-4d74-8501-7defb0525cc0`Animal diseases`Use this domain for words related to animal diseases. -6.3.8.2`4f80a620-30db-4529-94e8-f0cd9d0b0e96`Castrate animal`Use this domain for words related to castrating animals. There are sometimes specific terms for castrated animals, such as 'steer--a male cow that has been castrated before maturity'. -6.4`9e6d7c69-788c-4d40-8584-32f185e91932`Hunt and fish`Use this domain for words related to hunting and fishing--catching and killing wild animals. -6.4.1`a1ce19c4-d12c-46da-a718-6d03949b3db1`Hunt`Use this domain for words related to hunting wild animals. -6.4.1.1`62b40326-f74c-4d80-9b1c-4dae0fc07026`Track an animal`Use this domain for words related to tracking an animal. -6.4.2`196f81d0-6a1a-4cc0-936a-367423ff485c`Trap`Use this domain for words related to trapping an animal. -6.4.3`4e0992cd-c04c-4b55-beab-6b0a3c98a994`Hunting birds`Use this domain for words related to hunting birds. -6.4.4`b0e2635e-47c4-4995-942b-07f6635faf6f`Beekeeping`Use this domain for words related to keeping bees. -6.4.5`ea46de30-a1a9-4828-84a8-9165f61f8b20`Fishing`Use this domain for words related to catching fish. -6.4.5.1`573bf23a-3fde-4552-9263-62b7c71cad02`Fish with net`Use this domain for words related to fishing with a net. -6.4.5.2`d7e0ed88-6d5a-44cc-a0fe-070a5aab3e60`Fish with hooks`Use this domain for words related to fishing with a hook and line. -6.4.5.3`eb07e333-38d2-4ddb-9bc9-5990403600b4`Fishing equipment`Use this domain for words related to fishing equipment. -6.4.6`7c234ccc-0dbe-42b0-a377-db99ebd2b51e`Things done to animals`Use this domain for words related to things done to animals. -6.5`cde96694-79e5-44af-8d38-d988d1938e5f`Working with buildings`Use this domain for words related to working with buildings. -6.5.1`dc177f3c-d0fd-4232-adf1-a77b339cdbb2`Building`Use this domain for words related to buildings and other large structures that people build. -6.5.1.1`191ca5a5-0a67-426e-adfc-6fdf7c2aaa2c`House`Use this domain for general words referring to a house where people live. -6.5.1.2`c8e3c39c-d895-4e42-8e1e-1574137ba016`Types of houses`Use this domain for words referring to types of houses. -6.5.1.3`7981a8e1-cf0b-44a0-9de4-12160b2f201d`Land, property`Use this domain for words related to land that a person owns or the land on which a house is built. -6.5.1.4`c1ceebe1-1274-40c1-a932-696265d9d412`Yard`Use this domain for words referring to the outside of a house, the area around a house, a barrier separating one house from another, and the entryway to the area around a house. -6.5.1.5`7a8cb8d3-797d-478d-b7dd-265a1eedc0c1`Fence, wall`Use this domain for words referring to a fence, wall, hedge, or other barrier separating one house from another, and a gate or entryway through a fence or wall. -6.5.2`22acd714-b11e-462a-bd8e-6ff50843c103`Parts of a building`Use this domain for words referring to the parts and areas of a building. -6.5.2.1`50903b35-5606-4727-8474-01c06bf588da`Wall`Use this domain for words related to walls. -6.5.2.2`eec72226-106c-4825-b245-6e18110ee917`Roof`Use this domain for words related to a roof. -6.5.2.3`3a568f98-8446-4327-876b-7c5ec78d9084`Floor`Use this domain for words related to a floor. -6.5.2.4`bafa274e-8bf0-4cf7-8ce7-2c28293db809`Door`Use this domain for words related to a door. -6.5.2.5`eeee02e1-157e-4786-ab92-80c92e5023b8`Window`Use this domain for words related to a window. -6.5.2.6`58be5db0-c648-4522-bad0-02cd9cc15f37`Foundation`Use this domain for words related to the foundation of a building. -6.5.2.7`d2b61570-af54-44f3-846e-6d7ec9d3737f`Room`Use this domain for words related to the rooms of a building. -6.5.2.8`84a8d541-9571-4ce9-abea-bd9cccb8dbf0`Floor, story`Use this domain for words related to the levels of a building. -6.5.3`97e1aba5-2ac1-44a3-8f18-59b2347a54a1`Building materials`Use this domain for words related to the materials used to make a building. -6.5.3.1`4a44ac87-5ad5-44de-8170-9fd88b056010`Building equipment and maintenance`Use this domain for words referring to the equipment and maintenance of a building. -6.5.4`c6b62d63-b355-46c9-a8c7-e0a0bf112a9e`Infrastructure`Use this domain for words related to infrastructure--the big things people make that many people use, such as roads, electric power lines, and water supply systems. -6.5.4.1`31debfe3-91da-4588-b433-21b0e14a101b`Road`Use this domain for words related to a road. -6.5.4.2`73adcfbe-8a74-4fda-969f-616964226b9b`Boundary`Use this domain for words related to the boundary of an area. -6.6`9bab95c4-9773-4894-9cb9-d7ad39378b45`Occupation`Use this domain for words related to occupations. -6.6.1`71430132-f2ea-40fe-b3f5-b6775741cc56`Working with cloth`Use this domain for words related to working with cloth. -6.6.1.1`ec8e1481-827c-4554-bf50-0d3f592f3702`Cloth`Use this domain for words related to cloth. -6.6.1.2`7edf9e7c-3e32-4307-b5e3-b0d704df7803`Spinning thread`Use this domain for words related to spinning thread. -6.6.1.3`b6e9b9c9-632b-48e7-99f7-fa53ebcb3bc5`Knitting`Use this domain for words related to knitting. -6.6.1.4`77d1610f-4757-46de-b5f8-e127dc270dfd`Weaving cloth`Use this domain for words related to weaving cloth. -6.6.2`34e92ff1-32aa-49c7-b4da-d161bedc5adc`Working with minerals`Use this domain for words related to working with minerals. -6.6.2.1`c5996b7d-0acc-4ac7-bfa0-09b93a0eccbc`Mining`Use this domain for words related to mining. -6.6.2.2`993b8955-52db-4b2a-8e9a-405a155e7b60`Smelting`Use this domain for words related to smelting--melting rocks to get metal out of them. -6.6.2.3`7ee3ccb5-e6cb-4028-9af5-62ae782967b5`Working with metal`Use this domain for words related to working with metal. Answer each question below for each kind of smith. -6.6.2.4`66abfbe5-e011-48de-8773-905f1b1ce215`Working with clay`Use this domain for words related to working with clay. -6.6.2.5`5a585789-2ef6-42c5-9c5a-34ff716059b7`Working with glass`Use this domain for words related to working with glass. -6.6.2.6`3f6dc9af-0c50-44d5-99f0-4aa67c668186`Working with oil and gas`Use this domain for words related to working with oil and gas. -6.6.2.7`084e2568-3f54-4eab-b436-8a87fb466659`Working with stone`Use this domain for words related to working with stone. -6.6.2.8`33037a4d-3454-4c59-9a61-c5fb747f107a`Working with bricks`Use this domain for words related to working with bricks. -6.6.2.9`8b76f4a2-9926-4c76-8d4f-563371683219`Working with chemicals`Use this domain for words related to working with chemicals. -6.6.2.9.1`1fd8a8d6-6795-4a5b-90e0-342e8b0975a1`Explode`Use this domain for words related to bombs or chemicals exploding. -6.6.3`adde4a66-9040-47a9-91ab-327934a2e97e`Working with wood`Use this domain for words related to working with wood. -6.6.3.1`345e019f-87d2-415d-ba37-9fb85460f7e1`Lumbering`Use this domain for words related to lumbering--cutting down trees and cutting them up. -6.6.3.2`0fef044a-c822-450d-b54a-eac8621e50c2`Wood`Use this domain for words related to wood. -6.6.3.3`d8389a63-8b39-4e23-8528-cd756dae2f5c`Working with paper`Use this domain for words related to paper. -6.6.4`f6eb81d5-caba-4735-be6f-ae038656b555`Crafts`Use this domain for words related to crafts. -6.6.4.1`0b7bfd0a-249c-45b6-9427-2c17ae00bf37`Cordage`Use this domain for words related to working with cords and ropes. -6.6.4.2`019e3b64-c68a-4b19-bec5-a22f4eb88f48`Weaving baskets and mats`Use this domain for words related to weaving baskets, mats, and other things. -6.6.4.3`7ee96f62-7c8e-4c27-a373-d7a534844612`Working with leather`Use this domain for words related to working with leather. -6.6.4.4`49471924-2458-4cb0-9430-f38cfc2fb63b`Working with bone`Use this domain for words related to working with bone. -6.6.5`0bc02285-8e70-442a-8d08-e04d922507c8`Art`Use this domain for words related to art. -6.6.5.1`89ba59d4-b314-4070-83bb-f9f868bcd363`Draw, paint`Use this domain for words related to drawing and painting pictures. -6.6.5.2`6b208fda-544c-4cba-b8cc-887b1018837f`Photography`Use this domain for words related to photography. -6.6.5.3`3ae3a1be-cfb5-4953-b65b-68f0c51b1d40`Sculpture`Use this domain for words related to sculpture. -6.6.6`0644f4da-c9fe-4239-bbe5-6efc85f98968`Working with land`Use this domain for words related to working with land. -6.6.7`683f570a-0bfe-4a97-b55d-4319b328508b`Working with water`Use this domain for words related to working with water. -6.6.7.1`515f9b40-0637-4ce3-b343-2d99de3f723b`Plumber`Use this domain for words related to working with water pipes. -6.6.7.2`0205145d-23b6-4c3c-bf2d-bf866bb010e7`Conveying water`Use this domain for words related to conveying water--moving water from one place to another place. -6.6.7.3`6f83b918-dc9f-4053-90a4-a6b9e750db29`Controlling water`Use this domain for words related to controlling the movement of water. -6.6.7.4`a6616a09-df51-4ca6-850f-733ee73c8750`Working in the sea`Use this domain for words related to working in the sea. -6.6.8`f1373316-7917-4dca-9d33-c6b520bd4034`Working with machines`Use this domain for words related to working with machines. -6.6.8.1`b917ffec-ab7e-496a-bfe4-35c567fa0785`Working with electricity`Use this domain for words related to working with electricity. -6.7`6342c8bf-55b5-400f-af7e-63055fe6813b`Tool`Use this domain for general words for tools and machines. The domains in this section should be used for general tools and machines that are used in a variety of tasks. Specialized tools and machines should be classified under the specific work or activity for which they are used. -6.7.1`efe8e7b5-e008-4a3a-b3e1-23ae03a0083e`Cutting tool`Use this domain for words related to cutting tools. -6.7.1.1`a3bc1fbd-9f2f-4a9d-ae6e-7b02da8a05b4`Poking tool`Use this domain for words related to poking tools--tools used to make holes in things. -6.7.1.2`818e33ff-590e-4d0e-b84e-67771324a545`Digging tool`Use this domain for words related to digging tools. -6.7.2`65c68427-2e20-42b2-8f49-623055ea9246`Pounding tool`Use this domain for words related to pounding tools. -6.7.3`62964baf-fea6-4d8e-8509-d312bff8761a`Carrying tool`Use this domain for words related to carrying tools. -6.7.4`be4ab208-1fa0-463f-9ca0-4c7e3e03aafd`Lifting tool`Use this domain for words referring to tools used to lift things. -6.7.5`5cd2f365-2d84-451e-9f2d-bc2561eff909`Fastening tool`Use this domain for words related to fastening tools. -6.7.6`b2fee662-c451-4d32-aca5-a913ca0b2164`Holding tool`Use this domain for words related to holding tools--tools used to grip and hold things so that they don't move, and tools used to hold things that you can't hold with your hand, such as very hot things. -6.7.7`eca46133-c350-4573-a349-9b7ce11b6fa8`Container`Use this domain for words related to containers. -6.7.7.1`4d3412e3-85a0-4f81-9dad-efd6101b4945`Bag`Use this domain for words related to bags. -6.7.7.2`3acf5e20-b626-4f0a-a582-d386a0e30792`Sheath`Use this domain for words related to a sheath--a container for a weapon. -6.7.8`3aec74e5-6cfd-46d2-b26f-503fad761583`Parts of tools`Use this domain for words referring to parts of tools and machines. You need to think of different tools and machines, and think of each part. -6.7.9`7575d654-e528-4fe0-85eb-481b0e6654bb`Machine`Use this domain for words referring to machines. -6.8`2b893d04-3450-4862-b046-7df6f87272f6`Finance`Use this domain for words related to finance. -6.8.1`ff736f67-197b-46b9-bc14-edbeb1fb3d5a`Have wealth`Use this domain for words related to having wealth. -6.8.1.1`d9cb2e69-133d-4525-bca5-50b0f3402cbb`Own, possess`Use this domain for words related to owning something. -6.8.1.2`c1a70060-ba04-4f16-879e-5563492aee02`Rich`Use this domain for words related to being rich. -6.8.1.3`45993c48-3893-4d9e-96a3-b6b1ad160538`Poor`Use this domain for words related to being poor. -6.8.1.4`2e2a17ba-9d81-4a3d-8af5-96c8f0e39e7e`Store wealth`Use this domain for words related to storing wealth. -6.8.1.5`3022c764-ba88-41d0-94db-393312214f4e`Possession, property`Use this domain for words related to property--the things you own. -6.8.2`4f22ebdb-01db-432a-9d7a-41cd44010265`Accumulate wealth`Use this domain for words related to accumulating wealth. -6.8.2.1`d1aecdba-3938-4b0c-a2e6-7dc3b7cc5cde`Produce wealth`Use this domain for words related to producing wealth. -6.8.2.2`b1756402-83c4-476d-8f55-010a0a10b5d9`Make profit`Use this domain for words related to making a profit. -6.8.2.3`07cf5182-d090-4432-817b-037895b5cd1d`Lose wealth`Use this domain for words related to losing wealth. -6.8.2.4`5627904e-59c7-4dd5-aeb5-c6fe0c0a0571`Frugal`Use this domain for words related to being frugal--to not spend a lot of money. -6.8.2.5`dd830047-d7f5-4010-a8ea-ae20468a0cbf`Greedy`Use this domain for words related to being greedy. -6.8.2.6`044f740b-94f3-4096-aa3a-c07f5e708346`Collect`Use this domain for words related to collecting things you find interesting. In some cultures people collect rare or valuable things that they think are attractive or interesting, such as art, stamps, coins, books, or antiques. -6.8.2.7`d21db541-4122-465f-9db5-4c76f5e84426`Earn`Use this domain for words related to earning money for work that you do. -6.8.3`749ad6fe-5509-4e45-b236-84ea12de102e`Share wealth`Use this domain for words related to sharing wealth with others. -6.8.3.1`85f211ae-cc16-4042-8c27-e99ff8f01f61`Give, donate`Use this domain for words referring to giving something to someone, in which there is a transference of ownership. -6.8.3.2`339ee46b-d69a-4f2e-8fba-d1b2adff763b`Generous`Use this domain for words related to being generous. -6.8.3.3`0105615f-0a96-4d08-ab00-ca4b4473de39`Stingy`Use this domain for words related to being stingy. -6.8.3.4`6681f03b-06c4-4509-9253-e4739c9c1614`Beg`Use this domain for words related to begging--for a poor person to ask other people to give them money, food, or other things. -6.8.4`67931f1c-9a0c-4d18-9762-e553c132256c`Financial transaction`Use this domain for words related to financial transactions. -6.8.4.1`063e0810-8e49-44ef-aa8f-bb9e63bb66dd`Buy`Use this domain for words related to buying something. -6.8.4.2`a758718d-6e90-471d-acde-a637ba9ff9eb`Sell`Use this domain for words related to selling something. -6.8.4.3`0f7c4d2f-ed94-49ba-a91c-fba36193f35a`Price`Use this domain for words related to the price of something--how much money you have to pay to buy something. -6.8.4.3.1`a755eaba-fce9-4a8b-b9cf-b3970a49f464`Expensive`Use this domain for words related to an expensive price. -6.8.4.3.2`ecbdf1c5-9d7f-4446-b6a1-644a379a480b`Cheap`Use this domain for words related to a cheap price. -6.8.4.3.3`ffe84c4f-8c38-4b84-ac36-e79ffadbd426`Free of charge`Use this domain for words related to something being free of charge--something you can have without paying for it. -6.8.4.4`36123ffe-14d8-4198-b32c-eabd0b23e0dd`Bargain`Use this domain for words related to bargaining over the price of something. -6.8.4.5`0ca05184-08b9-4dc7-a4c7-ff762380b111`Pay`Use this domain for words related to paying money for something. -6.8.4.6`3b69f6b6-d64a-43aa-99dc-05e34f81e07f`Hire, rent`Use this domain for words related to hiring or renting something--to pay money so that you can use something that belongs to someone else. -6.8.4.7`57e367f4-7029-4916-a700-791db32b4745`Spend`Use this domain for words related to spending money. -6.8.4.8`869d0c7b-d792-45ab-bf31-fd9f6fea3107`Store, marketplace`Use this domain for words related to a store or marketplace where things are sold. -6.8.4.9`7e0bc050-5298-4808-af22-5e284526c652`Exchange, trade`Use this domain for words related to exchanging or trading things. -6.8.5`49ee84ff-eb2b-4ba3-b193-3018d34599c2`Borrow`Use this domain for words related to borrowing something. -6.8.5.1`48380d5d-bd54-48a9-92bc-7c8a93de0567`Lend`Use this domain for words related to lending something. -6.8.5.2`ec90e061-e6a0-435f-8784-7269a24c670a`Give pledge, bond`Use this domain for words related to giving a pledge to replay a loan. -6.8.5.3`4eb41e40-4115-435a-934a-5d91022a29dc`Owe`Use this domain for words related to owing money. -6.8.5.4`1da9c4f4-8ae2-47d9-8068-ff65fa3848a9`Repay debt`Use this domain for words related to repaying a debt. -6.8.5.5`5a2355b4-c295-4b94-86da-6ac18198bae4`Credit`Use this domain for words referring to credit--when a lending institution, such as a bank, has some of your money, so they owe you something. -6.8.6`43282de6-51e1-4e52-99fc-d54e2043fb6c`Money`Use this domain for words related to money. -6.8.6.1`0772919e-eb4c-45e3-b705-73007f5e5583`Monetary units`Use this domain for words related to monetary units. -6.8.7`ed2113c8-1784-4808-ab1a-fd269f86fa99`Accounting`Use this domain for words related to accounting--to keep records of money. -6.8.8`9a8f2f6a-a039-45dd-80d3-d1e0911907b2`Tax`Use this domain for words related to tax. -6.8.9`63b18261-faf3-4ab2-bcb4-7c3ac4d6d6ba`Dishonest financial practices`Use this domain for words related to dishonest financial practices. -6.8.9.1`db2232d9-8b17-4920-936f-2b6249c6f7fa`Steal`Use this domain for words related to stealing something--to take something that does not belong to you. -6.8.9.2`d7ae7208-7869-46e3-90c1-676342c3d7af`Cheat`Use this domain for words related to cheating someone. -6.8.9.3`a8ae0ee7-56ca-4bdf-bd9a-c56da3ff9254`Extort money`Use this domain for words related to extorting money--forcing someone to give you money on a regular basis by threatening them with some harm. -6.8.9.4`b4fc91fe-68f7-45a6-8863-75bba1029bef`Take by force`Use this domain for words related to taking something by force. -6.8.9.5`892b66f4-5dfd-4451-a491-4c4fd2179081`Bribe`Use this domain for money given to a person to do something bad. -6.8.9.6`a36b3354-8598-4228-b779-c7c922b1e61d`Smuggle`Use this domain for words related to smuggling--taking something secretly into a country, something which is illegal or without paying duty. -6.9`f726d9bb-ae80-4c01-bdef-b600cb27736e`Business organization`Use this domain for words related to business organization. -6.9.1`0b98fb79-222f-418c-8107-5d4e791d329c`Management`Use this domain for words related to managing something. -6.9.2`5c770098-2c91-4a9c-bfa0-a7ffaa871a7f`Work for someone`Use this domain for words related to working for someone. -6.9.3`b33da469-fefa-44f3-b35c-d70411bfe7e1`Marketing`Use this domain for words related to the promotion of trade and sales. -6.9.4`cd436263-30a3-498c-93f6-3d5682f7f7c0`Commerce`Use this domain for words related to commerce--taking something to a place and trying to sell it there. -6.9.5`73726931-ef12-4d39-a76e-7742f4b7c9cd`Economics`Use this domain for words related to economics--the study of the money, trade, and industry of a country. -6.9.6`a197dbfb-20e4-40c2-9c76-6abbeb1a9b12`Insurance`Use this domain for words related to insurance. -7`d60faf11-cc6e-48db-8a13-82f86d78ab00`Physical actions`Use this domain for general words for physical actions--moving yourself, moving things, and changing things. -7.1`9f3b4cab-dc8a-430e-88f3-d3002df64fb8`Posture`Use this domain for general words indicating the posture or stance of a person's body. Use the domains in this section for specific words for postures and for moving parts of the body. Many of these words have two meanings. One meaning is stative, indicating that the body is in a particular posture, but not moving. The other meaning is active, indicating that the person is moving his body into a particular posture. Some of these words can be used of animals or even things, if the things are perceived as being similar in posture to that of a human body. -7.1.1`8841af5e-74e6-4c5d-a313-ba9aa7fdb78b`Stand`Use this domain for words related to standing. The words in this domain may include whether the person is standing on one foot or two, whether the person's feet are together or placed apart, whether something is between the person's feet, how fast the person stands up. -7.1.2`975d0109-1bba-4b0e-85b8-2c6b51c8e074`Sit`Use this domain for words referring to sitting and squatting. -7.1.3`0aae0254-dc06-4906-8ecf-2d8450fb83f1`Lie down`Use this domain for words referring to lying down. -7.1.4`3a28ab73-2847-44a4-97ed-7129269f1366`Kneel`Use this domain for words referring to kneeling. -7.1.5`c3f20ce7-d30e-40fd-af8a-713a65c46cd0`Bow`Use this domain for words referring to bowing to someone--to face someone and lower your head or bend at the waist so that your upper body is lowered. The words in this domain should all be symbolic acts, that is, the culture assigns a meaning and significance to the physical action. Some cultures define it as a greeting, as an act of respect, or as an act of submission. For instance in ancient middle eastern culture bowing was an act of submission done in the presence of the king. Failure to bow was an act of rebellion punishable by death. In far eastern culture it is a greeting. In African culture it is an act of respect or done to welcome a visitor. Cultures define how a person is to bow, for instance how they are to hold their hands. A person may bow while standing, or may kneel, or even prostrate himself flat on his face. Whether both people bow is also significant. The depth of the bow can have significance. In Japan the person of lower social rank must bow deeper. In European culture a performer bows to acknowledge applause. -7.1.6`566be8c1-3e42-4f8b-87eb-e70e8c13c6f8`Lean`Use this domain for words describing a person who is leaning. -7.1.7`85b9908f-4f57-4baa-9ed2-bc4705b12e72`Straight posture`Use this domain for words referring to straight posture--holding your body straight, stiff, or erect, rather than relaxed. -7.1.7.1`8e65904c-f9e9-4e12-b430-c1ddc540f1ae`Relaxed posture`Use this domain for words describing a relaxed posture. -7.1.8`85dfc6a3-6c70-41f2-a869-32e2fb3c40ee`Bend down`Use this domain for words referring to bending down--to bend your body so that it is closer to the ground (in order to see something, pick up something, or hide). -7.1.9`86e5c062-d90f-476c-a363-264adfafedfa`Move a part of the body`Use this domain for words referring to moving various parts of the body. -7.2`c7c85346-158d-4881-839d-9a6a8e47209b`Move`Use this domain for intransitive verbs of movement referring to moving your whole body to a different location. There are many components of meaning involved in verbs of movement. They can include a source location (from), a goal location (to), a path (along), manner (walk, run), speed (race, crawl), direction (forward, back, side, up, down, toward, away from), shape of the path (straight, curve, circle, angle), relationship to some object or objects (on, hang, against, between, across, through, into, out of, onto, off of, around), proximity (near, far), multiple movements (back and forth, return, bounce), inclusion with other objects or parts of objects (join, leave, collect, disperse, unite, separate), volition (go versus drift), intransitive versus transitive (move versus move something). Some verbs of movement do not involve moving from one place to another, but express bodily movement. -7.2.1`5cc64831-c14a-4dbe-beba-214e725ad041`Manner of movement`Use this domain for general words referring to the way in which a person moves. -7.2.1.1`643cc712-b3b3-42d0-971e-7a4c8a6cbf1e`Walk`Use this domain for words related to walking--moving slowly using your legs. -7.2.1.1.1`b16de6a0-71dd-448c-9ffa-49f6646a5219`Run`Use this domain for words referring to running--moving fast on your legs. -7.2.1.1.2`a2bbf179-8d38-4d2e-84cd-0e00bb6c74f3`Crawl`Use this domain for words referring to crawling--moving on your hands and knees or on your stomach. -7.2.1.1.3`5abd1270-261a-4980-93e5-e10eacea99ad`Jump`Use this domain for words referring to jumping--moving your body off the ground by pushing hard with your legs. -7.2.1.2`1017cbc3-0dfb-4930-9881-28f96784035c`Move quickly`Use this domain for words referring to moving quickly or slowly. -7.2.1.2.1`e442afe1-e7cd-4ab2-b456-963e2e041a1e`Move slowly`Use this domain for words referring to moving slowly. -7.2.1.3`deff977c-a664-4456-9d44-a5127dd2a7d1`Wander`Use this domain for words referring to wandering--to move slowly without any purpose or goal. -7.2.1.4`250baab9-5a31-493c-95ea-9fee8baf9fd5`Graceful`Use this domain for words referring to moving in a graceful manner. -7.2.1.4.1`b5aa5873-4c66-4d2d-935a-18e0ab231dbb`Clumsy`Use this domain for words referring to moving in a clumsy manner. -7.2.1.5`879e66bc-af29-4fe4-86e0-0047973a57d6`Walk with difficulty`Use this domain for words referring to walking with some difficulty such as stumbling--to miss your step because of hitting an object such as a stone, hole, or mud; staggering--to walk unsteadily because of weakness, illness, or drunkenness; or limping--to walk unevenly or with difficulty because of injury to a foot. -7.2.1.5.1`3f535689-944a-4e9c-8f64-ec6395b7c8d7`Slip, slide`Use this domain for moving across a smooth or lubricated surface. -7.2.1.6`985f099d-f38c-4957-907a-769d1a45ca10`Steady, unsteady`Use this domain for words that refer to balancing yourself or something--when someone or something is able stand or move without falling. -7.2.1.6.1`c6132280-d2aa-46f8-9e94-b087dbda09cb`Balance`Use this domain for words that refer to balancing yourself or something--when someone or something is able stand or move without falling. -7.2.1.7`32d5b3de-0500-4ad6-b94e-20b8001d0a91`Move noisily`Use this domain for words referring to making a noise while moving. -7.2.2`12fe5f6c-7f98-47ba-936a-bcd1065c2db3`Move in a direction`Use the domains in this section for words referring to moving in a direction related to the orientation of the person's body (not in relation to the position of the destination). -7.2.2.1`8e59041e-660b-4f3e-9a11-83217417209e`Move forward`Use this domain for words referring to moving in a forward direction--in the same direction the person is facing. -7.2.2.2`6de4e99b-2b5a-493a-a208-f024d1eabdf3`Move back`Use this domain for words referring to moving in a backward direction--the person is facing one direction, but moving toward their back--to move in the opposite direction from the direction the person is facing. -7.2.2.3`f4b18e9c-b465-4763-ba79-d7eed2cebcfa`Move sideways`Use this domain for words referring to moving in a sideways direction--the person is facing one direction, but moving toward their side. -7.2.2.4`9d6cbe74-93d6-41fb-b7e2-cc30adb28187`Move up`Use this domain for words referring to moving in an upward direction or to moving to a higher place. -7.2.2.5`16081dd6-72e5-4826-b86d-958dd82a01c0`Move down`Use this domain for words referring to moving in a downward direction or to moving to a lower place. -7.2.2.5.1`b14db9f4-5e1d-4a2b-bec0-0d6bcb5b1a31`Fall`Use this domain for words referring to something falling--for something to move down under the influence of gravity. -7.2.2.6`60a5fa58-45b1-41ae-9430-5200e8bfbcb8`Turn`Use this domain for words referring to turning and changing the direction in which one is moving. -7.2.2.7`8bcc3b3d-dd0c-4838-a33a-b395f354c86f`Move in a circle`Use this domain for words referring to continually changing the direction you are facing in until you are once again facing in the same direction, e.g. moving in a circle, moving around something, or rotating. -7.2.2.8`3c9fe647-2647-4f43-8bac-7facc054f7ff`Move back and forth`Use this domain for words related to moving back and forth. -7.2.2.9`36176d59-171b-4a0a-a0f7-a8f9857536a1`Move straight without turning`Use this domain for words referring to moving straight without changing direction. -7.2.3`fcd22c85-7ee1-4d31-8633-9dbd32344211`Move toward something`Use this domain for words referring to moving toward, in the direction of, or near something or some place. The words in this domain should refer to moving in the direction of a place, but should not require that the person actually arrived. Some languages (such as German and Polish) distinguish 'go on foot' from 'go in a vehicle'. -7.2.3.1`5832eb32-8a90-42a7-b2bc-a9bb575b1b7c`Move away`Use this domain for words referring to moving away from a place. -7.2.3.2`2cc624fa-76cb-46ab-87c8-c13c6adb1c72`Go`Use this domain for words referring to moving away from the speaker. In Australian languages many movement words are marked for direction toward or away from the speaker. -7.2.3.2.1`aa8d812b-7c13-414a-ad02-a4240d2cef68`Come`Use this domain for words referring to moving toward the speaker. -7.2.3.3`20e7d987-0d55-46d4-ab69-0b0cce2f1e24`Leave`Use this domain for words referring to moving away from a place. -7.2.3.3.1`b08424b7-a2f1-4a0e-82d1-665249e12cfc`Arrive`Use this domain for words referring to arriving at a place. -7.2.3.4`88269184-d033-454e-b750-559d5f53287c`Move in`Use this domain for words related to moving into something, such as a house or an area. -7.2.3.4.1`d95ed463-ac64-4004-9c3b-0fce2f7639be`Move out`Use this domain for words related to moving out of something, such as a house or area. -7.2.3.5`ea2d0dc5-2cdb-4686-9f48-abe65ed295a4`Move past, over, through`Use this domain for words referring to moving past, over, or through something. -7.2.3.6`5a021f98-2efb-4baf-9384-a553dc3df86c`Return`Use this domain for words referring to returning to a place--to go back to a place you earlier left. -7.2.4`6f01b67c-33a0-4ed3-8205-f868e97a1a3a`Travel`Use this domain for words referring to traveling--to move a long distance. The words in this domain may imply that the person has to sleep somewhere other than his home. -7.2.4.1`c0b7f354-a75c-41d5-a489-ae2df6364d02`Travel by land`Use this domain for words related to traveling by land. -7.2.4.1.1`1e102423-6167-486a-bfef-dad1c9cdf1eb`Vehicle`Use this domain for things used to move. -7.2.4.1.2`4d1ac5e6-dfe3-4643-b6e5-21649a01cce9`Railroad`Use this domain for words related to railroads. -7.2.4.2`f4580c19-ba9e-4f71-a46a-6f3c4b19c36c`Travel by water`Use this domain for words related to traveling by water. -7.2.4.2.1`4bfe53d2-fb85-4397-98a8-97d59b907064`Boat`Use this domain for words related to a boat. -7.2.4.2.2`fffa74fb-5b5c-453f-9120-94686033d894`Swim`Use this domain for words related to swimming. -7.2.4.2.3`0bbe1739-e0b4-442e-b69c-02a0ea20d790`Dive`Use this domain for words referring to moving under the water. -7.2.4.3`75eb23c7-28b5-4c98-937a-1d8f371b24cf`Fly`Use this domain for words related to traveling by air. -7.2.4.4`161cae07-d1cb-467c-920f-62ba9039584c`Travel in space`Use this domain for words related to traveling in space. -7.2.4.5`547f1151-5816-4d89-b0bc-ece2a86c92eb`Move to a new house`Use this domain for words related to permanently leaving your home or country, and for words related to migrating--moving every year to the same places because of the weather and food supplies. -7.2.4.6`70953222-5bc5-4fa2-a85a-01827f7bc537`Way, route`Use this domain for words related to the way or route that you take to go somewhere. -7.2.4.7`cf93b8e0-9f28-4485-b9d6-22293ccd73ce`Lose your way`Use this domain for words related to losing your way. -7.2.4.8`390ad7fc-8360-4eae-8736-3aedc15ae659`Map`Use this domain for words related to a map--a drawing of the world or part of the world. -7.2.5`196bf7b1-54a1-4a78-8d10-c61585849c63`Accompany`Use this domain for words referring to moving with someone. -7.2.5.1`ecf9ebd7-f991-41df-98cd-bcf1254d5d0b`Go first`Use this domain for words related to going first or going ahead of someone. -7.2.5.2`1b73b2bf-9582-4f8a-822a-e0d020272c7c`Follow`Use this domain for words related to following someone. -7.2.5.3`902cfcbe-6e42-4e55-b2a5-9146702fc16b`Guide`Use this domain for words related to guiding someone--to show someone where to go by going ahead of them. -7.2.5.4`678a3319-a12b-4f92-857d-167def8ef583`Move together`Use this domain for words referring to more than one thing moving together. -7.2.6`19d54c2f-ae03-4cbc-9b7e-57292f92fbc1`Pursue`Use this domain for words related to pursuing someone--to follow someone in order to catch them. -7.2.6.1`34c9408c-c3f7-49db-8bce-de7fa7da03d7`Catch, capture`Use this domain for words related to catching someone who is trying to escape. -7.2.6.2`d7140538-fb99-4af9-8398-8c31a1b79fb5`Prevent from moving`Use this domain for words referring to preventing someone or something from moving. -7.2.6.3`36e8f1df-1798-4ae6-904d-600ca6eb4145`Escape`Use this domain for words related to escaping from danger. -7.2.6.4`28a68cea-9128-4d5c-8542-8df38c907310`Set free`Use this domain for words related to setting someone free. -7.2.7`6330871b-6008-490e-bfff-e28e17ebce7e`Not moving`Use this domain for words referring to not moving. -7.2.7.1`7110adbe-a4ce-47b0-8c2f-6b41edaf2fcb`Stop moving`Use this domain for words referring to stopping moving. -7.2.7.2`82eb3050-d382-48f6-a049-22a5f8a3b25a`Stay, remain`Use this domain for words referring to not moving. -7.2.7.3`d88d862c-01d4-4b43-9fbe-59208922e022`Wait`Use this domain for words referring to waiting in a place, waiting to do something, or waiting for something to happen. The basic idea of waiting is for someone to not do anything for a period of time, because he expects something to happen that will cause him to do something. -7.2.8`38ab2681-fcc7-4a75-bb0b-29c5cd2e3a8f`Send someone`Use this domain for words related to causing someone to go somewhere. -7.3`2810998c-d6cc-47a3-a946-66d0986a2767`Move something`Use this domain for general words referring to moving something or someone. -7.3.1`6430b89c-7077-418a-a558-51f0e3f2c1a6`Carry`Use this domain for words referring to carrying something--to pick something up and hold it while moving oneself. -7.3.1.1`7831223b-e5ed-4186-a321-94e9ae72a27d`Throw`Use this domain for words referring to throwing something. -7.3.1.2`ef025cd9-dd92-442b-a8f9-fe7ac944ccec`Catch`Use this domain for verbs for catching something that is thrown or dropped -7.3.1.3`05371057-2fe4-49ef-b203-f5bd6727645e`Shake`Use this domain for words referring to moving something back and forth. -7.3.1.4`06905a7e-47f4-4c86-afea-a4175295b566`Knock over`Use this domain for words referring to knocking something over so that it falls, and for knocking a container over so that it spills its contents. -7.3.1.5`28a37d39-8347-4254-99bf-8e3c37dbf8a8`Set upright`Use this domain for words related to setting something upright. -7.3.2`d9f336cf-0682-4702-ab94-5ade755ddc64`Move something in a direction`Use this domain for general words related to moving something in a direction. -7.3.2.1`ddef260e-b183-47f7-837e-165ffbd1af2c`Put in front`Use this domain for words referring to putting something in front of you or in front of something else. -7.3.2.2`b035dcf9-1dd0-4fb3-bd04-7c8945e92cdf`Put in back`Use this domain for words referring to putting something in back of you or in back of something else. -7.3.2.3`d975a233-1e48-4313-8bed-aada7460487e`Put aside`Use this domain for words referring to putting something to the side of you. -7.3.2.4`7c7fc1b6-3775-4881-bbe0-9d0ce50e42a9`Lift`Use this domain for words referring to putting something above you or above something else, putting something on top of something else, or moving something higher than it was. -7.3.2.4.1`f472b2d2-b4d3-4852-914d-71b66bdb6f26`Hang`Use this domain for words referring to hanging something, and for words describing something that has been hung. -7.3.2.5`ab127348-7f98-43e5-801d-01241ecdb517`Lower something`Use this domain for words referring to putting something lower than you or lower than something else, putting something under something else, or moving something lower than it was. -7.3.2.6`756f67e9-2b22-4c43-913c-ceff0e781545`Put in`Use this domain for words referring to putting something inside something else. -7.3.2.7`5a39edae-1ace-4889-b636-1dfd2a1bcc3c`Take something out of something`Use this domain for words referring to taking something out of something else. -7.3.2.8`6bd023f6-730e-44c2-ae8f-78df967e2e18`Pull`Use this domain for words related to pulling--causing something to move toward you. -7.3.2.9`20baa5e7-4f02-4782-a292-c6281d7b5f3a`Push`Use this domain for when someone or something causes something to move away from him. -7.3.3`e931da8a-efc1-46cb-836a-72fba4a1eb4f`Take somewhere`Use this domain for words referring to taking something or someone somewhere. -7.3.3.1`11cf45ec-f9d6-4c99-8782-738e26a342c8`Take something from somewhere`Use this domain for words referring to taking something or someone from its place. -7.3.3.2`3180b6aa-3ad9-4bd3-96f7-ae72264406fb`Return something`Use this domain for words referring to moving something back to an original place or person. (Something is in a place, someone (or something) moves it, then someone moves it back to the first place.) -7.3.3.3`87c55aea-2c3f-44ce-81ec-18a153c5deb2`Send`Use this domain for words related to sending something--to cause someone to take something somewhere. -7.3.3.4`b79f8775-d8d0-4aa5-b4ab-917f6f3d6c13`Chase away`Use this domain for words related to chasing or driving people and animals--to cause someone (or an animal) to move. -7.3.3.5`bca1af45-7621-43c0-9152-fac0018e5319`Drive along`Use this domain for words related to driving people and animals--to cause someone (or an animal) to move with you. -7.3.4`3b4b947a-f223-4c87-8839-9f6237cda9f6`Handle something`Use this domain for general words for using the hands to move something. -7.3.4.1`c35cba91-742c-4b98-b848-dfd520d959cf`Touch`Use this domain for words referring to touching something with your hand without moving the thing. -7.3.4.2`3885231e-8b18-4da3-af76-c75e8b731ed8`Pick up`Use this domain for words related to picking something up. -7.3.4.3`b7ed2482-6883-4a02-a992-e86c2573cc74`Put down`Use this domain for words related to putting something down. -7.3.4.4`1e419f7a-7363-46bc-8044-157ed0b40ccd`Hold`Use this domain for holding something in the hand. -7.3.4.5`5db1b502-7c36-44fb-a7b4-50744e9ec286`Actions of the hand`Use this domain for the functions and actions of the hand. -7.3.4.6`eb821083-3fb0-441a-9f1d-ad2a9ed918d8`Support`Use this domain for words related to keeping something from falling. -7.3.4.7`df47f55d-b15d-4261-881e-3c4b0dc6d9be`Extend`Use this domain for words related to extending something--to move something so that it covers a greater distance or area. -7.3.5`40590157-9412-4558-b0f7-311867b649cc`Turn something`Use this domain for turning something--to cause something to change direction, or to cause something to revolve or move in a circle. -7.3.6`8b9f23f4-a147-4ea8-a13a-c5b1edc7f5e4`Open`Use this domain for words related to opening something. -7.3.6.1`d7e4bf3e-e539-43bc-bb43-3ae0980ffb86`Shut, close`Use this domain for words related to shutting something. -7.3.6.2`7992958d-fd36-469e-a94b-f8a9eb26af64`Block, dam up`Use this domain for words referring to preventing someone or something from moving -7.3.6.3`440608df-3c98-4dc8-9fd3-fad08afe7aef`Limit`Use this domain for words referring to a limit beyond which something may or should not go, and for words referring to imposing a limit. -7.3.7`7c80f6ee-e76d-4903-aee6-7a33d1da3f75`Cover`Use this domain for words related to covering something. -7.3.7.1`5b925ee1-82ef-4692-bba2-9ce3cb41c7bb`Uncover`Use this domain for words related to uncovering something. -7.3.7.2`2608bcf8-ed20-4501-8510-4ecacf922dd4`Wrap`Use this domain for words related to wrapping something--to cover something on all sides with something like leaves, cloth, or paper. -7.3.7.3`a2240259-608b-40f1-990a-7f8e00ef1d07`Spread, smear`Use this domain for words related to spreading something--to cover something on all sides with something liquid or sticky like paint or mud. -7.3.8`991357dc-9f56-47ed-8790-85cbd5f9b06f`Transport`Use this domain for words referring to moving something in a vehicle. -7.4`24398eec-edd1-449a-ad36-d609be24a79e`Have, be with`Use this domain for words related to having something. -7.4.1`56d1a950-8798-45fb-bccd-d8b1eb37c071`Give, hand to`Use this domain for words referring to giving something to someone, in which there is no transaction of ownership, merely the movement of the thing from one person to another. -7.4.2`c96ac1eb-12f2-47af-9e96-9d99fce7e8f5`Receive`Use this domain for words related to receiving something from someone. -7.4.3`adfc2bcd-6b8e-486c-b105-29b286b61cc0`Get`Use this domain for words referring to getting something. -7.4.4`86c065ea-2420-4619-82d4-1d43527b3371`Distribute`Use this domain for words related to distributing things to several people. -7.4.5`7df3078c-f681-4123-a712-4b83e438ea1d`Keep something`Use this domain for words related to keeping something. -7.4.5.1`1b3dccfe-29e4-478e-8443-17be9454a05a`Leave something`Use this domain for words referring to leaving something or someone in a place and going away. -7.4.5.2`6c32038c-adf3-4085-bde3-cd2f21a421ba`Throw away`Use this domain for throwing away something that you no longer want. -7.4.6`e7119442-3063-422a-a03e-d02e570ccd0f`Not have`Use this domain for words related to having something. -7.5`6045c6eb-efea-4586-95f8-840d32578d66`Arrange`Use this domain for words referring to arranging things--to physically move a group of things or people and put them in a pattern. -7.5.1`c16334a0-be29-4a1e-a870-4cb3f1df984d`Gather`Use this domain for words referring to gathering things into a group. The basic idea of this domain involves a situation in which two or more things are not together, and someone moves them so that they are together. -7.5.1.1`30b3faa8-747e-465f-833a-a9957a259be2`Separate, scatter`Use this domain for words referring to separating things into groups, and scattering things. The basic idea of this domain involves a situation in which two or more things are together, and someone moves them so that they are no longer together. -7.5.1.2`71b19b9e-231c-4196-a7d7-aa56a5079782`Include`Use this domain for words related to including something in a group. -7.5.1.3`b7f058af-9ce6-4dd0-b555-00526975300e`Special`Use this domain for words that describe a member of a group that is different or special. -7.5.2`08239f53-daa5-47a6-9f39-29a9064b0c27`Join, attach`Use this domain for words related to joining two or more things together. -7.5.2.1`6ab060ca-ecfc-4a46-accb-42b0473998cd`Link, connect`Use this domain for words related to a linking or connecting things together--to put something like a road, pipe, or wire between things so that people or things can move between them. -7.5.2.2`e43c9905-ae67-4627-8b10-bd7a453828b4`Stick together`Use this domain for words referring to two or more things cohering or sticking together. -7.5.2.3`2b27b8ca-188e-44ad-aa86-ffa1f99106e3`Add to something`Use this domain for words related to adding something to another thing. -7.5.2.4`a31c85df-02a9-4dd8-a094-0f07a0afbcca`Remove, take apart`Use this domain for words related to removing part of something, taking something apart, and things coming apart. -7.5.3`fe58ae61-ab0b-43a4-86fb-d9aedd199932`Mix`Use this domain for words related to mixing things together--to put two or more different kinds of substances, like liquids or cooking ingredients, together. -7.5.3.1`9b158c9e-9ba5-4be2-a9a1-77ef888a3b06`Pure, unmixed`Use this domain for words related to being pure--words describing something (like water, food, or air) that does not have anything bad in it; or unmixed--words describing something that is only one thing and has not been mixed with something else. -7.5.4`9b267cc1-983c-407a-98d2-1e27add6292c`Tie`Use this domain for words related to tying things together. -7.5.4.1`761706fe-d289-4ace-b2c3-ab15d80dba7f`Rope, string`Use this domain for words referring to rope, string, and other things used to tie things together. -7.5.4.2`5f791daf-98a2-4787-93cc-8813aea93c4d`Tangle`Use this domain for words related to becoming tangled--when something long and thin, such as rope, string, thread, hair, grass, or vines, becomes disorganized, twisted, or knotted, so that it is hard to separate it. -7.5.5`e6c9fe4c-199e-4934-b622-739a85b0830d`Organize`Use this domain for words referring to organizing things, people, events, and ideas--to think about and decide on the pattern a group of things should be arranged in, and then doing whatever is necessary to arrange them so that they can be used for some purpose. This domain is like the domain 'Arrange' except that 'Arrange' emphasizes physically moving the things, and the domain 'Organize' emphasizes the logical system. 'Organize' does not require that the things be moved, only that the logical pattern is specified. -7.5.5.1`583c98ff-1cc8-4b05-9086-974d13a78894`Disorganized`Use this domain for words related to things becoming disorganized. -7.5.6`b3fb9960-8f42-43bc-9595-dfb3e04f5bfd`Substitute`Use this domain for words referring to substituting something for something else--to move something and put something else in its place. -7.5.7`be2f2785-7219-4a35-b8d3-aa56b9b78514`Multiple things moving`Use this domain for words referring to multiple things moving. -7.5.8`467dd680-ac64-4dc4-8a17-1cfe297d3392`Simple, complicated`Use this domain for words related to being simple or complicated--words describing the organization of a group of things. -7.5.9`3fae9066-eb66-444e-bd41-818b9f7b3bae`Put`Use this domain for words related to putting something somewhere. -7.5.9.1`4068488f-59e9-47d1-8884-a1d6dcc10c36`Load, pile`Use this domain for words related to putting lots of things on something. -7.5.9.2`dfe59469-d1bf-4ed2-9faa-6d5af52eefdd`Fill, cover`Use this domain for words related to filling a container or covering an area with something. -7.6`043d12ac-c76d-4b4c-813b-4ef7758c8085`Hide`Use this domain for words related to hiding things so that they cannot be seen or found, and for hiding oneself. -7.6.1`0ce61f27-9de8-49b2-9189-6f6efe488f6d`Search`Use this domain for words related to searching for something that has been hidden or lost. -7.6.2`bd9de99f-6a92-47ee-b6bc-e9877ea21202`Find`Use this domain for words related to finding something that has been hidden or lost. -7.6.3`b7f4fd44-fa17-46a8-bdaf-d3399d6cb0ac`Lose, misplace`Use this domain for words referring to putting something in a place and not being able to find it again, or for when someone else moves something without your knowledge so that you cannot find it. -7.7`66d8b546-92f5-4e94-b992-08be81c3d30c`Physical impact`Use this domain for general words referring to making a physical impact on something, including the words for the action itself and the result of the action. -7.7.1`d25f7907-091e-4cf7-bd8c-bdb97278b616`Hit`Use this domain for words related to hitting something. -7.7.2`5718fcc8-1eba-4b8d-9b6b-0c8349f53f80`Aim at a target`Use this domain for words referring to aiming at a target, and for hitting or missing the target. -7.7.3`be4a63e7-f4ba-4de2-be69-d26219d99cb6`Kick`Use this domain for words referring to kicking--to hit something with your foot. The words in this domain may be distinguished by the way in which the foot moves, either in a swinging motion, or by first bending the leg and then quickly straightening it. They may also be distinguished by whether the foot moves horizontally or vertically, whether the effect is to move something or damage it, or how hard the person kicks. -7.7.4`0a85ee64-e466-4295-8e2c-5b06c8e3054f`Press`Use this domain for words referring to pressing something. -7.7.5`709d43dd-ce94-4df1-91b1-edb0b12fdaea`Rub`Use this domain for words referring to rubbing--to move something smooth against something else, in order to make it smooth or clean. -7.7.6`a3ba23d2-618e-4618-af18-9befae2f888b`Grind`Use this domain for words referring to grinding--to rub something rough against something else, while applying force, in order to break it or remove its surface. -7.7.7`06be473e-c2f3-45fe-8522-3a0c033b5067`Mark`Use this domain for words related to making a mark on something. -7.8`e5f9c9cf-0b0c-47aa-b7df-8c37f211cd00`Divide into pieces`Use this domain for words referring to dividing something into parts or pieces, perhaps with the added idea of using care, or into a certain number of parts. -7.8.1`23b1a6b4-8d91-425c-b8c2-52d06b1c1d23`Break`Use this domain for words referring breaking something into pieces, perhaps with the added idea of doing it accidentally or without being careful. -7.8.2`b62b5fc7-1b20-4f63-8459-8eb4991839ee`Crack`Use this domain for words referring to a crack--a partial break in something that does not entirely divide it in pieces. -7.8.3`42be1634-72ca-4a20-80a1-ba726e5cd1d2`Cut`Use this domain for words related to cutting something. -7.8.4`b0b161b2-e773-4b04-99eb-23778fd2aa80`Tear, rip`Use this domain for words related to tearing or ripping something. -7.8.5`313a65bf-450f-48da-8903-a43247f1a5f8`Make hole, opening`Use this domain for words related to making a hole or opening in something. -7.8.6`c5b8c936-1e01-4e86-9145-a2b721ec9e39`Dig`Use this domain for words related to digging in the ground. -7.9`f5156cde-9735-4249-920d-597fb0a7a8e3`Break, wear out`Use this domain for words related to something breaking or wearing out, especially for things that people make and use. -7.9.1`eb00b4c2-5b87-4ef8-9548-800fc5c9b524`Damage`Use this domain for words referring to damaging something--to do something bad to something, but not completely ruin it so that it can't be used any more. -7.9.2`1a28d255-8f58-428c-9641-59f17f8b1e08`Tear down`Use this domain for words referring to tearing down buildings and other structures. -7.9.3`ca98bd7b-8711-41f6-86d0-5cd07b7bfe0d`Destroy`Use this domain for words referring to destroying something--to damage something so that it is beyond repair and cannot be used. -7.9.4`41cac849-613d-4be4-a3bc-389412b7f653`Repair`Use this domain for words related to repairing something. -8`c72985cf-b07f-4ed5-873a-a2209929667e`States`Use this domain for general words refer to the state or condition of something. -8.1`c6c772af-7b6b-4393-b0da-5b4a329d3426`Quantity`Use this domain for general words referring to the amount or quantity of something. -8.1.1`fb84538a-17a8-4adc-8d50-e2b66f8e4099`Number`Use this domain for words related to numbers. Every language has a word for 'one', and a word for 'two'. These two numbers often have special words. So we have included a separate domain for 'one' and 'two'. In addition the numbers form a series (one, two, three...). Most languages have more than one series of numbers (first, second, third...). So we have also included a domain for each series of numbers that most languages have. Your language may have other series of numbers. Put them in the domain 'Number series'. -8.1.1.1`b6686c7c-39de-40b5-adee-67fc7dc54374`Cardinal numbers`Use this domain for words related to the cardinal numbers (one, two, three)--the numbers used to count. -8.1.1.1.1`2c04fa05-eebf-4331-b392-23f795c32382`One`Use this domain for words related to the number one. It appears that every language has a word for 'one' and 'two', but not every language has a word for the numbers higher than two. Many languages have several words that mean 'one'. -8.1.1.1.2`d086c2ad-2d11-4250-a25a-dc6538439db6`Two`Use this domain for words related to the number two. -8.1.1.2`816490a4-2cac-472a-bbb0-eafbb9bbe4a8`Ordinal numbers`Use this domain for words related to the ordinal numbers (first, second, third)--the numbers used to indicate the order of something in a series, such as "the first child". -8.1.1.3`d85d0838-a9e4-4787-8fce-7d0466bc24b9`Number of times`Use this domain for numbers that refer to the number of times something happens or is done. These numbers may be adverbs as in English (twice) or in some languages they may be verbs (to do something two times). -8.1.1.4`a57185c3-0cb5-41fa-94bf-da0c9edac600`Multiples`Use this domain for words related to multiples of something (single, double, triple). -8.1.1.5`ffa13b7d-5eaa-43be-8518-51d9aa08f321`Numbered group`Use this domain for words related to a group of a particular number of things or people (solo, duo, trio; alone, in threes). -8.1.1.6`64e6c0db-6dd6-4b80-bbe9-c96bb161674b`Fraction`Use this domain for the numbers that refer to a fraction of something. -8.1.1.7`0e250e72-6c3f-424f-9e62-2dcc9729d817`Number series`Use this domain for other series of numbers that are different from those in the previous domains. -8.1.2`c0d903bf-6502-45dd-9dd8-cff7f022c696`Count`Use this domain for words related to counting--to say the numbers in order, or to use numbers to find an amount. -8.1.2.1`8bdf4847-903b-4af6-9553-3cfab65de516`Mathematics`Use this domain for words related to mathematics and arithmetic--the study of numbers. -8.1.2.2`83899b19-8b39-4bf0-b124-4c6188569ec8`Add numbers`Use this domain for words related to adding two numbers together. -8.1.2.3`7cf6312e-f9f0-49e8-ae60-7677fac86c3f`Subtract numbers`Use this domain for words related to subtracting one number from another. -8.1.2.4`57f07b5f-75bf-4565-b969-ce0adc0b50d4`Multiply numbers`Use this domain for words related to multiplying one number times another. -8.1.2.5`7b17e304-9a3f-463f-8216-cd1e1e119e0e`Divide numbers`Use this domain for words related to dividing one number by another number. -8.1.3`0ebf9fcc-ee38-4f5f-ab5e-c76e199ef7ae`Plural`Use this domain for words and affixes that indicate that there is more than one of something. Some languages, such as Indo-European languages, indicate plural with an affix. Other languages, such as Austronesian languages, use a separate word. Some languages also have words or affixes that indicate that there are two of something. -8.1.3.1`1b6b0c12-9ecd-45cb-bb0e-0dadb435eddf`Many, much`Use this domain for words indicating that there are many things or people, or that there is much of something. -8.1.3.2`36934fab-c0ed-4f25-a387-e1cca26b2401`Few, little`Use this domain for words related there being few or little of something. -8.1.3.3`d8ea1902-5fa6-4fda-b7b2-1f9c301cdc5f`Group of things`Use this domain for words that refer to a group of things. -8.1.4`8216627d-9d20-4a5c-8bfd-0709c16e7a08`More`Use this domain for words related to there being more of something. -8.1.4.1`fcc204a3-eae4-46d1-a9dc-08864fde1772`Less`Use this domain for words that indicate that the number or amount of something is less than the number or amount of another thing. -8.1.4.2`f2022802-4f43-4fa2-8c58-33a8b9e75895`Increase`Use this domain for words related to something increasing in number or amount--to be more than before. -8.1.4.3`1ff743cb-49e0-483d-8a1d-4603a7d6c395`Decrease`Use this domain for words related to something decreasing in number or amount--to be less than before. -8.1.5`f7960e84-5af9-4999-9028-783058aa8c5c`All`Use this domain for words related to all. -8.1.5.1`cbcff912-e1c2-4d9b-9938-85d73e7e7265`Some`Use this domain for words related to some--a number or amount of things or people when the number is not stated; an indefinite number or amount. -8.1.5.2`bfbfb9b5-363d-4767-a5cb-1b11b348efd6`None, nothing`Use this domain for words that nothing, no one, never, and nowhere. -8.1.5.3`bbb21324-089d-4368-a2ac-37c6bbfcbffc`Both`Use this domain for words referring to both of two things. -8.1.5.4`d1687857-0f1d-4098-affb-b283a6677b6b`Most, almost all`Use this domain for words related to most--more than half and less than all of something. -8.1.5.5`0aaacffe-9b6c-49a7-bf68-c0f9ff3e120e`Most, least`Use this domain for words related to the most--the largest number or amount; or the least--the smallest number or amount. Most/least may refer to the largest/smallest number possible or needed. If there are several groups being counted, most/least may refer to the largest/smallest group. -8.1.5.6`afdd8b8e-9502-4d06-94ee-e79815b65750`Almost`Use this domain for words related to a number or amount that is almost the same as another number. -8.1.5.7`e94a5cf3-1fd4-4b52-902f-bbf0ad6bac2b`Only`Use this domain for words referring to only a particular number or amount of people or things--no more than one, or no more than a particular number or amount. -8.1.5.8`8f4c9266-a025-4b7a-bd67-fe0c043bf6f5`Exact`Use this domain for words that indicate whether a number or amount is exact--not more and not less. -8.1.5.8.1`ca752706-1c9e-43e7-bd17-845c4736ccd8`Approximate`Use this domain for words that indicate whether a number or amount is approximate. -8.1.5.9`3389561c-f264-48b9-b94c-86c33fc3c423`Average`Use this domain for words related to an average number. -8.1.6`7cfc8b3c-ad67-4928-ae6a-74afd47ced89`Whole, complete`Use this domain for words describing a whole thing--all of something with no parts missing. -8.1.6.1`aadefee4-ed14-4753-952e-e945f2972e37`Part`Many things have parts. Use this domain for words referring to a part of something, and for words that express the idea that something has parts, that something is a part of something, or that link the whole with a part. -8.1.6.2`1d34380d-61bf-4247-9145-ba318a14a97e`Piece`Use this domain for words referring to a part of something that has been broken or cut off. -8.1.7`286ee16c-a218-43d5-bbac-ab15f80c3fcf`Enough`Use this domain for words related to being or having enough--to have as much of something or as many of something as you need or want. -8.1.7.1`755a7462-1d87-48b0-939c-08be5b5ea002`Extra`Use this domain for words related to having extra--to have more than enough or more than what you need. -8.1.7.2`1621aac3-4ea9-4373-bf1b-40fce0ca7b5e`Lack`Use this domain for words related to having insufficient--to not have enough. -8.1.7.3`d1b3d0f0-5319-4a6a-8a70-2179a8e76d22`Need`Use this domain for words related to needing something for some purpose. -8.1.7.4`60b8dcfd-49a0-4ab4-82a7-2c5058b325ae`Remain, remainder`Use this domain for words related to the remainder of something--the part or amount of something that remains behind after the other parts have been taken away. Something can be left because everything else has been used or eaten, or everything else has been destroyed or burned. -8.1.8`8a81b9bc-9c66-4d57-a2d1-2e592604c4b1`Full`Use this domain for words referring to a container being full of something. -8.1.8.1`e9cafabe-f0f7-4142-a6f6-d1c94bdc4b5c`Empty`Use this domain for words referring to being empty. -8.2`8a0c5ed9-0041-4af5-a193-329e6c9f2717`Big`Use this domain for words describing something that is big. -8.2.1`b43fae8e-6b19-42ed-98cd-d363174b9cf8`Small`Use this domain for words referring to being small. -8.2.2`7648040b-0aa5-4d9a-8f13-ffd066b81602`Long`Use this domain for words related to being long. In many languages there is more than one system of measuring length. These systems may be used for different purposes or in different jobs. For instance measuring the length of an object may use different words than measuring the distance a person travels. -8.2.2.1`3ccc3a21-07c8-4983-a044-e3c74b538135`Short, not long`Use this domain for words related to being short in length. -8.2.2.2`b844d2f8-d3ef-4605-b038-8bc0a2cff0af`Tall`Use this domain for words related to being tall--a word describing something that is big from the top to the bottom. -8.2.2.3`0aae1951-4d5b-45a0-853c-1839764c9862`Short, not tall`Use this domain for words related to being short in height. -8.2.3`b1688009-474d-4e2e-a137-acc1e32a435f`Thick`Use this domain for words referring to being thick. -8.2.3.1`627280f0-4f98-4b31-ad23-eabe37b002ad`Thin thing`Use this domain for words describing something that is thin. -8.2.3.2`45d867c7-8496-4c92-bb41-b7db5db47717`Fat person`Use this domain for words describing a person or animal who is fat. -8.2.3.3`08c05e00-9660-4491-af2f-a05fab27ef39`Thin person`Use this domain for words describing a person or animal who is thin. -8.2.4`f8863b67-b911-4334-a1b6-6eb913bd14af`Wide`Use this domain for words related to being wide--a word describing something like a road or river that is far from one side to the other side. -8.2.4.1`aa2b547c-2c82-4ce0-a1b3-35fa809d666c`Narrow`Use this domain for words related to being narrow. -8.2.5`67e57493-d286-4271-b877-f63f962dddf1`Big area`Use this domain for words describing a big area. -8.2.5.1`ea17aba7-6d4e-4dbf-89ea-84a1b1c47647`Big container, volume`Use this domain for words referring to the volume of something. -8.2.6`73d580ac-dc89-474c-8048-3453ebdda807`Distance`Use this domain for words referring to the distance between two things. -8.2.6.1`bba30b56-6cd8-4542-81ab-f983cf1354bd`Far`Use this domain for words indicating that something is far from something else. -8.2.6.2`1133ad78-9ce9-46aa-b181-bb6f7a84a07b`Near`Use this domain for words indicating that something is near something else. -8.2.6.3`7d8898d6-6296-4d4d-b8dd-2f48c49f9e98`High`Use this domain for words that express the idea that something is high. -8.2.6.4`6c54f0b0-b056-4090-b3f0-d5ec6710d4ab`Low`Use this domain for words indicating that something is low--in the air but not high above the ground. -8.2.6.5`4e7a6dfe-3654-4ca1-874d-02424581b774`Deep, shallow`Use this domain for words related to being deep or shallow--how far something such as a hole extends below the ground or other surface, or how far something is below the surface of the water. -8.2.7`d0dee676-f3ae-43cc-96f1-7e3bb65870f5`Fit, size`Use this domain for words referring to something fitting--when something is not too big or too small, but just right. -8.2.7.1`4d61f524-7213-4c2c-8c14-f8eff3aed813`Tight`Use this domain for words referring to being tight--when something is too small. -8.2.7.2`7162885d-1d35-4baf-97d6-7368fff7c723`Loose`Use this domain for words referring to being loose--when something is too big. -8.2.7.3`a3fb18fd-befb-493f-8a19-760883ed9697`Wedged in, stuck`Use this domain for words referring to being wedged in or stuck in a hole. -8.2.8`dfdcfa24-b013-4566-af4a-28ef1dfd4742`Measure`Use this domain for words related to measuring something--to find out the size, length, weight, or amount of something. -8.2.9`aba3f7f1-9e13-4b48-acbb-3bf6d6bfa0e8`Weigh`Use this domain for words related to weighing something. -8.2.9.1`d574c970-6834-4566-ae37-f42c7e95483b`Heavy`Use this domain for words related to being heavy. -8.2.9.2`6e7d10f8-6da5-4a8a-a06d-952511194105`Light in weight`Use this domain for words related to being light in weight. -8.3`ac9ee84f-f0c7-48b3-8e5a-b4c967112394`Quality`Use this domain for general words referring to the quality or condition of something. -8.3.1`080bf07b-e58b-4a75-bb97-84d980a143f0`Shape`Use this domain for general words referring to the shape of something, and for general words referring to changing the shape of something. -8.3.1.1`6ffe33fe-b49c-45c8-a50b-cd0065c0c869`Point, dot`Use this domain for words referring to a point--a small mark such as might be made by a pointed object. -8.3.1.2`07e97f87-68ca-4d18-9f86-a326e0400947`Line`Use this domain for words referring to a line. -8.3.1.3`a3ca2a31-259e-4e15-9696-75b0c81886e9`Straight`Use this domain for words referring to being straight. -8.3.1.3.1`61f40376-729d-4d99-894f-06c5689a06ac`Flat`Use this domain for words describing something that is flat--having a surface that is even. A board or wall is flat when its surface is even and it does not bend. -8.3.1.4`82a4ae36-8e70-4c0d-8144-ad9fc3c0e04f`Horizontal`Use this domain for words describing a horizontal orientation in relation to the ground or something that is level--a flat surface that does not rise in any direction. A person is horizontal when he is sleeping. A field is level when it is not on a hill and it has no uneven areas in it. -8.3.1.4.1`b8df8589-d03c-4e6d-bbeb-4f24fbf6a1dc`Vertical`Use this domain for words describing a vertical orientation in relation to the ground. A person is vertical when he is standing. -8.3.1.4.2`0add0775-0ed0-46be-ba4a-76310e63a036`Leaning, sloping`Use this domain for words describing a leaning orientation in relation to the ground, or a surface that is sloping. -8.3.1.5`5c35c2f8-d17c-42a3-aa12-a4c29b6603e8`Bend`Use this domain for words referring to bending something and for words that describe something that is bent or curved. -8.3.1.5.1`7ee92ca4-19aa-4abd-9f88-508766acc39c`Roll up`Use this domain for words referring to rolling something up. -8.3.1.5.2`19fea936-30d1-482f-a103-1c5549b19745`Twist, wring`Use this domain for words referring to twisting something--to take something long and turn one end one way and the other end the other way. -8.3.1.5.3`8f7c9d7d-9b2a-40f3-9314-8f16f0aa31ef`Fold`Use this domain for words referring to folding something. -8.3.1.6`6c36a680-4ff4-43b9-a7c2-9037ceb0d3f6`Round`Use this domain for words referring to being round. -8.3.1.6.1`2d563d27-8ac3-41c9-b326-856c9e1f6401`Concave`Use this domain for words describing something that is concave--extending inward in shape away from the viewer. The inside of a bowl is concave in shape. -8.3.1.6.2`995ee828-2393-462b-be82-47f5b5439aaf`Convex`Use this domain for words describing something that is convex--extending outward in shape toward the viewer. -8.3.1.6.3`3d10e03a-7902-458d-9c45-938da103d639`Hollow`Use this domain for words describing something that is hollow--empty on the inside. -8.3.1.7`0fabc72a-ce97-41f3-8a2d-2f27eae09499`Square`Use this domain for words referring to being square. -8.3.1.8`706cb38c-9aca-4e2f-9653-d9562f07331c`Pattern, design`Use this domain for words that refer to a pattern--a regular arrangement of shapes. -8.3.1.8.1`45b7dcce-21d5-4738-a64d-e8b0be8a1824`Symmetrical`Use this domain for words that describe something that is symmetrical--having the same shape on both sides -8.3.1.9`2594fe01-4d20-4a20-b093-2df70bced18f`Stretch`Use this domain for words referring to stretching something. -8.3.2`2621e605-3ecc-4f3d-b28c-f8c92b3c4584`Texture`Use this domain for general words referring to the texture of something--how the surface of something feels when you touch it. -8.3.2.1`867f515b-ed0f-431e-a84a-6c562e1bdbb7`Smooth`Use this domain for words referring to being smooth. -8.3.2.2`2e09535f-f61f-4ff5-8d56-23c2916cbb7f`Rough`Use this domain for words referring to being rough. -8.3.2.3`313ca832-ce91-44c9-bb35-bd130c39d924`Sharp`Use this domain for words describing something that is sharp. -8.3.2.3.1`34fe8676-7bda-493d-a012-bc5748e87823`Pointed`Use this domain for words describing something that is pointed. -8.3.2.4`396a2a1b-832f-4180-b26a-c606550541d7`Blunt`Use this domain for words describing something that is blunt. -8.3.2.5`c8aea8b2-4088-4d20-a0d2-45c2ad974ee1`Furrow`Use this domain for words related to a furrow--a long mark cut into the surface of something, such as the furrow made by a plow, or a long cut made by a knife. -8.3.3`4bf411b7-2b5b-4673-b116-0e6c31fbd08a`Light`Use this domain for words related to light. -8.3.3.1`a7824686-a3f3-4c8a-907e-5d841cf846c8`Shine`Use this domain for words related to a light source shining--for something to make light. -8.3.3.1.1`64e41545-3a0a-4524-a8d4-8e5e0f0e2391`Light source`Use this domain for words related to a source of light--something that makes or gives light. -8.3.3.1.2`2330813b-7413-41a8-8eb2-ae138511c953`Bright`Use this domain for words describing something that is bright. -8.3.3.2`bf9606ec-9a8e-4822-8bfd-d5eebc58c65b`Dark`Use this domain for words describing something that is dark--a place where there is little or no light. -8.3.3.2.1`cba6876c-5b48-42f4-ae0a-7fbe9bb971ef`Shadow`Use this domain for words related to a shadow--the area on the ground where the light does not shine because something is in the way. For instance if the sun (or another light) is shining on an object, the area behind the object is in shadow (dark). -8.3.3.3`d01f1c51-522e-4b35-81b3-00577dbfa3bd`Color`Use this domain for words related to color. -8.3.3.3.1`7adf468c-b93a-4b04-8af6-4c691122a4eb`White`Use this domain for words describing something that is white. -8.3.3.3.2`ff73fb69-7dac-43e2-876b-0ead264c3f2d`Black`Use this domain for words describing something that is black. -8.3.3.3.3`538a4c20-01d7-40b9-b462-ae279ff3dc27`Gray`Use this domain for words describing something that is gray. -8.3.3.3.4`536a2d3e-2303-43bc-bf53-379131eb5730`Colors of the spectrum`Use this domain for words describing something that is colored. -8.3.3.3.5`16de6eab-afab-4ba4-a279-cf0ba4d7c9e6`Animal color, marking`Use this domain for words related to animal colors and markings. -8.3.3.3.6`a8b3fa0c-077e-4c0d-b4cc-36dcfbdcb4d4`Change color`Use this domain for words related to changing the color of something. -8.3.3.3.7`97ed5af8-29ca-428d-8ac5-c61b61a963fd`Multicolored`Use this domain for words describing something that is multicolored--having many different colors. -8.3.3.4`aed6c1ec-abbe-47e3-a6cc-a99ecff3b825`Shiny`Use this domain for words that describe something that is shiny--when something gives back light because light is shining on it. -8.3.4`742996cd-b87f-40a8-bdb3-dba74219bd73`Hot`Use this domain for words describing something that is hot. -8.3.4.1`82e4394a-2f58-4356-8d9c-1ad9dbe95293`Cold`Use this domain for words describing something that is cold. -8.3.5`bfeba2a4-4479-49e9-838c-3baa2ad0fcae`Type, kind`Use this domain for words related to something being a type of thing, or that something belongs to a class of things. -8.3.5.1`25763563-5ad6-4b4d-9073-3fc88f6dd44e`Nature, character`Use this domain for words related to the nature of character of something. -8.3.5.2`fe9253f4-d063-4d63-91af-85273d61337f`Compare`Use this domain for words related to comparing something or someone with another thing. -8.3.5.2.1`99b5b80a-a2d6-4820-adfc-1da72528c272`Same`Use this domain for words describing something that is the same thing as you just mentioned, or describing two things that are exactly the same. -8.3.5.2.2`fba27833-d6f1-4c36-ac39-28902b29261b`Like, similar`Use this domain for words describing two things or people that are similar, but not the same. -8.3.5.2.3`0d427d55-d63e-4a35-a66a-5e4dce0a963e`Different`Use this domain for words describing two things that are different--not the same. -8.3.5.2.4`99988f94-3aa4-4984-88df-ae228f01d3b7`Other`Use this domain for words related to other, as in 'the other person', 'another thing'--a thing that is not the same as something that has been mentioned. -8.3.5.2.5`2f98291a-47a7-4b7b-9256-2c0249105be1`Various`Use this domain for words describing a group of things that are all different from each other. -8.3.5.2.6`23fa2115-3979-472c-8939-4db8d54e4c98`Opposite`Use this domain for words describing two things that are opposite. -8.3.5.3`06a44085-cbcf-4217-ae5e-56c51899c99a`Common`Use this domain for words describing something that is common. -8.3.5.3.1`f6896060-4d5c-45e2-b89a-f9f6328a479c`Usual`Use this domain for words describing something that is usual. -8.3.5.3.2`b0156a7c-928a-4cc8-a021-4af4dc74fead`Unusual`Use this domain for words describing something that is unusual. -8.3.5.3.3`2cccfd92-de45-42c2-83f7-1e0ef7dfddc1`Unique`Use this domain for words describing something that is unique--not like anything else. -8.3.5.3.4`6a6f0748-a6e9-4d64-b14e-543bb6ec2ec8`Strange`Use this domain for words describing something that is strange. -8.3.5.4`ac527685-f31d-42f3-81bd-97221a01c7ef`Pattern, model`Use this domain for words related to a pattern or model. -8.3.5.5`af62c8f6-43c7-4c44-a0d1-ab9bcff8e26f`Imitate`Use this domain for words related to imitating someone--to do things in the same way as another person. -8.3.5.6`0c7c33f2-4cfa-42df-84bb-19fc915a72bd`Copy`Use this domain for words related to copying something. -8.3.6`c05bf8c3-78f2-4ec5-b0d7-32d4963a5794`Made of, material`Use this domain for words that mark the material out of which something has been made. -8.3.6.1`e86364ac-6fa1-4aad-a6c1-068d56b6a1f1`Strong, brittle`Use this domain for words that describe something that is strong--not easily broken. -8.3.6.2`16ee1e09-27ad-48c5-aa07-6933ecbbc716`Hard, firm`Use this domain for words that describe something that is hard--not easily cut, or broken. -8.3.6.3`314c8fea-4bdb-4bc8-ab67-a26a9c5abbd4`Stiff, flexible`Use this domain for words that describe something that is stiff--not easy to bend. -8.3.6.4`6c305af5-cff5-4f7f-bd89-040d4c265355`Dense`Use this domain for words describing something that is dense. -8.3.6.5`47f170eb-5f1d-49a5-85bb-240047f392c0`Soft, flimsy`Use this domain for words describing something that is soft or flimsy. -8.3.7`83adeb9d-c0be-4073-894d-913014420280`Good`Use this domain for words describing something that is good. -8.3.7.1`aecf2aad-b7a4-444f-9b13-64bc534126d2`Bad`Use this domain for words describing something bad. -8.3.7.2`434ec34f-e7ca-44f8-9252-dff5b9b2b62f`Better`Use this domain for words describing something that is better than something else. -8.3.7.2.1`91cc7e8f-522e-4ff1-b545-5a5b72f4e953`Worse`Use this domain for words describing something that is worse than something else. -8.3.7.3`c7ccc5bb-181d-420f-8665-64793fefb37b`Perfect`Use this domain for words describing something that is perfect. -8.3.7.4`b59f6fc4-629d-4e62-8673-cf62f8ad8197`Mediocre`Use this domain for words describing something that is mediocre. -8.3.7.5`11665f1d-aca9-4699-afb2-bcdea69c6645`Important`Use this domain for words describing something that is important. -8.3.7.5.1`8938e132-6534-4428-9b03-cb1f459b7cbe`Basic`Use this domain for words describing something that is basic. -8.3.7.6`c9b5f83e-529d-45af-949f-4cc6b0591b66`Improve`Use this domain for words related to improving something--to make something better. -8.3.7.7`f29dccae-1654-4eb7-8aae-04f7df4fe90c`Right, proper`Use this domain for words describing something, such as a tool or way of doing something, that is proper for a particular time, place, purpose, or job. The words in this domain involve a comparison between two things, an item and a setting. An evaluation is made as to how good the item is in the setting. The words may be used only of certain types of items, certain types of settings, or certain types of usefulness. -8.3.7.7.1`21f21658-a69a-491c-a37b-156a8f4ad3fb`Wrong, unsuitable`Use this domain for words describing something, such as a tool or way of doing something, that is unsuitable for a particular time, place, purpose, or job. -8.3.7.7.2`c7dbd50e-0ff5-42af-a7a9-9eaf03671c49`Convenient`Use this domain for words describing something that is convenient--a good time to do something. -8.3.7.7.3`2b2bedd5-3f9c-4c18-a256-aa65ee19f15c`Compatible`Use this domain for words related to being compatible--words that describe two things or people that can be together or work together without problems or conflict. -8.3.7.8`76a06e45-99f7-446f-a2e8-e23edf6064bd`Decay`Use this domain for words related to something decaying--when a living thing dies and becomes bad, or when a part of a living thing becomes bad. -8.3.7.8.1`94f50cb8-9a59-42cc-9891-247cc3de7428`Rust`Use this domain for words related to metal rusting--when metal becomes bad. -8.3.7.8.2`de7b8df5-83a7-4456-a63a-1075ff17dbaf`Blemish`Use this domain for words related to a blemish--something small and bad on the skin of a person or the surface of something, but not something serious, especially something wrong that does not affect how something works. -8.3.7.8.3`03352940-c220-4a32-a9a5-fc08d1d0dc71`Garbage`Use this domain for words related to garbage--something that is no longer wanted. -8.3.7.8.4`98f9ceff-e8a2-4e24-abc4-561b80bb5889`Preserve`Use this domain for words related to preserving the condition of something from decay. -8.3.7.9`cd4300c9-265e-4457-8e33-4e0c9a4d4ba8`Value`Use this domain for words related to the value of something. -8.3.8`130e2cbb-7e51-4f6f-a1cf-7a053a44c9b7`Decorated`Use this domain for words describing something that is decorated. -8.3.8.1`91e95825-677a-4221-9e55-78a73bbac6ee`Simple, plain`Use this domain for words describing something that is simple or plain. -8.3.8.2`312ce7a7-8c7c-416d-bf93-73376f1f16d8`Glory`Use this domain for words describing the appearance of something that has pleasing aspects or inspires awe and wonder in the viewer. For instance, the palace of a king, the home of a rich man, or a temple may be elaborately decorated and be described as glorious or magnificent. Or something in nature such as a sunset or flower may inspire awe and wonder. -8.4`21167445-f1b1-49b4-b147-bc792616c432`Time`Use this domain for general words related to time, and for words indicating the temporal location of an event. -8.4.1`14ad95ad-50fc-450f-b44d-4273df0b1e8b`Period of time`Use this domain for words referring to a period of time. -8.4.1.1`f8c6a6a9-49f0-408a-9237-a66e852da7d3`Calendar`Use this domain for words related to the calendar. -8.4.1.2`afe7cc92-e0ad-40d9-be56-aa12d2693a3f`Day`Use this domain for words referring to a day. -8.4.1.2.1`1088cc2f-83ae-4911-8018-401a745dcfd5`Night`Use this domain for words referring to night. -8.4.1.2.2`3a0dc521-f028-4c17-945c-b121e2d3dc0b`Yesterday, today, tomorrow`Use this domain for words referring to days relative to each other. -8.4.1.2.3`0cc62b4a-d5ff-4f45-83d1-e2b46e5d159a`Time of the day`Use this domain for words referring to a time of the day. -8.4.1.3`b21ace5f-9307-4bdc-b103-9fdf14a5655e`Week`Use this domain for words related to a week. -8.4.1.3.1`de544ebd-9f94-4831-8887-944c3bbbc254`Days of the week`Use this domain for words referring to the days of the week. -8.4.1.4`4e23b037-0547-4650-89c3-2b259b637fb6`Month`Use this domain for words referring to a month. -8.4.1.4.1`46dbda42-fe21-4e52-8eeb-4263ded7031b`Months of the year`Use this domain for words referring to the months of the year. -8.4.1.5`0622d3f7-1ab2-482b-9f9c-9c101cd35182`Season`Use this domain for words referring to seasons of the year that are related to the time of year, the weather, or times of cultivation. -8.4.1.6`fcf16495-5226-4192-afdb-e748192efc3a`Year`Use this domain for words referring to a year. -8.4.1.7`1689ac96-1159-4575-bf5f-d16345f9496c`Era`Use this domain for words referring to an era--a very long period of time. -8.4.1.8`659ccabf-f978-4852-a1a6-c225f1d76b97`Special days`Use this domain for words referring to a special day. -8.4.2`c2b720f5-1123-446e-9f60-088a3272b889`Take time`Use this domain for words referring to taking time to do something. -8.4.2.1`5bb495a5-ab5b-4409-8cd1-e48b56401fad`A short time`Use this domain for words referring to a short time. -8.4.2.2`7ea946fb-6469-4f21-a5a4-7963878e6fe2`A long time`Use this domain for words referring to a long time. -8.4.2.3`c8185ca6-567a-40ef-939f-ffefdd9a4770`Forever`Use this domain for words referring to something happening forever. -8.4.2.4`f3a26e0a-727f-43ab-9310-88b8cec8f6d7`Temporary`Use this domain for words referring to something being temporary. -8.4.3`532245e7-8f46-4394-9045-240475ee62e8`Indefinite time`Use this domain for words referring to an indefinite time. -8.4.4`06cb2024-5f7b-467c-b32c-ef4c56030ac0`Telling time`Use this domain for words related to telling time. -8.4.4.1`12d752d5-53a9-46f6-9e81-3153401cc760`Plan a time`Use this domain for words referring to planning the time of an event. -8.4.4.2`c4fdb9ce-93cc-405b-b673-4058821bf794`Clock, watch`Use this domain for machines that indicate what time it is. -8.4.5`1f4efae7-1029-4b66-80ee-802459a7baf5`Relative time`Use the domains in this section for words that relate one time to another. Use this domain for words that indicate a temporal relation between situations. -8.4.5.1`00269021-e1c4-474d-9dba-341d296bdac7`Order, sequence`Use this domain for words referring to temporal order or sequence--the order in which a group of events happen. Things and people may also be in order based on the order in which something happened or should happen to them. -8.4.5.1.1`00041516-72d1-4e56-9ed8-fe235a9b1a68`Series`Use this domain for words related to a series--several things that happen one after another. -8.4.5.1.2`f352a437-58f2-4920-aec3-eda8041f7447`First`Use this domain for words referring to something happening first--to be before all other things in order or time. -8.4.5.1.3`a345d090-14e2-4897-9186-debcb05ab27c`Next`Use this domain for words referring to something happening next. -8.4.5.1.4`49aa89f2-2022-4213-845e-dbbb4b53476c`Last`Use this domain for words referring to something happening last--to happen after all other things in a sequence, or to be the last person or thing in a sequence. -8.4.5.1.5`6712385a-6740-4f28-8bbe-8615ea17116b`Regular`Use this domain for words referring to something that happens regularly. -8.4.5.1.6`95a8d932-9554-439f-afb5-ab158f2eed96`Alternate`Use this domain for words related to alternating--when several things happen one after another in a repeated pattern. -8.4.5.2`d80360f9-7319-40a7-a2bc-fd8718711ba4`Before`Use this domain for words referring to one event happening before another. -8.4.5.2.1`bdaecf2f-d0fa-49f7-891e-bcb0a31ae630`After`Use this domain for words referring to one event happening after another. -8.4.5.2.2`9f8b8c01-f790-469f-bc37-dece6227e276`At the same time`Use this domain for words referring to two things happening at the same time. -8.4.5.2.3`69d039e6-f669-4d54-8b67-89b19ff0a19c`During`Use this domain for words indicating that something happened during some time period, or that something happened while something else was happening. -8.4.5.3`6bf8ce57-1970-4efb-a7d7-b0bf8be6fb6b`Right time`Use this domain for words referring to the right time to do something. -8.4.5.3.1`eb662979-604c-455e-a2c6-a84b03a2ee3a`Early`Use this domain for words that indicate that something happens early--before the expected time, before the usual time, or before the time that was agreed on. Some words may include the idea that it is good that the event happened early. Other words may include the idea that it is bad that the event happened early. -8.4.5.3.2`b7b0819b-eceb-4f16-ae6d-2298c4df1e6f`On time`Use this domain for words describing something happening on time--at the expected time, at the usual time, or at the time that was agreed on. -8.4.5.3.3`6fb1d03c-b0fe-49b7-a473-168f12a54a36`Late`Use this domain for words describing something happening late--after the expected time, after the usual time, or after the time that was agreed on. -8.4.5.3.4`4526b41d-6f3c-494f-93a2-ea3e9705269d`Delay`Use this domain for words referring to something delaying someone or something--to cause something to happen at a later time, cause someone to do something at a later time, or cause someone or something to be late. -8.4.5.3.5`daefd275-98e3-4534-a991-c7d396b54c69`Postpone`Use this domain for words referring to postponing something--to decide to do something later. -8.4.6`18a6684f-d324-45ee-855c-44d473916b14`Aspectual time`Use this domain for words referring to a time period that is part of a longer time period. -8.4.6.1`3f37bb6f-cd32-4430-aa35-700acabbee15`Start something`Use this domain for words referring to starting something, or for something beginning to happen. -8.4.6.1.1`5261497b-6beb-4db1-9de2-10b5f6f8ec69`Beginning`Use this domain for words referring to something beginning to happen, to beginning to do something, to cause something to start happening, or to cause people to start doing something. -8.4.6.1.2`2c42f822-2079-440c-b3b7-7725b6a8db8b`Stop something`Use this domain for words related to the end of an action or situation. -8.4.6.1.3`86615235-8cdd-413d-b722-11bc5a4653d6`End`Use this domain for words referring to the end of an action or situation. -8.4.6.1.4`590570c5-3267-4966-b0db-2af7a5105c83`Until`Use this domain for words that indicate that something will continue to happen until a particular time or until something else happens, and then it will stop. -8.4.6.1.5`3edb307f-be46-40b6-a6a4-ae075b40258c`Since, from`Use this domain for words that indicate that something will start to happen at some time and continue for some time. -8.4.6.2`bbc5b3a2-4c6e-4d07-849b-4d616615a794`Past`Use this domain for words referring to the past or to a time in the past. -8.4.6.2.1`0656cd5e-641f-46f3-bcad-6f643727a344`Recently`Use this domain for words indicating that something happened recently--a short time before now. -8.4.6.3`7b816f6a-4b46-403d-a1a2-2914ee070568`Present`Use this domain for words referring to the present time. -8.4.6.3.1`3fbe3ea6-3ad3-430f-ab67-2d9c9f852c61`Now`Use this domain for words referring to now. -8.4.6.4`50c1a392-2928-407a-8306-3c70141e375e`Future`Use this domain for words referring to the future. -8.4.6.4.1`d27a5602-ece1-452e-9ed6-7261082dc8b8`Soon`Use this domain for words referring to something happening soon. -8.4.6.4.2`99e38da1-91ad-4dff-a68f-972607936e50`Not yet`Use this domain for words referring to something not happening yet. -8.4.6.4.3`73ea23c2-db45-49fa-a72b-0fc6eff4ce30`Eventually`Use this domain for words referring to something happening eventually. -8.4.6.4.4`04543543-4c3d-4d71-aa87-53191ef3b7b0`Immediately`Use this domain for words referring to something happening immediately--without any time passing before it happens. -8.4.6.5`615674ac-8158-4089-ae70-b55472fd279b`Age`Use this domain for words referring to the age of something. -8.4.6.5.1`0d38c343-9c51-47fe-a367-ffadfc92c507`Young`Use this domain for words describing something young--a word describing a living thing that has only existed for a short time. -8.4.6.5.2`cc6f100a-5220-4f53-801c-b1fdcc619608`Old, not young`Use this domain for words describing something old--a word describing a living thing that has existed for a long time. -8.4.6.5.3`efef45bd-26be-46f8-b85b-424be55bcdac`New`Use this domain for words describing something new--a word describing something that has only existed for a short time. -8.4.6.5.4`99861dcb-c6ca-4e50-a19a-efadbb10c2cf`Old, not new`Use this domain for words describing something old--a word describing something that has existed for a long time. -8.4.6.5.5`31e0fde8-b3ab-47ae-b791-54309e6ed0bd`Modern`Use this domain for words describing something modern--a word that describes something like a machine, system, or country that uses the most recent equipment, ideas, and methods. -8.4.6.5.6`b015f460-faeb-4aa5-b453-9e5e9ae061fe`Old fashioned`Use this domain for words describing something old fashioned--something that was done or used in the past, but not done or used now. -8.4.6.6`457231c8-4eb6-4460-aa45-3e9f2c4e8975`Once`Use this domain for words referring to something happening once. -8.4.6.6.1`2351f52a-8822-46ad-99c4-7ef526e94a6f`Again`Use this domain for words referring to something happening again or doing something again. -8.4.6.6.2`776de0c6-fdd7-46df-b33f-b1e4af6ee099`Sometimes`Use this domain for words referring to something happening sometimes. -8.4.6.6.3`12f12bf3-f232-4477-bf39-d91b7f55c2c3`Often`Use this domain for words referring to something happening often--happening or done many times. -8.4.6.6.4`03d65d0c-aafb-40c0-9cd2-3e5ced66ad03`All the time`Use this domain for words referring to something happening all the time. -8.4.6.6.5`1c8da3aa-3c74-4188-8949-5ab82fc1f99c`Every time`Use this domain for words referring to something happening every time something else happens. -8.4.6.6.6`4e2adaed-145e-45fc-8448-81c0bd47c414`Never`Use this domain for words that indicate that something that never happens, or that something has not once happened. -8.4.7`780fbf89-f2ba-404c-b288-f6ca637bbc90`Continue, persevere`Use this domain for words referring to continuing to do something. -8.4.7.1`0d7409ab-fc1f-4680-b040-d91d7004084f`Interrupt`Use this domain for words referring to interrupting someone--speaking when someone is speaking, or doing something to stop someone from doing what they are doing. -8.4.7.2`08244b88-bfba-487a-96bc-ca3771d1fa7c`Start again`Use this domain for words referring to starting to do something after stopping for some time. -8.4.7.3`76d4c718-a84d-4b7b-9767-1c350c3bc124`Interval`Use this domain for words referring to an interval between two events. -8.4.8`df149819-608f-46cd-ba0f-55f1d9d2e8ec`Speed`Use this domain for words referring to the speed at which a person acts or the speed at which something happens. -8.4.8.1`2fc69f71-e9f1-45f9-b88e-bdaf97457fc3`Quick`Use this domain for words referring to doing something at a quick speed or something happening quickly. -8.4.8.2`af399519-5d7c-4100-9c79-8162cb4641cb`Slow`Use this domain for words referring to doing something at a slow speed. -8.4.8.3`4c31ac6a-3197-4762-9937-2fdea90784b7`Sudden`Use this domain for words referring to a sudden event--something happens that I don't expect. -8.5`2dca9338-85cb-4f58-b40d-d2d759e8edd6`Location`Use this domain for words that refer to the place where something is located and for words indicating the location of something. -8.5.1`f76c3803-1c7a-4181-9a87-64ae7231a67d`Here, there`Use this domain for words that refer to a place in relation to the speaker or listener. -8.5.1.1`70f80041-af88-4521-9ebd-21d8f0b0d131`In front of`Use this domain for words referring to being in front of you. -8.5.1.1.1`775b53f1-bfcf-4270-a60d-b5affc9d6a99`Behind`Use this domain for words indicating that something is behind you. -8.5.1.2`b8fc54d8-afd2-4ef8-b811-efb8aa7064db`Beside`Use this domain for words that indicate that something is to the side of someone. -8.5.1.2.1`6bc8e911-36f2-4d45-b237-2bdb6c03cc11`Around`Use this domain for words indicating that something is around something else. -8.5.1.2.2`c7c2d82e-d86c-4bf3-81a1-82772e87d709`Between`Use this domain for words indicating that something is between two other things. -8.5.1.3`86287a4c-0d64-4f28-9a5c-17fb9df37ab6`On`Use this domain for words indicating that something is on another thing. -8.5.1.3.1`c13ca251-6103-4475-85af-933311923f2c`Above`Use this domain for words that express the idea that something is above another thing. The concept 'above' is inherently relational, expressing the relative positions of two things. -8.5.1.3.2`0a1ad4c9-8bf3-448b-a27f-611813b305de`Under, below`Use this domain for words that express the idea that something is under another thing. The concept 'under' is inherently relational, expressing the relative positions of two things. -8.5.1.4`2265a4bd-379d-4a9d-80d5-2318e6c8c683`Inside`Use this domain for words indicating that something is outside something else. -8.5.1.4.1`f4829d9d-a93f-4fc5-918c-6d4c501a6573`Out, outside`Use this domain for words indicating that something is outside of another thing. -8.5.1.5`8596f086-ee46-4245-8d45-2171a60e19e4`Touching, contact`Use this domain for words indicating that two things are touching or in contact with each other. -8.5.1.5.1`bcb1252c-7cb4-4fbc-b83f-e5f9c65b4afb`Next to`Use this domain for words indicating that something is next to something else. -8.5.1.6`d2001c9c-3c37-4910-8b8a-adcffc6fbf26`Across`Use this domain for words that refer to a place on another side of something from the reference point. 'Across' involves three things--the object, the reference point, and something else in between the two. -8.5.1.7`2c143278-3ea0-49c6-9e50-e0bf7c8cf4e2`Indefinite location`Use this domain for words indicating that something is at an indefinite location. -8.5.2`4f485a60-e3ba-42e6-9d59-185305c5d1f2`Direction`Use this domain for general words referring to a direction. -8.5.2.1`095c36bd-b74a-44f5-987b-85909e3f4c1d`Forward`Use this domain for words indicating a forward direction. -8.5.2.2`9ed66151-c144-4e5e-a3a2-f5d08b0c9bb8`Backward`Use this domain for words indicating a backward direction. -8.5.2.3`1a8322d7-cda9-41e5-a14b-f41274cb7157`Right, left`Use this domain for words referring to right and left. -8.5.2.4`e0ad6bb1-d422-408a-83f8-f1a7661ed225`Up`Use this domain for words referring to the direction up. -8.5.2.5`84084e67-b321-4b6a-a436-29ead0bee586`Down`Use this domain for words referring to the direction down. -8.5.2.6`3420b36a-a033-4af9-a8c4-53f8221ee56e`Away from`Use this domain for words indicating a direction away from something. -8.5.2.7`21a284ab-b9a3-42c8-8fb9-96aff1e1fe8f`Towards`Use this domain for words indicating a direction toward something. -8.5.2.8`6b1eeebd-2433-4f39-9e67-7ac4dd0fe20a`North, south, east, west`Use this domain for words referring to the directions of the compass. -8.5.3`80bcbc99-3c85-46d6-b15c-895367231747`Be at a place`Use this domain for words related to being at a place. -8.5.3.1`8affe94d-a396-4404-a0d7-c65046e617e6`Absent`Use this domain for words related to being absent--to not be in a particular place, or not be in the correct or expected place. -8.5.4`a4b03891-c2df-4d72-bbdc-13bc8d4eceba`Area`Use this domain for words referring to an area. -8.5.4.1`ec6f626c-e7a0-4ec7-a541-d683f20c9271`Vicinity`Use this domain for words related to a vicinity--an area around something else. -8.5.4.2`80de758c-537d-4c8c-8308-4babfb2c787a`Occupy an area`Use this domain for words related to occupying an area. -8.5.4.3`f45a456e-8e23-4364-8842-047cc73f529b`Space, room`Use this domain for words referring to the amount of empty space that is available to be used. -8.5.4.4`061749a8-e28a-461c-bf2d-052ab3e157d5`Interval, space`Use this domain for words related to an interval or space between things. -8.5.5`3785d9f3-0922-4d79-a0fa-b97c4a26fe17`Spatial relations`Use this domain for words that indicate a spatial relation between situations. -8.5.6`8fbed974-7d25-44c3-80cb-7d02e4069007`Contain`Use this domain for words that express the idea that something contains something. -8.6`91913920-8a6a-4ba0-9361-d6cc9e1f3639`Parts of things`Use this domain for words that refer to a part of something. These words are often based on the parts of a person's body. -8.6.1`bddc70ea-d46f-4e4b-83a1-a47bea858dd6`Front`Use this domain for words related to the front part of something. -8.6.1.1`ed976bbe-4fb2-4365-b136-d2fce077a73f`Back`Use this domain for words related to the back part of something. -8.6.2`5ee64d88-c462-4505-b14a-5d36e357a024`Top`Use this domain for words related to the top part of something. -8.6.2.1`6a4f5638-388e-4c8e-9bb7-8e742dac43db`Bottom`Use this domain for words related to the bottom part of something. -8.6.3`9e775794-3dda-4942-b6af-087ffd57f342`Side`Use this domain for words related to the side part of something. -8.6.4`4d2a247e-4925-4750-8c39-e2d78665d33c`Inner part`Use this domain for words related to the inside part of something. -8.6.4.1`e2806bed-b450-4469-900a-1afa7ded2224`Outer part`Use this domain for words related to the outside or surface part of something. -8.6.5`3005971d-de4d-401f-8400-b25de5e052ad`Middle`Use this domain for words related to the middle part or center of something. -8.6.6`fc170f70-520e-4f3e-b8b8-98e4b898fd24`Edge`Use this domain for words related to the edge of something--the part of something where two sides come together. -8.6.7`e1e0b800-85ad-4886-abe5-9f67c022a5ed`End, point`Use this domain for words related to the end of something. -9`349f0278-7998-422a-9c3b-6053989cbb20`Grammar`Use this domain for technical linguistic terms that refer to grammatical words and constructions. Most languages have few if any words in this domain. -9.1`3a2c0773-6b3e-4f8b-909d-c8f84d66d4f4`General words`Use the following section for words that don't belong in any other domain because they are so general in meaning that you can use them to talk about any topic. Use this domain for general and indefinite words that can be used in the place of any word. Some languages have a general word that can replace a noun or a verb. For instance some Philippine languages use the word 'kwan' in this way. Colloquial German can use the word 'dings' as a noun or verb. Often these words are used when you can't remember the particular word you are trying to think of. In English we use the word 'blank' when we don't want to say a word, for instance when we are testing someone and want them to say the word. -9.1.1`a72ca6f7-e389-408a-8276-fec4d60a3a56`Be`Many languages have general words that indicate some kind of state. These general words may be used with a wide variety of specific meanings. For instance in English the word 'be' may be used to identify something, describe something, and many other ideas. -9.1.1.1`0d63adce-41dd-4873-b0bf-331d0205e65d`Exist`Use this domain for words indicating that something exists. -9.1.1.2`093eeea2-4ff6-4ee8-ad05-8af1702b7246`Become, change state`Many languages have general words that indicate some kind of change of state. These general words may be used with a wide variety of specific meanings. For instance in English the word 'become' may be used to a change in identity, a change in characteristic, a change in nature, and many other ideas. -9.1.1.3`da988f73-fc9d-4a23-b70d-22299a7c6097`Have, of`Many languages have several general words that are used to indicate a variety of relationships between two things. There are three such words in English: "have," "of," and the possessive suffix "-'s." The basic meaning of these words in English is 'to own', but they can mean many other things too. For instance they can mean that I am related to someone (I have a brother), something has a part (birds have wings), and many other ideas. There is also a set of pronouns in English that are like nouns ending in -'s (my/mine, your/yours, his, her/hers, its, our/ours, their/theirs, whose). Use this domain for these general words. -9.1.1.4`94cad4ca-c2ec-4ff3-b9b1-11107549941d`Attribution`Attributes often belong to a class of attributes (shape = straight, curved) or to a scale (length = long, short). The class or scale can sometimes be included in the expression, but does not mark the proposition itself. (The towel damp. The box five kilos.) -9.1.2`e28f3f79-d4a5-402c-8a70-196856791078`Do`Use this domain for general verbs with a volitional subject (agent). -9.1.2.1`b158fe11-5af2-4467-bbc0-cc1aee766592`Happen`Use this domain for non-volitional pro-verbs. -9.1.2.2`12a028d1-d910-4011-ab9d-59be69daaf65`React, respond`Use this domain for words referring to reacting or responding to something. -9.1.2.3`d47b69e0-ab4a-4111-aec3-2c889a4e70b3`Create`Use this domain for words referring to creating something--causing something to be that did not exist before. -9.1.2.4`ecaff061-6a12-4ad6-b818-9b140a9a3e11`Design`Use this domain for words referring to designing something--to decide and plan how something new will look and work. -9.1.2.5`2d5d634e-75b5-4921-922e-573a809a49f8`Make`Use this domain for words referring to making something--joining things together to create something to be that did not exist before. -9.1.2.6`10b6c417-d020-4318-a44a-ae69ea3eec5a`Change something`Use this domain for words referring to someone changing something. -9.1.2.7`754ac437-2841-48c3-bbb0-7d6dff52605e`Event propositions`Use this domain for words that indicate event propositions. Event propositions are similar in that they are normally expressed by a subject and a verb, possibly including an object, indirect object, or complement clause. However there are multiple ways in which a language can express an event, such as a passive construction, noun phrase, or subordinate clause. In addition each event type is different in its primary cases, and in the ways those cases are marked. Each event type has subtypes, such as intransitive, transitive, and bitransitive verbs. A great deal of research is needed in order to identify all the variations. Ultimately every verb must be investigated to determine how it behaves in each syntactic construction and how its case relations are marked. No two verbs are entirely alike. -9.1.3`0037693a-ae42-4e5c-85f5-10a05482d4ee`Thing`Use this domain for general words referring to things. -9.1.3.1`c9741b97-ad50-465c-a4ca-b21d488f45fe`Physical, non-physical`Use this domain for words describing something that is physical--that you can touch and see, and for words describing something that is non-physical--that you cannot touch or see. -9.1.3.2`74cd7314-5ef6-4505-a35a-81468b5a3f3a`Situation`Use this domain for words referring to a situation--a particular time and place, and the things that are true about it. -9.1.4`316f27aa-ed6d-4bc3-9d14-840946a6f4e9`General adjectives`Use this domain for general adjectives that can replace or stand for a specific adjective. -9.1.5`d9b9db39-d87e-4d04-8298-1f1b969dbda1`General adverbs`Use this domain for general adverbs that can replace or stand for other adverbs. -9.2`af0909a5-928a-4421-baaa-f33b14302714`Part of speech`This domain is for organization purposes and should not be used for any words. Use the domains in this section for words that belong to a particular part of speech. It is best not to use these domains, since they are based on grammar and not meaning. But if you have a small group of words that belong to a part of speech and you want to list them all, you can use these domains. You can also classify words in this section if you don't know what they mean yet. -9.2.1`64f39297-426b-45a8-b5d2-097cf71d688c`Adjectives`Use this domain to list all adjectives. If there are many adjectives in your language, you should not try to list them all here. If you want to find all the adjectives, most dictionary programs can sort your dictionary by part of speech. However if your language only has a few adjectives, you can list them all in this domain. In the book, "Where Have All the Adjectives Gone?" R. M. W. Dixon [Dixon, R. M. W. 1982. Where have all the adjectives gone? Berlin: Mouton.] identifies seven universal semantic types that are often expressed by adjectives. They are: Age (new, young, old), Dimension (big, little, long, short, wide, narrow, thick, fat, thin), Value (good, bad, proper, perfect, excellent, fine, delicious, atrocious, poor), Color (black, white, red), Human propensity (jealous, happy, kind, clever, generous, cruel, rude, proud, wicked), Physical property (hard, soft, heavy, light, rough, smooth, hot, cold, sweet, sour), Speed (fast, slow). Words in the Human propensity class may be nouns. Words in the Physical property and Speed classes may be verbs. -9.2.2`24d3d7f9-0fda-4759-930b-6b721d3e9115`Adverbs`Use this domain to list all adverbs. If there are many adverbs in your language, it is probably not worth the trouble to list them here. The Shoebox program (and other dictionary programs) can sort your dictionary by part of speech. -9.2.3`0296465a-25de-4af6-a122-376956b4b452`Pronouns`Use this domain for the personal pronouns, including independent, subject, object, and possessive pronouns. It is best to collect all the pronouns in a chart. This way you are more certain of collecting them all and seeing how they are related to each other. A language may have more sets and more distinctions than English does, or it may have less. For instance some languages have a pronoun 'we' which includes the hearer, and another pronoun 'we' which excludes the hearer. Other languages have an indefinite pronoun that means something like the English word 'someone'. Many languages do not have the masculine (he), feminine (she), and neuter (it) distinctions that English has. It is necessary to determine the sets and functions of the pronouns for each language. -9.2.3.1`13df6ee2-4189-4faa-b54d-768588d03978`Reflexive pronouns`Use this domain for pronouns that refer back to the subject of the sentence. These pronouns should be added to the chart of personal pronouns. -9.2.3.2`d4521b0f-0703-48cc-94a0-f42ccc09959c`Indefinite pronouns`Use this domain for pronouns that do not refer to a definite person or thing, but can refer to anyone or anything. Some languages will not have all the sets of pronouns described below. Add each set you find in your language to the pronoun chart. -9.2.3.3`8db17eef-6c42-4ba0-9f07-a3b0e7c8f1e1`Relative pronouns`Use this domain for pronouns used in relative clauses. -9.2.3.4`76795fdd-55dc-4fb7-a9ad-d1423c31df50`Question words`Use this domain for pronouns used in questions. -9.2.3.5`ad4d28f0-5cbb-4b82-b736-9b41860a248c`Demonstrative pronouns`Use this domain for demonstrative pronouns. -9.2.3.6`a139558a-8df9-4fc9-bd3e-816a1408ba7f`Personally`Use this domain for words that indicate that someone does something himself, rather than through someone else. -9.2.4`811a2abc-4bf3-44e4-9ff4-e33ff4470ce6`Prepositions, postpositions`Use this domain to list all prepositions and postpositions. -9.2.5`f950b7cc-fb85-4dbb-b8ca-934d38cae7fc`Conjunctions`Use this domain to list all conjunctions. -9.2.5.1`a42aa891-e4fd-489e-b573-b9d20dfc5c2a`Phrase conjunctions`Use this domain to list all phrase level conjunctions--conjunctions that join two words within a phrase. -9.2.5.2`2c576c40-17ae-45a7-9ec8-6c16e02ab9c3`Clause conjunctions`Use this domain to list all clause level conjunctions--conjunctions that join two clauses. -9.2.5.3`ae04020a-3bb2-4672-ad75-71ce72d461ea`Sentence conjunctions`Use this domain to list all sentence level conjunctions--conjunctions that join two sentences. -9.2.6`a7b32d1b-1be7-43ec-94a1-fc7bdd826168`Particles`Use this domain to list all particles. -9.2.6.1`da41ea1f-dd09-421d-a1a5-174ff43f4eff`Classifiers`Use this domain to list all classifiers. -9.2.7`b34dc5c9-3367-4bfc-b077-cd014250dc5c`Interjections`Use this domain to list all interjections. -9.2.8`8206415e-a915-4842-a46a-fbea64f1a0e3`Idiophones`Use this domain to list all idiophones. If there are many idiophones in your language, it is probably not worth the trouble to list them here. The Shoebox program (and other dictionary programs) can sort your dictionary by part of speech. -9.2.9`35624f3a-2029-43b3-b70a-83e63ac9052f`Affixes`Use this domain to list all affixes that do not fit in any of the subdomains under it. This section should be filled out by a linguist. -9.2.9.1`0049664f-0931-487b-ab3c-ce11e134ce7a`Verb affixes`Use this domain to list all verb affixes. -9.2.9.2`a4f4943f-ad94-4736-bf5d-f8a3cb15919f`Noun affixes`Use this domain to list all noun affixes. -9.2.9.3`751f726b-b7cd-470e-a9fd-f2f1b460dd0d`Derivational affixes`Use this domain to list all derivational affixes. A derivational affix is joined to a root and changes it into a different word. Derivational affixes often change the root into a different part of speech. Adding a derivational affix usually changes the meaning of the root in a significant way. -9.3`5422d4ba-8af4-4767-912e-43b60ef28eab`Very`Use this domain for words that intensify an attribute. -9.3.1`aaf9d375-f0a0-4c7b-bbf8-3c7ffd4f5a52`Degree`Use this domain for words that indicate a degree on a scale. -9.3.1.1`7f91aa6d-f342-4fb9-9448-69d694cda9c5`To a large degree`Use this domain for words referring to a large degree. -9.3.1.2`1082c52b-490a-4eec-acf1-7016796dafd9`To a small degree`Use this domain for words referring to a small degree. -9.3.1.3`73b959ab-0229-4710-af99-dfc9b5370540`To a larger degree`Use this domain for words referring to a larger degree. -9.3.1.4`984dc2b7-6fdd-4257-abdc-5873abb7bb70`To a smaller degree`Use this domain for words referring to a smaller degree. -9.3.2`e1dd83dd-955a-4bc7-a761-fc91555da1f8`Completely`Use this domain for words referring to a complete degree--when something is done, happens, is thought, is felt, etc completely and in every way. -9.3.3`d74914e7-e329-49d4-8513-ec8d850241e4`Partly`Use this domain for words referring to a complete degree--when something is done, happens, is thought, is felt, etc completely and in every way. -9.3.4`a22d5c1c-daed-4e7a-8243-493f2d841314`Do intensely`Use this domain for words indicating intensity of an action. -9.3.5`c7c3aa7d-a4b5-45af-9a31-a640179e8fa4`Attribution of an attribute`Use this domain for words that modify an attribute. -9.4`61a28bdc-c05c-49d8-b47e-d54a9082156c`Semantic constituents related to verbs`Use this section for verbal auxiliaries, affixes, adverbs, and particles that modify verbs. -9.4.1`793993ac-20c1-49f0-9716-e4cdc7da4439`Tense and aspect`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate tense and aspect. -9.4.1.1`df2ee830-0668-43d7-8a32-e2fd3e7b31d8`Tense`Use this domain for verbal auxiliaries, affixes, adverbs, and particles that indicate tense (also known as temporal deixis)--the time of a situation (event, activity, or state) in relation to a reference point, which is usually the time of utterance. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.4.1.2`ccbbd16f-58c5-45c1-bfff-1fba64d9740e`Aspect--dynamic verbs`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate aspects of dynamic verbs. Aspects describe the temporal contours of a situation. They may be combined with any of the tenses, either in the same morpheme or in combinations of morphemes. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.4.1.3`321d0a74-705f-40bf-8d24-809f65bee895`Aspect--stative verbs`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate aspects of stative verbs. Aspects describe the temporal contours of a situation. They may be combined with any of the tenses, either in the same morpheme or in combinations of morphemes. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.4.1.4`54f59b23-a2e8-4bfc-9da2-7dd7c37d2a47`Relational tenses`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate relational tenses. Relational tenses describe situations where the reference time is not the same as the moment of speech. They may be combined with any of the tenses, either in the same morpheme or in combinations of morphemes. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.4.2`7bf05f4e-909f-40ca-b742-9be21eba9fbb`Agent-oriented modalities`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate agent-oriented modalities. Agent-oriented modalities describe internal or external conditions on a willful agent with respect to the completion of the predicate situation. They may be combined with any of the tenses, either in the same morpheme or in combinations of morphemes. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.4.2.1`59d936f3-dffb-4585-80e0-eaf6cd6a8026`Can`Use this domain for words indicating that someone can do something. -9.4.2.2`ab8d8dc9-eeb7-41ff-93a9-cbbd50b89a73`Can't`Use this domain for words related to being incapable of doing something. -9.4.2.3`47feee3e-80e1-469a-911c-0c550b37a2f8`Necessary`Use this domain for words that a speaker uses to indicate that he thinks something must happen. -9.4.3`c3ddfc77-e3a6-450e-a853-111f5595df87`Moods`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate moods. -9.4.3.1`965c6a0b-3034-4e2f-a00b-ed2eb3119a5d`Imperative`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate imperatives. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. Use this domain for words and affixes that a speaker uses to indicate that he is making a command. English has no command word. Some languages change the form of the verb by adding an affix. Some languages have special verbs that are only or normally used as commands. Those verbs could be classified here. -9.4.3.2`edeb9458-3bdb-4d14-aaa1-6eb457307b9c`Hortative`Use this domain for ways of saying that someone should do something. If I say someone should do something, I think it is good that he does it. -9.4.3.3`6fa33de6-00f4-44d5-b6b3-b3c4a4f671e5`Interrogative`Use this domain for words that a speaker uses to indicate that he is asking a question. English has no question word, but other languages such as Japanese do. -9.4.4`3ea4c495-b837-4310-8741-38d89fa63e0b`Epistemic moods`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate epistemic moods. Epistemic moods have the whole proposition in their scope and indicate the degree of commitment of the speaker to the truth or future truth of the proposition. They may be combined with any of the tenses, either in the same morpheme or in combinations of morphemes. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.4.4.1`ad7cc381-1dc6-4fc2-94a4-acd5bf7a11da`Certainly, definitely`Use this domain for words that a speaker uses to indicate that he thinks something is certainly true or is certain to happen. -9.4.4.2`af6fe2d6-576d-473f-8a32-583779d95d1d`Sure`Use this domain for words related to being sure that something is true. -9.4.4.3`84eb31d3-b932-4b3b-b945-85884ea856c7`Probably`Use this domain for words that a speaker uses to indicate that he thinks something is probable or likely to occur. -9.4.4.4`85c5b8f7-8086-493d-b70d-a361bfa56f09`Possible`Use this domain for words that a speaker uses to indicate that he thinks something is possible. Maybe implies that the speaker doesn't know something. -9.4.4.5`e0c32642-7c51-4e23-a776-f63f2f2f936d`Uncertain`Use this domain for words that indicate that no one is certain that something is true, or when it is impossible to be certain that something is true. -9.4.4.6`1a635032-6e13-4a56-aa03-6c6a015c502e`Unsure`Use this domain for words related to not feeling sure about something or someone. -9.4.4.6.1`13e67cc9-055b-4f9b-9217-a16b18db0329`Think so`Use this domain for words indicating that you think something is true, but you are not completely sure about it. -9.4.4.6.2`e0b00a13-8648-4635-afe5-0be3c0b6a05c`Maybe`Use this domain for words that a speaker uses to indicate that he thinks it is possible that something may happen or be true, but he isn't certain. -9.4.4.6.3`858af232-b570-4153-b4c0-f60930df9ced`Seem`Use this domain for words indicating that something seems to be a certain way--you see (or hear) something and think something about it, but you are not sure that what you think is true. -9.4.4.7`7c022751-a9f9-412d-8b27-8cd03b797e2d`Just, almost not`Use this domain for words indicating that although something is true, it almost is not true. -9.4.4.8`ca495e57-a8e0-4294-bfe3-7b7995dc96c7`Don't think so, doubt it`Use this domain for words indicating that you think something is unlikely to be true or to happen. -9.4.4.9`f883266a-146a-41c7-b1db-85120840c3a8`Impossible`Use this domain for words that a speaker uses to indicate that he thinks something is impossible. -9.4.5`04752883-aa3e-42a2-bd42-454e9cd99b11`Evidentials`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate evidentials. An evidential is when the speaker indicates the source of the information on which an assertion about a situation is based. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.4.5.1`cf5f83be-2c19-4cf8-8cc5-53bd32b50530`Evaluator`Use this domain for words indicating who is evaluating the proposition. -9.4.6`a03663ca-0c66-4570-be2d-b40105cc4400`Yes`Use this domain for words that affirm or agree with the truth of something, or that answer a yes/no question in the affirmative. -9.4.6.1`350667ee-592b-47af-adca-14e820ec58cf`No, not`Use this domain for words that negate or deny the truth of something, or that answer a yes/no question in the negative. -9.4.6.2`b4c1e05f-f741-45cc-8d13-a1f60f474325`Markers expecting an affirmative answer`Use this domain for words indicating that an affirmative answer is expected to a question. -9.4.6.3`e64e647e-a5fb-463c-8eef-44879e2e70b2`Markers expecting a negative answer`Use this domain for words indicating that a negative answer is expected to a question. -9.4.7`1de2cef5-3a2d-45c1-8cb6-06b2ac087907`Subordinating particles`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate a subordinate clause. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.4.8`fa8e72a0-1bfe-4b49-a287-293b44213960`Adverbial clauses`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate adverbial clauses. The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.5`aab82dc7-de9f-44b3-845e-0c926f47cfb6`Case`Each verb has a set of semantic case relations. For instance in the sentence 'I gave flowers to my wife' the verb give has three case relations. 'I' is the Agent, 'flowers' is the Patient, and 'my wife is the 'Recipient'. In this sentence the only word that marks a case relation is 'to'. English often marks case relations by their position in the sentence. Some languages mark case relations by affixes, prepositions, postpositions, and sometimes special verbs. To completely describe a language, each verb must be investigated, all its case relations must be identified, and all the ways in which these relations are marked must be described. Since verbs are often unique and unpredictable in their case relations, this information should go into the dictionary. This section should be used to classify the words and affixes that are used to mark case relations. This domain should be used for technical terms that refer to case. -9.5.1`bb8ddf5f-707d-46c0-aff4-45683d26fd68`Primary cases`Use this section for primary cases. -9.5.1.1`93df663c-9a5e-48aa-984f-fdf413079bc2`Beneficiary of an event`Use this domain for words that mark the beneficiary of an event. The sentence "John built a house for his father" is ambiguous. If the house was for his father to live in, then "for" would mark the 'Beneficiary of a patient', meaning that the house was for the father. If, on the other hand, the father was intending to build the house to sell, but couldn't due to an injury, then "for" would mark the 'Beneficiary of an event', meaning the father benefited from the building of the house. -9.5.1.2`4415aff1-4d74-463e-a25d-9832c7477329`Instrument`Use this domain for words that mark an instrument used to do something. -9.5.1.3`4f587b2b-60a6-4ea0-9fe5-89e5a502d380`Means`Use this domain for words indicating the means by which something is done. -9.5.1.4`d0b14231-1471-41b3-aeb5-69199acaaefb`Way, manner`Use this domain for words indicating the way or manner in which something is done. -9.5.1.5`aabc32ee-46e4-469f-93ad-673373cb2e8d`Attendant circumstances`Use this domain for words indicating the attendant circumstances in which something happened. -9.5.1.6`71757ff0-d698-426d-a791-50c4bde6f735`Spatial location of an event`Use this domain for words indicating the spatial location of an event. -9.5.1.6.1`400d318e-a9ef-40b4-92be-0d7e96e51d8a`Source (of movement)`Use this domain for words that mark the Source (original location) of something. -9.5.1.6.2`a9470e53-ee43-4c87-9cce-09cc4fa6b1c1`Path (of movement)`Use this domain for words indicating the Path of movement. -9.5.1.6.3`9f91cd53-8b9e-4d76-82e4-5ede39112322`Goal (of movement)`Use this domain for words indicating the Goal of movement. -9.5.1.6.4`66e2806d-3e16-4fb2-a158-7f3b4dd5d9af`Origin (of a person)`Use this domain for words that mark the place where someone was born or the place where they have been living. -9.5.2`0eefa07a-e0a3-49e3-aeb4-62f1eafd8e23`Semantically similar events`Use this section for words that join semantically similar events into one sentence. Each sentence is actually reporting two or more situations, which may differ in one or two respects. The words to be included in these domains indicate that two situations are being reported, or mark the differences between the two situations. -9.5.2.1`42b21a6e-e2f3-4468-9e92-49ee4de6909a`Together`Use this domain for words indicating when two or more people each do the same thing and do it together, or when they do it separately. -9.5.2.2`3a545732-145a-4034-8f72-e08d752cb4d4`With, be with`Use this domain for words indicating a person who accompanied the subject of a proposition. -9.5.2.3`6903b844-79be-4e9d-a3c8-1ca2a385bf4f`With, do with someone`Use this domain for words indicating a person who does something with another person who is the subject of the sentence. -9.5.2.4`d39b2432-87d5-4f3e-8101-de06001b42d6`Each other`Use this domain for words indicating that two or more people do something to each other. -9.5.2.5`52f9a8f0-d97d-4aa1-8c2c-d907d7cb83fc`In groups`Use this domain for words indicating that the subjects of a clause do something in groups. -9.5.3`116bef13-e80f-4a15-bb0a-bb7b3794ffac`Patient-related cases`Use this section for cases that bear a relationship to the 'Patient' of a proposition. -9.5.3.1`ca0f9b9b-31fc-4ae6-9563-abedc4a5af98`Beneficiary (of a patient)`Use this domain for words that mark the beneficiary of the Patient of an activity. The Patient is often expressed as the object of a sentence. In the sentence "John built a house for his parents," the house is the Patient. It is the house that benefits the parents, not the building of the house. -9.5.3.2`99c51a2c-ad49-48a6-bb0b-f059da745ec4`Recipient (of a patient)`Use this domain for words that mark the recipient of the Patient of an activity. The Patient is usually expressed as the object of a sentence. -9.5.3.3`55b93f1c-6ce0-4d13-ae1e-f06360e4689c`With (a patient)`Use this domain for words that mark a second Patient that accompanies the primary Patient of an activity. In this type of sentence there are actually two Patients, but one of them has more prominence than the other. The primary patient is usually expressed as the object of the sentence. The second Patient may be marked by an oblique case or preposition/postposition. For instance it may be conceived as accompanying the first Patient. -9.6`7f7fc197-5064-43c0-af51-2919fb7355c9`Connected with, related`Use the domains in this section for words that indicate a logical relation between two or more words or sentences. Use this domain for words that indicate an unspecified logical relation between people, things, or situations. -9.6.1`265f5645-94cb-485c-8bf9-0a3ab2354f63`Coordinate relations`Use this section for words indicating coordinate relations. Do not put any words in this domain. It is only for organizational purposes. -9.6.1.1`c029eed8-2ec0-4f6f-aa22-3a066bb23ea6`And, also`Use this domain for words that indicate that you are adding another thought to a previous thought. Words in this domain may indicate a variety of relationships between words, phrases, clauses, or sentences. For instance the words may join two clauses that are the same except that the subjects are different, or the objects are different, or the verbs are different. -9.6.1.2`8b5f9519-7301-4400-b93d-ebde4ea3def8`Or, either`Use this domain for words indicating an alternative relation between two things or propositions. -9.6.1.3`13edbeff-8913-49ef-8f02-777f86fb512d`Association`Use this domain for words indicating an association between two things. -9.6.1.4`ecf1cce7-ed58-44bf-870a-e8579b309c54`Combinative relation`Use this domain for words indicating a combinative relation between two things. -9.6.1.5`30fff450-1aa5-4993-9c14-c8019a5f072e`But`Use this domain for words indicating a contrast between two thoughts that are different in some way. -9.6.1.5.1`49f45f97-95f8-4a53-8952-f90147af2ba9`Except`Use this domain for words indicating that something is an exception to a group, rule or pattern--something is true of all the things (or people) in a group, but it is not true of one thing. -9.6.1.5.2`f94e9041-49b0-4d25-aa54-9446c5ab45f4`Instead`Use this domain for words indicating that something is true of one thing (or person) instead of another thing. -9.6.1.6`d8dfa6fc-84ea-4178-b4f5-95e0c113140a`Dissociation`Use this domain for words indicating a dissociation relation between two things or propositions. -9.6.1.7`ea7c06d0-5e33-4702-b6a0-51582b216fe8`Distribution`Use this domain for words indicating that an event is distributed throughout a group, area, or time span. -9.6.1.8`251b17bd-5796-43ce-ba10-54140a99a1e0`Equivalence`Use this domain for words indicating equivalence between two things or propositions. -9.6.2`b2fd2d29-1389-4114-91a8-15b8d9742794`Dependency relations`Use this domain for words indicating that something is dependent on another thing. -9.6.2.1`66dedb31-dd2a-4e94-825e-331590ac59a9`Derivation`Use this domain for words indicating that something derives from another thing. -9.6.2.2`05e20a72-9496-4bba-8097-5605692e83a1`Limitation of topic`Use this domain for words indicating the topic that is being talked about. -9.6.2.2.1`1b4f987d-3eaa-46dd-95ee-e0cb1f30cfbb`In general`Use this domain for words indicating that something is generally true, but not true in every case. -9.6.2.3`3759bdda-2b52-43dc-8995-8379e3129dce`Relations involving correspondences`Use this domain for words indicating relations involving correspondences--a situation in which one thing is the same or similar in some respect to something else. -9.6.2.4`779e4547-dee6-4780-a180-30a740f9574c`Basis`Use this domain for words indicating that something is the basis for another thing. -9.6.2.5`23bc906d-c15a-4368-b0ca-7443d5e37b83`Cause`Use this domain for words that indicate that someone or something is the cause for an event or state, that one event is the cause for another event or state, or that an event or state is reasonable (having sufficient cause). For instance in the sentence, "John caused David to fall," "John caused" is an enabling proposition that brings about the primary proposition "David fell." -9.6.2.5.1`e173ea34-c216-4702-aa24-ca9ab40d48dd`Reason`Use this domain for words that reason why someone does something. -9.6.2.5.2`be3559d9-d69f-4e06-8184-071c35aa2e10`Without cause`Use this domain for words that indicate that an event or state has no cause or reason, or is unreasonable (has insufficient cause). -9.6.2.6`48d3de9f-3619-4785-b50b-6921ba7eecd6`Result`Use this domain for words indicating that something is the result of another thing. -9.6.2.6.1`139409c3-7860-4586-897f-85ba3226046c`Without result`Use this domain for words indicating that something had no result. -9.6.2.7`18bf6c79-6399-4977-be3d-93135302d8c4`Purpose`Use this domain for words indicating that something was done for the purpose of another thing happening. -9.6.2.7.1`4fdf3cf1-0808-4f11-acdd-9db71550baab`Without purpose`Use this domain for words indicating that something had no purpose. -9.6.2.8`f858278a-2727-4403-9cf0-565cdececb1e`Condition`Use this section for verbal auxiliaries, affixes, adverbs, and particles that indicate a clause in a conditional sentence (If this is true, then that is true). The following definitions are taken from Bybee, Joan, Revere Perkins, and William Pagliuca. 1994. The evolution of grammar. Chicago and London: University of Chicago Press. -9.6.2.9`2f28f1ab-476e-4317-8787-124d95d6b9d2`Concession`Use this domain for words indicating that the speaker is conceding a point in a debate. -9.6.3`f02ae505-d6b7-4b30-9d97-8505d0d1a0c7`Discourse markers`Use this domain for conjunctions and particles that function on the discourse level, and whose meaning and function is uncertain. -9.6.3.1`638679c7-1c7c-41da-ab60-0ac7e98fcd72`Markers of transition`Use this domain for conjunctions that simply move the discourse forward without any specific relationship indicated between what comes before and what comes after. -9.6.3.2`7c1c3730-3b35-4150-b54e-bf6d344546b3`Markers of emphasis`Use this domain for words that indicate that the phrase or sentence is particularly important. -9.6.3.3`c103d339-24f2-45c6-8539-d3c445e15c49`Prompters of attention`Use this domain for words that are used to get someone's attention or direct the listener's attention to something. These may use a verb meaning 'look' or 'listen'. Some may be a word specifically referring to attention. Others may be a greeting. Others may be words that refer to non-verbal communication such as clearing your throat. -9.6.3.4`577a9f51-263a-4c80-a439-84ce45b9c7cc`Markers of direct address`Use this domain for words that the speaker uses to refer to the person he is addressing. These words are usually used when you start talking to someone, but can be used during a speech or conversation to refer to the person you are talking to. -9.6.3.5`fbf40f2e-e743-479d-80b2-63325407d5d1`Markers of identificational and explanatory clauses`Use this domain for words that begin a clause that identifies a specific case or example of what has just been said, or that explains what has just been said. Specific case: I have just mentioned a general class of things or a general idea and want to give a specific example of what I am talking about. Explanation: I have just said something and I think people might misunderstand, so I want to explain what I mean. Digression: I am talking about a particular topic, but want to say something that does not fit into my topic, so I say something that is about a different topic. -9.6.3.6`15e0b54b-bb7c-4900-b048-20b718d05f79`Markers of focus`Use this domain for words indicating that one of several things is in focus. -9.6.3.7`41837400-bdc5-4cbc-a1dc-d793f713f883`Hesitation fillers`Use this domain for words that a speaker uses when he hesitates or pauses while he is speaking in order to think about what he is saying. -9.6.3.8`2e5a80f9-35ae-4850-9627-be530832a781`Honorifics`Use this domain for words that the speaker uses to show respect or a lack of respect to the person he is addressing. Some languages have elaborate systems of honorifics. Other languages have none. Languages with a stratified social structure often use honorifics. Egalitarian societies generally lack them, but some egalitarian societies may use them. For instance in Nahuatl there are four levels of honorifics. Level 1 is how one addresses intimates, small children, and pets. Level 2 is for strangers and persons treated formally. Level 3 is for respected persons, the dead, and God. Level 4 is for obsequious respect, as for the archbishop in an interview with a priest, and for ritual kin. (Jane H. Hill and Kenneth C. Hill. 1978. Honorific usage in modern Nahuatl: the expression of social distance and respect in the Nahuatl of the Malinche Volcano area, Language 54:123-155.) In Japanese, which has a stratified social structure, a person uses one set of words and affixes when speaking to someone below you in the social hierarchy, such as your wife, children, and pets. A different set of words is used when speaking to peers. Another set is used when speaking to a superior. A fourth set is used when speaking to the emperor. English used to have two pronouns for second person singular. 'Thou' was used for equals and inferiors, and 'you' was used for superiors. Your language may have special honorific words used as (1) pronouns, (2) affixes, (3) particles, (4) terms of direct address, (5) greetings (6) requests, (7) apologies. -9.7`5b7666bd-c6c1-45e7-aa2e-1799fcb16d97`Name`Use this domain for general words referring to proper nouns--the name given to a particular person or thing to distinguish it from other things like it. Proper nouns are often not included in a dictionary, or are included in an appendix at the front or back of a dictionary. This is because there are so many of them, they are sometimes difficult to define, and it saves space in the dictionary. For instance place names can be included in a map. So it might be good to type the proper nouns into a special file. -9.7.1`7b513a02-c3ae-4243-9410-16854d911258`Name of a person`Use this domain for words related to the name of a person. Each culture has a system of personal names to identify individuals and kin groups. The subcategories under this heading should reflect the cultural system. If your language has a special set of names that do not fit any of they domains given here, then set up a special domain. -9.7.1.1`6b921117-47e9-4717-b3b3-4e170d26b6d9`Personal names`Use this domain for those names that are given to people, that people use to call to each other and to talk about each other. -9.7.1.2`c2ec9cee-7fe3-44f2-9008-c8b42f6f78dd`Family names`Use this domain for the proper names of the families that exist within the language community. If your culture does not use family names, just leave this domain empty. -9.7.1.3`774cdff1-8cba-4f94-a519-c66abd3b5f49`Clan names`Use this domain for the proper names of the clans that exist within the language community. The distinction between family, clan, tribe, and nation is based on politics and emotion. Our purpose here is not to make political statements, but merely to list the names. There may be no distinction between family and clan, in which case ignore this domain and use the domain 'Family names'. -9.7.1.4`5771f3a1-fda3-4111-9abc-7a0d76c60a79`Tribal names`Use this domain for the proper names of the tribes that exist around the language community, including the name of your own tribe. These tribal names may or may not correspond with the names of countries. -9.7.1.5`dd3e872a-fb50-4204-9646-7a24c644013b`Names of languages`Use this domain for the proper names of the languages that are spoken in the area around the language community, including the name of your own language. These language names may or may not correspond with the names of countries. Do not try to include every language name in the world, only the neighboring and important ones. For instance you might want to include the languages that border your own and the national language. Give the form that you use. For instance the German people call their language 'Deutsch', but in English we call it 'German'. -9.7.1.6`94f573ff-29f0-42ae-b1d9-f882823b2935`Nickname`Use this domain for common nicknames--an additional name given to a person later in life, often descriptive. Also include general names used to call or refer to someone when you don't know their name -9.7.1.7`ebb5f3e5-bfe5-4a40-986a-938c1bdb9c76`Terms of endearment`Use this domain for terms of endearment--a name used by lovers or spouses to express love or intimacy. Some languages may have special names used by close friends. -9.7.2`69541573-f845-4e77-91f6-1e3551fc6c82`Name of a place`Use this domain for words referring to the name of a place. -9.7.2.1`ee0585b1-627a-4a71-888d-b5d82619431e`Names of countries`Use this domain for the proper names of the countries that exist around the language community, especially those countries where your language is spoken. Include the name of your own country. Do not list every country in the world, unless your language has developed special names or pronunciations for those countries. Include any country that you refer to in your language, especially those names whose pronunciation you have adapted to fit your language. Give the form of the name that you use, rather than the official spelling. For instance the Japanese refer to their country as 'Nihon', but in English will call it 'Japan'. So 'Japan' is an English word and should go into an English dictionary. But 'Nihon' is not an English word and should not go in the dictionary. -9.7.2.2`85cb1e3c-62ba-4a77-a838-0237707fb0cb`Names of regions`Use this domain for the proper names of the regions within your country or language area. Some of these may be political regions. Others may be informal terms. Give the local pronunciation, rather than some foreign spelling. You may want to limit this domain to just those areas within your language area. However if you have special names for areas outside of your language area, for example 'the Mideast', you should include them. -9.7.2.3`b8e66bb4-140c-45b4-89ce-d9a77b9e5d21`Names of cities`Use this domain for the proper names of cities, towns, and villages in the language area. Include the names of important cities outside of the language area if your language has a special name for the city or a different pronunciation for it. It might be good to use a map for this. In fact it is good to include a map of the language area in a published dictionary. If your language area is very large, there may be hundreds or thousands of cities, towns, and villages. In this case you will have to decide which should be included in the dictionary. Or you could decided to list them in a special section. -9.7.2.4`35a9da32-53ee-44fa-9c65-5a15f88ad283`Names of streets`Use this domain for the proper names of highways, roads, streets, and trails in the language area. If there are many such names, only include the important names (e.g. King's Highway) or commonly used names (e.g. Main Street). -9.7.2.5`69d366d2-9735-4a1b-b938-7b212932b568`Names of heavenly bodies`Use this domain for the proper names of the heavenly bodies. -9.7.2.6`09ac3709-0b0e-4046-b6b2-7869d574aa0d`Names of continents`Use this domain for the proper names of the continents. Only include the names of continents if your language has borrowed or adapted the name and you talk about them in your language. -9.7.2.7`d90e71bf-2898-4501-9d09-c518999f83e2`Names of mountains`Use this domain for the proper names of the mountains in the language area. Only include the names of mountains outside the language area if your language has borrowed or adapted the name and you talk about them in your language. -9.7.2.8`a105e31c-1268-4fc2-8655-838d34860ece`Names of oceans and lakes`Use this domain for the proper names of the oceans and lakes in the language area. Only include the names of oceans and lakes outside the language area if your language has borrowed or adapted the name and you talk about them in your language. -9.7.2.9`e8ec3885-c692-4b90-a5b3-4c86da642666`Names of rivers`Use this domain for the proper names of the rivers in the language area. Only include the names of rivers outside the language area if your language has borrowed or adapted the name and you talk about them in your language. -9.7.3`7d111356-e04e-4891-960c-2f35147eba82`Name of a thing`Use this domain for words related to the name of a thing. Many cultures give names to particular buildings, ships, airplanes, organizations, companies, schools, and other things. If your language has hundreds of names for some kind of thing, it is best to not try to list them all. But if there are a few important names for one kind of thing, set up a domain for them. -9.7.3.1`5df53b87-7f59-4f5c-991e-5ae007b68fa9`Names of animals`Use this domain for words referring to the name of an animal. Some cultures give names to domesticated animals or to animals in stories. Think through each kind of domesticated animal. -9.7.3.2`4223d3ba-5560-4c30-b013-4e31fee36329`Names of buildings`Use this domain for words referring to the name of a building. diff --git a/Backend/Helper/FileStorage.cs b/Backend/Helper/FileStorage.cs index 6bf071cc96..9c4de12255 100644 --- a/Backend/Helper/FileStorage.cs +++ b/Backend/Helper/FileStorage.cs @@ -199,5 +199,11 @@ public static string FileTypeExtension(FileType type) _ => throw new NotImplementedException() }; } + + /// Generate the path of the WritingSystems subdirectory of a LIFT directory + public static string GenerateWritingsSystemsSubdirPath(string dir) + { + return Path.Combine(dir, "WritingSystems"); + } } } diff --git a/Backend/Helper/Language.cs b/Backend/Helper/Language.cs index fcd877c15d..21e221a18b 100644 --- a/Backend/Helper/Language.cs +++ b/Backend/Helper/Language.cs @@ -45,7 +45,7 @@ public static List GetWritingSystems(string dirPath) { if (!Directory.GetFiles(dirPath, "*.ldml").Any()) { - dirPath = Path.Combine(dirPath, "WritingSystems"); + dirPath = FileStorage.GenerateWritingsSystemsSubdirPath(dirPath); } var wsr = LdmlInFolderWritingSystemRepository.Initialize(dirPath); diff --git a/Backend/Interfaces/ILiftService.cs b/Backend/Interfaces/ILiftService.cs index 434b3e87ea..4197e3a66e 100644 --- a/Backend/Interfaces/ILiftService.cs +++ b/Backend/Interfaces/ILiftService.cs @@ -10,6 +10,7 @@ public interface ILiftService ILiftMerger GetLiftImporterExporter(string projectId, IWordRepository wordRepo); Task LdmlImport(string dirPath, IProjectRepository projRepo, Project project); Task LiftExport(string projectId, IWordRepository wordRepo, IProjectRepository projRepo); + Task> CreateLiftRanges(List projWords, List projDoms, string rangesDest); // Methods to store, retrieve, and delete an export string in a common dictionary. void StoreExport(string userId, string filePath); diff --git a/Backend/Repositories/SemanticDomainRepository.cs b/Backend/Repositories/SemanticDomainRepository.cs index 1f8bdef46a..4d4e63babf 100644 --- a/Backend/Repositories/SemanticDomainRepository.cs +++ b/Backend/Repositories/SemanticDomainRepository.cs @@ -82,8 +82,7 @@ public SemanticDomainRepository(ISemanticDomainContext context) var domain = await _context.SemanticDomains.FindAsync(filter: filter); try { - return (await domain.ToListAsync()); - + return await domain.ToListAsync(); } catch (InvalidOperationException) { diff --git a/Backend/Services/LiftService.cs b/Backend/Services/LiftService.cs index c8a29d71a9..b9243c3f52 100644 --- a/Backend/Services/LiftService.cs +++ b/Backend/Services/LiftService.cs @@ -4,10 +4,8 @@ using System.IO; using System.IO.Compression; using System.Linq; -using System.Reflection; using System.Runtime.Serialization; using System.Security; -using System.Text; using System.Threading.Tasks; using System.Xml; using BackendFramework.Helper; @@ -93,14 +91,18 @@ protected MissingProjectException(SerializationInfo info, StreamingContext conte public class LiftService : ILiftService { + private readonly ISemanticDomainRepository _semDomRepo; + /// A dictionary shared by all Projects for storing and retrieving paths to exported projects. private readonly Dictionary _liftExports; /// A dictionary shared by all Projects for storing and retrieving paths to in-process imports. private readonly Dictionary _liftImports; private const string InProgress = "IN_PROGRESS"; - public LiftService() + public LiftService(ISemanticDomainRepository semDomRepo) { + _semDomRepo = semDomRepo; + if (!Sldr.IsInitialized) { Sldr.Initialize(true); @@ -154,7 +156,7 @@ public void StoreExport(string userId, string filePath) public bool DeleteExport(string userId) { var removeSuccessful = _liftExports.Remove(userId, out var filePath); - if (removeSuccessful && filePath is not null && filePath != InProgress) + if (removeSuccessful && filePath != InProgress && File.Exists(filePath)) { File.Delete(filePath); } @@ -198,7 +200,7 @@ public async Task LdmlImport(string dirPath, IProjectRepository projRepo, { if (!Directory.GetFiles(dirPath, "*.ldml").Any()) { - dirPath = Path.Combine(dirPath, "WritingSystems"); + dirPath = FileStorage.GenerateWritingsSystemsSubdirPath(dirPath); } var wsr = LdmlInFolderWritingSystemRepository.Initialize(dirPath); @@ -316,80 +318,13 @@ public async Task LiftExport( liftWriter.End(); // Export semantic domains to lift-ranges - var extractedPathToImport = FileStorage.GenerateImportExtractedLocationDirPath(projectId, false); - string? firstImportDir = null; - if (Directory.Exists(extractedPathToImport)) + if (proj.SemanticDomains.Count != 0 || CopyLiftRanges(proj.Id, rangesDest) is null) { - // TODO: Should an error be raised if this returns null? - firstImportDir = Directory.GetDirectories(extractedPathToImport).Select( - Path.GetFileName).ToList().Single(); - } - - var importLiftDir = firstImportDir ?? ""; - var rangesSrc = Path.Combine(extractedPathToImport, importLiftDir, $"{importLiftDir}.lift-ranges"); - - // If there are no new semantic domains, and the old lift-ranges file is still around, just copy it - if (proj.SemanticDomains.Count == 0 && File.Exists(rangesSrc)) - { - File.Copy(rangesSrc, rangesDest, true); - } - else // Make a new lift-ranges file - { - await using var liftRangesWriter = XmlWriter.Create(rangesDest, new XmlWriterSettings - { - Indent = true, - NewLineOnAttributes = true, - Async = true - }); - await liftRangesWriter.WriteStartDocumentAsync(); - liftRangesWriter.WriteStartElement("lift-ranges"); - liftRangesWriter.WriteStartElement("range"); - liftRangesWriter.WriteAttributeString("id", "semantic-domain-ddp4"); - - // Pull from resources file with all English semantic domains - var assembly = typeof(LiftService).GetTypeInfo().Assembly; - const string semDomListFile = "BackendFramework.Data.sdList.txt"; - var resource = assembly.GetManifestResourceStream(semDomListFile); - if (resource is null) - { - throw new ExportException($"Unable to load semantic domain list: {semDomListFile}"); - } - - string sdList; - using (var reader = new StreamReader(resource, Encoding.UTF8)) - { - sdList = await reader.ReadToEndAsync(); - } - - var sdLines = sdList.Split(Environment.NewLine); - foreach (var line in sdLines) - { - if (line != "") - { - var items = line.Split("`"); - WriteRangeElement(liftRangesWriter, items[0], items[1], items[2]); - } - } - - // Pull from new semantic domains in project - foreach (var sd in proj.SemanticDomains) - { - var guid = string.IsNullOrEmpty(sd.Guid) || sd.Guid == Guid.Empty.ToString() - ? Guid.NewGuid().ToString() - : sd.Guid; - WriteRangeElement(liftRangesWriter, sd.Id, guid, sd.Name); - } - - await liftRangesWriter.WriteEndElementAsync(); //end semantic-domain-ddp4 range - await liftRangesWriter.WriteEndElementAsync(); //end lift-ranges - await liftRangesWriter.WriteEndDocumentAsync(); - - await liftRangesWriter.FlushAsync(); - liftRangesWriter.Close(); + await CreateLiftRanges(allWords, proj.SemanticDomains, rangesDest); } // Export character set to ldml. - var ldmlDir = Path.Combine(zipDir, "WritingSystems"); + var ldmlDir = FileStorage.GenerateWritingsSystemsSubdirPath(zipDir); Directory.CreateDirectory(ldmlDir); if (!string.IsNullOrWhiteSpace(proj.VernacularWritingSystem.Bcp47)) { @@ -408,6 +343,75 @@ public async Task LiftExport( return destinationFileName; } + /// Copy imported lift-ranges file, if available + /// Path of lift-ranges file copied, or null if none + private static string? CopyLiftRanges(string projectId, string rangesDest) + { + string? rangesSrc = null; + var extractedPathToImport = FileStorage.GenerateImportExtractedLocationDirPath(projectId, false); + if (Directory.Exists(extractedPathToImport)) + { + rangesSrc = Directory.GetFiles( + extractedPathToImport, "*.lift-ranges", SearchOption.AllDirectories).FirstOrDefault(); + } + if (rangesSrc is not null) + { + File.Copy(rangesSrc, rangesDest, true); + } + return rangesSrc; + } + + /// Export semantic domains to lift-ranges + /// If fails to load needed semantic domain list + /// List of languages found in project sem-doms and included in the lift-ranges file + public async Task> CreateLiftRanges( + List projWords, List projDoms, string rangesDest) + { + await using var liftRangesWriter = XmlWriter.Create(rangesDest, new XmlWriterSettings + { + Indent = true, + NewLineOnAttributes = true, + Async = true + }); + await liftRangesWriter.WriteStartDocumentAsync(); + liftRangesWriter.WriteStartElement("lift-ranges"); + liftRangesWriter.WriteStartElement("range"); + liftRangesWriter.WriteAttributeString("id", "semantic-domain-ddp4"); + + var wordLangs = projWords + .SelectMany(w => w.Senses.SelectMany(s => s.SemanticDomains.Select(d => d.Lang))).Distinct(); + var exportLangs = new List(); + foreach (var lang in wordLangs) + { + var semDoms = await _semDomRepo.GetAllSemanticDomainTreeNodes(lang); + if (semDoms is not null && semDoms.Count > 0) + { + exportLangs.Add(lang); + foreach (var sd in semDoms) + { + WriteRangeElement(liftRangesWriter, sd.Id, sd.Guid, sd.Name, sd.Lang); + } + } + } + + // Pull from new semantic domains in project + foreach (var sd in projDoms) + { + var guid = string.IsNullOrEmpty(sd.Guid) || sd.Guid == Guid.Empty.ToString() + ? Guid.NewGuid().ToString() + : sd.Guid; + WriteRangeElement(liftRangesWriter, sd.Id, guid, sd.Name, sd.Lang); + } + + await liftRangesWriter.WriteEndElementAsync(); //end semantic-domain-ddp4 range + await liftRangesWriter.WriteEndElementAsync(); //end lift-ranges + await liftRangesWriter.WriteEndDocumentAsync(); + + await liftRangesWriter.FlushAsync(); + liftRangesWriter.Close(); + return exportLangs; + } + /// Adds of a word to be written out to lift private static void AddNote(LexEntry entry, Word wordEntry) { @@ -574,21 +578,21 @@ public ILiftMerger GetLiftImporterExporter(string projectId, IWordRepository wor } private static void WriteRangeElement( - XmlWriter liftRangesWriter, string id, string guid, string name) + XmlWriter liftRangesWriter, string id, string guid, string name, string lang) { liftRangesWriter.WriteStartElement("range-element"); liftRangesWriter.WriteAttributeString("id", $"{id} {name}"); liftRangesWriter.WriteAttributeString("guid", guid); liftRangesWriter.WriteStartElement("label"); - liftRangesWriter.WriteAttributeString("lang", "en"); + liftRangesWriter.WriteAttributeString("lang", lang); liftRangesWriter.WriteStartElement("text"); liftRangesWriter.WriteString(name); liftRangesWriter.WriteEndElement(); //end text liftRangesWriter.WriteEndElement(); //end label liftRangesWriter.WriteStartElement("abbrev"); - liftRangesWriter.WriteAttributeString("lang", "en"); + liftRangesWriter.WriteAttributeString("lang", lang); liftRangesWriter.WriteStartElement("text"); liftRangesWriter.WriteString(id); liftRangesWriter.WriteEndElement(); //end text diff --git a/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell.tsx index 4379fba2b1..d0627355ed 100644 --- a/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DomainCell.tsx @@ -6,7 +6,6 @@ import { useSelector } from "react-redux"; import { toast } from "react-toastify"; import { SemanticDomain } from "api/models"; -import { getCurrentUser } from "backend/localStorage"; import Overlay from "components/Overlay"; import TreeView from "components/TreeView"; import AlignedList, { @@ -63,17 +62,7 @@ export default function DomainCell(props: DomainCellProps): ReactElement { } props.editDomains(senseToChange.guid, [ ...senseToChange.domains, - (function () { - const tempSemanticDomain = newSemanticDomainForMongoDB( - selectedDomain.mongoId!, - selectedDomain.guid, - selectedDomain.name, - selectedDomain.id - ); - tempSemanticDomain.userId = getCurrentUser()?.id; - tempSemanticDomain.created = new Date().toISOString(); - return tempSemanticDomain; - })(), + newSemanticDomainForMongoDB(selectedDomain), ]); } } diff --git a/src/types/semanticDomain.ts b/src/types/semanticDomain.ts index 022915cd1a..ea08a69585 100644 --- a/src/types/semanticDomain.ts +++ b/src/types/semanticDomain.ts @@ -5,6 +5,7 @@ import { SemanticDomainCount, SemanticDomainUserCount, } from "api/models"; +import { getUserId } from "backend/localStorage"; import { Bcp47Code } from "types/writingSystem"; export function newSemanticDomain( @@ -16,14 +17,13 @@ export function newSemanticDomain( } export function newSemanticDomainForMongoDB( - mongoId = "", - guid = "", - name = "", - id = "", - lang = Bcp47Code.Default as string, - userId = "" + dom: SemanticDomainTreeNode ): SemanticDomain { - return { mongoId, guid, name, id, lang, userId }; + const { mongoId, guid, name, id } = dom; + const lang = dom.lang || Bcp47Code.Default; + const userId = getUserId(); + const created = new Date().toISOString(); + return { mongoId, guid, name, id, lang, userId, created }; } export function newSemanticDomainTreeNode( From 650375610e12544e2ddb98e1cdfc8c11133e0317 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 1 Dec 2023 10:39:02 -0500 Subject: [PATCH 18/98] Dependabot updates for December 2023 (#2822) * Bump @adobe/css-tools from 4.3.1 to 4.3.2 * Update Python dependencies * Bump Microsoft.AspNetCore.Authentication.JwtBearer in /Backend * Bump MailKit from 4.2.0 to 4.3.0 in /Backend * Bump node from 18.18.0-bookworm-slim to 18.18.2-bookworm-slim * Bump @mui/icons-material from 5.14.18 to 5.14.19 * Bump react-i18next from 13.4.1 to 13.5.0 * Bump license-checker-rseidelsohn from 4.2.10 to 4.2.11 * Bump @types/react-test-renderer from 18.0.6 to 18.0.7 * Bump Microsoft.NET.Test.Sdk from 17.7.2 to 17.8.0 in /Backend.Tests * Bump NUnit from 3.13.3 to 4.0.0 in /Backend.Tests * Bump step-security/harden-runner from 2.6.0 to 2.6.1 * Bump github/codeql-action from 2.22.5 to 2.22.8 * Bump docker/build-push-action from 5.0.0 to 5.1.0 * Bump mongo from 7.0.2-jammy to 7.0.4-jammy in /database * Update license reports --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/backend.yml | 14 +++--- .github/workflows/codeql.yml | 8 ++-- .github/workflows/combine_deploy_image.yml | 4 +- .github/workflows/database.yml | 2 +- .github/workflows/deploy_qa.yml | 4 +- .github/workflows/deploy_release.yml | 2 +- .github/workflows/frontend.yml | 8 ++-- .github/workflows/maintenance.yml | 2 +- .github/workflows/pages.yml | 2 +- .github/workflows/python.yml | 2 +- .github/workflows/scorecards.yml | 4 +- Backend.Tests/Backend.Tests.csproj | 4 +- Backend/BackendFramework.csproj | 4 +- Dockerfile | 2 +- database/Dockerfile | 2 +- deploy/requirements.txt | 14 +++--- dev-requirements.txt | 34 ++++++------- .../assets/licenses/backend_licenses.txt | 6 +-- .../assets/licenses/frontend_licenses.txt | 6 +-- maintenance/requirements.txt | 12 ++--- package-lock.json | 48 +++++++++---------- package.json | 8 ++-- 22 files changed, 96 insertions(+), 96 deletions(-) diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index b2c2815083..be2bfcc0d0 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -19,7 +19,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -72,7 +72,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -106,7 +106,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -129,11 +129,11 @@ jobs: with: dotnet-version: "6.0.x" - name: Initialize CodeQL - uses: github/codeql-action/init@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2.22.5 + uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 with: languages: csharp - name: Autobuild - uses: github/codeql-action/autobuild@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2.22.5 + uses: github/codeql-action/autobuild@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 - name: Upload artifacts if build failed uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 if: ${{ failure() }} @@ -141,7 +141,7 @@ jobs: name: tracer-logs path: ${{ runner.temp }}/*.log - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2.22.5 + uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 docker_build: runs-on: ubuntu-22.04 @@ -150,7 +150,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true disable-file-monitoring: true diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 7d94d9957c..2ac8d540ee 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -45,7 +45,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -63,7 +63,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2.22.5 + uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -76,7 +76,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2.22.5 + uses: github/codeql-action/autobuild@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 # Command-line programs to run using the OS shell. # See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -89,6 +89,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2.22.5 + uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/combine_deploy_image.yml b/.github/workflows/combine_deploy_image.yml index 75a5bb349c..bd4e0e006f 100644 --- a/.github/workflows/combine_deploy_image.yml +++ b/.github/workflows/combine_deploy_image.yml @@ -16,7 +16,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -54,7 +54,7 @@ jobs: username: ${{ secrets.AWS_ACCESS_KEY_ID }} password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - name: Build combine_deploy - uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0 + uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 with: context: "{{defaultContext}}:deploy" push: true diff --git a/.github/workflows/database.yml b/.github/workflows/database.yml index 19a0ad8484..d2cfcef1c5 100644 --- a/.github/workflows/database.yml +++ b/.github/workflows/database.yml @@ -15,7 +15,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/deploy_qa.yml b/.github/workflows/deploy_qa.yml index ca9c8582a7..c68231a4cc 100644 --- a/.github/workflows/deploy_qa.yml +++ b/.github/workflows/deploy_qa.yml @@ -21,7 +21,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -73,7 +73,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/deploy_release.yml b/.github/workflows/deploy_release.yml index 8386db22e2..32846ca004 100644 --- a/.github/workflows/deploy_release.yml +++ b/.github/workflows/deploy_release.yml @@ -20,7 +20,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: egress-policy: block allowed-endpoints: > diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml index b98e84f796..1379c1d781 100644 --- a/.github/workflows/frontend.yml +++ b/.github/workflows/frontend.yml @@ -19,7 +19,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -48,7 +48,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -82,7 +82,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -113,7 +113,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/maintenance.yml b/.github/workflows/maintenance.yml index 1c9db34f9e..9fdba9dffe 100644 --- a/.github/workflows/maintenance.yml +++ b/.github/workflows/maintenance.yml @@ -15,7 +15,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 9b3b83d5e1..042bd2c8e9 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -17,7 +17,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 8edd4cc565..25707765cd 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -19,7 +19,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index cf7acda42a..6a995df3c6 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -35,7 +35,7 @@ jobs: # See https://docs.stepsecurity.io/harden-runner/getting-started/ for instructions on # configuring harden-runner and identifying allowed endpoints. - name: Harden Runner - uses: step-security/harden-runner@1b05615854632b887b69ae1be8cbefe72d3ae423 # v2.6.0 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: disable-sudo: true egress-policy: block @@ -89,6 +89,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@74483a38d39275f33fcff5f35b679b5ca4a26a99 # v2.22.5 + uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 with: sarif_file: results.sarif diff --git a/Backend.Tests/Backend.Tests.csproj b/Backend.Tests/Backend.Tests.csproj index d0e164231b..604df5ecaf 100644 --- a/Backend.Tests/Backend.Tests.csproj +++ b/Backend.Tests/Backend.Tests.csproj @@ -12,8 +12,8 @@ $(NoWarn);CA1305;CS1591 - - + + diff --git a/Backend/BackendFramework.csproj b/Backend/BackendFramework.csproj index 84190d946a..98ebb21650 100644 --- a/Backend/BackendFramework.csproj +++ b/Backend/BackendFramework.csproj @@ -13,12 +13,12 @@ NU1701 - + - + diff --git a/Dockerfile b/Dockerfile index 1b2cddfcec..111ec37e80 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ COPY docs/user_guide docs/user_guide RUN tox -e user-guide # Frontend build environment. -FROM node:18.18.0-bookworm-slim AS frontend_builder +FROM node:18.18.2-bookworm-slim AS frontend_builder WORKDIR /app # Install app dependencies. diff --git a/database/Dockerfile b/database/Dockerfile index b244678726..bcb1b9079f 100644 --- a/database/Dockerfile +++ b/database/Dockerfile @@ -1,4 +1,4 @@ -FROM mongo:7.0.2-jammy +FROM mongo:7.0.4-jammy WORKDIR / diff --git a/deploy/requirements.txt b/deploy/requirements.txt index 694935a0b3..d16e2e35c5 100644 --- a/deploy/requirements.txt +++ b/deploy/requirements.txt @@ -4,13 +4,13 @@ # # pip-compile requirements.in # -ansible==8.5.0 +ansible==9.0.1 # via -r requirements.in -ansible-core==2.15.5 +ansible-core==2.16.0 # via ansible cachetools==5.3.2 # via google-auth -certifi==2023.7.22 +certifi==2023.11.17 # via # kubernetes # requests @@ -18,13 +18,13 @@ cffi==1.16.0 # via cryptography charset-normalizer==3.3.2 # via requests -cryptography==41.0.5 +cryptography==41.0.7 # via # ansible-core # pyopenssl -google-auth==2.23.4 +google-auth==2.24.0 # via kubernetes -idna==3.4 +idna==3.6 # via requests jinja2==3.1.2 # via @@ -43,7 +43,7 @@ oauthlib==3.2.2 # requests-oauthlib packaging==23.2 # via ansible-core -pyasn1==0.5.0 +pyasn1==0.5.1 # via # pyasn1-modules # rsa diff --git a/dev-requirements.txt b/dev-requirements.txt index 5feb8b4c51..ccc5c6aa3c 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -12,13 +12,13 @@ babel==2.13.1 # via mkdocs-material beautifulsoup4==4.12.2 # via mkdocs-htmlproofer-plugin -black==23.10.1 +black==23.11.0 # via -r dev-requirements.in cachetools==5.3.2 # via # google-auth # tox -certifi==2023.7.22 +certifi==2023.11.17 # via # kubernetes # requests @@ -37,7 +37,7 @@ colorama==0.4.6 # -r dev-requirements.in # mkdocs-material # tox -cryptography==41.0.5 +cryptography==41.0.7 # via # pyopenssl # types-pyopenssl @@ -61,7 +61,7 @@ flake8==6.1.0 # pep8-naming flake8-broken-line==1.0.0 # via -r dev-requirements.in -flake8-bugbear==23.9.16 +flake8-bugbear==23.11.28 # via -r dev-requirements.in flake8-comprehensions==3.14.0 # via -r dev-requirements.in @@ -69,11 +69,11 @@ flake8-eradicate==1.5.0 # via -r dev-requirements.in ghp-import==2.1.0 # via mkdocs -google-auth==2.23.4 +google-auth==2.24.0 # via kubernetes humanfriendly==10.0 # via -r dev-requirements.in -idna==3.4 +idna==3.6 # via requests isort==5.12.0 # via -r dev-requirements.in @@ -108,13 +108,13 @@ mkdocs==1.5.3 # mkdocs-static-i18n mkdocs-htmlproofer-plugin==1.0.0 # via -r dev-requirements.in -mkdocs-material==9.4.7 +mkdocs-material==9.4.14 # via -r dev-requirements.in -mkdocs-material-extensions==1.3 +mkdocs-material-extensions==1.3.1 # via mkdocs-material mkdocs-static-i18n==1.2.0 # via -r dev-requirements.in -mypy==1.6.1 +mypy==1.7.1 # via -r dev-requirements.in mypy-extensions==1.0.0 # via @@ -138,7 +138,7 @@ pathspec==0.11.2 # mkdocs pep8-naming==0.13.3 # via -r dev-requirements.in -platformdirs==3.11.0 +platformdirs==4.0.0 # via # black # mkdocs @@ -146,7 +146,7 @@ platformdirs==3.11.0 # virtualenv pluggy==1.3.0 # via tox -pyasn1==0.5.0 +pyasn1==0.5.1 # via # pyasn1-modules # rsa @@ -158,11 +158,11 @@ pycparser==2.21 # via cffi pyflakes==3.1.0 # via flake8 -pygments==2.16.1 +pygments==2.17.2 # via mkdocs-material -pymdown-extensions==10.3.1 +pymdown-extensions==10.5 # via mkdocs-material -pymongo==4.5.0 +pymongo==4.6.1 # via -r dev-requirements.in pyopenssl==23.3.0 # via -r dev-requirements.in @@ -207,7 +207,7 @@ tomli==2.0.1 # mypy # pyproject-api # tox -tox==4.11.3 +tox==4.11.4 # via -r dev-requirements.in types-pyopenssl==23.3.0.0 # via -r dev-requirements.in @@ -221,12 +221,12 @@ typing-extensions==4.8.0 # via # black # mypy -urllib3==2.0.7 +urllib3==2.1.0 # via # kubernetes # requests # types-requests -virtualenv==20.24.6 +virtualenv==20.24.7 # via tox watchdog==3.0.0 # via mkdocs diff --git a/docs/user_guide/assets/licenses/backend_licenses.txt b/docs/user_guide/assets/licenses/backend_licenses.txt index a62464cc26..ea58a0f128 100644 --- a/docs/user_guide/assets/licenses/backend_licenses.txt +++ b/docs/user_guide/assets/licenses/backend_licenses.txt @@ -58,7 +58,7 @@ license Type:LICENSE.md #################################################################################################### Package:MailKit -Version:4.2.0 +Version:4.3.0 project URL:http://www.mimekit.net/ Description:MailKit is an Open Source cross-platform .NET mail-client library that is based on MimeKit and optimized for mobile devices. @@ -791,7 +791,7 @@ license Type:MIT #################################################################################################### Package:MimeKit -Version:4.2.0 +Version:4.3.0 project URL:http://www.mimekit.net/ Description:MimeKit is an Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms. It also supports parsing of Unix mbox files. @@ -3091,7 +3091,7 @@ license Type:MS-EULA #################################################################################################### Package:System.Security.Cryptography.Pkcs -Version:7.0.2 +Version:7.0.3 project URL:https://dot.net/ Description:Provides support for PKCS and CMS algorithms. diff --git a/docs/user_guide/assets/licenses/frontend_licenses.txt b/docs/user_guide/assets/licenses/frontend_licenses.txt index d5694cca34..a23d90bbe0 100644 --- a/docs/user_guide/assets/licenses/frontend_licenses.txt +++ b/docs/user_guide/assets/licenses/frontend_licenses.txt @@ -128,7 +128,7 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@babel/runtime 7.23.2 +@babel/runtime 7.23.5 MIT MIT License @@ -1188,7 +1188,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@mui/icons-material 5.14.18 +@mui/icons-material 5.14.19 MIT The MIT License (MIT) @@ -43311,7 +43311,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -react-i18next 13.4.1 +react-i18next 13.5.0 MIT The MIT License (MIT) diff --git a/maintenance/requirements.txt b/maintenance/requirements.txt index 9d16371e1e..6cd7412006 100644 --- a/maintenance/requirements.txt +++ b/maintenance/requirements.txt @@ -6,7 +6,7 @@ # cachetools==5.3.2 # via google-auth -certifi==2023.7.22 +certifi==2023.11.17 # via # kubernetes # requests @@ -14,15 +14,15 @@ cffi==1.16.0 # via cryptography charset-normalizer==3.3.2 # via requests -cryptography==41.0.5 +cryptography==41.0.7 # via pyopenssl dnspython==2.4.2 # via pymongo -google-auth==2.23.4 +google-auth==2.24.0 # via kubernetes humanfriendly==10.0 # via -r requirements.in -idna==3.4 +idna==3.6 # via requests kubernetes==28.1.0 # via -r requirements.in @@ -30,7 +30,7 @@ oauthlib==3.2.2 # via # kubernetes # requests-oauthlib -pyasn1==0.5.0 +pyasn1==0.5.1 # via # pyasn1-modules # rsa @@ -38,7 +38,7 @@ pyasn1-modules==0.3.0 # via google-auth pycparser==2.21 # via cffi -pymongo==4.5.0 +pymongo==4.6.1 # via -r requirements.in pyopenssl==23.3.0 # via -r requirements.in diff --git a/package-lock.json b/package-lock.json index 248e82f835..0b1c6a9a74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@material-table/core": "^6.3.0", "@matt-block/react-recaptcha-v2": "^2.0.1", "@microsoft/signalr": "^8.0.0", - "@mui/icons-material": "^5.14.11", + "@mui/icons-material": "^5.14.19", "@mui/material": "^5.14.16", "@redux-devtools/extension": "^3.2.5", "@reduxjs/toolkit": "^1.9.5", @@ -41,7 +41,7 @@ "react-beautiful-dnd": "^13.1.1", "react-chartjs-2": "^5.2.0", "react-dom": "^18.2.0", - "react-i18next": "^13.3.1", + "react-i18next": "^13.5.0", "react-modal": "^3.16.1", "react-redux": "^8.1.3", "react-router-dom": "^6.16.0", @@ -69,7 +69,7 @@ "@types/react-beautiful-dnd": "^13.1.4", "@types/react-dom": "^18.2.15", "@types/react-modal": "^3.16.0", - "@types/react-test-renderer": "^18.0.6", + "@types/react-test-renderer": "^18.0.7", "@types/recordrtc": "^5.6.12", "@types/redux-mock-store": "^1.0.4", "@types/segment-analytics": "^0.0.37", @@ -86,7 +86,7 @@ "eslint-plugin-unused-imports": "^3.0.0", "hunspell-reader": "^7.0.0", "jest-canvas-mock": "^2.5.2", - "license-checker-rseidelsohn": "^4.2.6", + "license-checker-rseidelsohn": "^4.2.11", "madge": "^6.1.0", "npm-run-all": "^4.1.5", "prettier": "^3.0.3", @@ -107,9 +107,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", - "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", "dev": true }, "node_modules/@alloc/quick-lru": { @@ -2374,9 +2374,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -4441,18 +4441,18 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.14.18", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.18.tgz", - "integrity": "sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==", + "version": "5.14.19", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.19.tgz", + "integrity": "sha512-yjP8nluXxZGe3Y7pS+yxBV+hWZSsSBampCxkZwaw+1l+feL+rfP74vbEFbMrX/Kil9I/Y1tWfy5bs/eNvwNpWw==", "dependencies": { - "@babel/runtime": "^7.23.2" + "@babel/runtime": "^7.23.4" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@mui/material": "^5.0.0", @@ -8722,9 +8722,9 @@ } }, "node_modules/@types/react-test-renderer": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.6.tgz", - "integrity": "sha512-O2JT1J3/v/NaYHYmPf2DXBSqUGmp6iwhFPicES6Pc1Y90B9Qgu99mmaBGqfZFpVuXLzF/pNJB4K9ySL3iqFeXA==", + "version": "18.0.7", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.7.tgz", + "integrity": "sha512-1+ANPOWc6rB3IkSnElhjv6VLlKg2dSv/OWClUyZimbLsQyBn8Js9Vtdsi3UICJ2rIQ3k2la06dkB+C92QfhKmg==", "dev": true, "dependencies": { "@types/react": "*" @@ -19247,9 +19247,9 @@ } }, "node_modules/license-checker-rseidelsohn": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/license-checker-rseidelsohn/-/license-checker-rseidelsohn-4.2.10.tgz", - "integrity": "sha512-phvcph9WTQ/Kb209kqwLxVA6CV8BAeUnFMIo+I+wBlp74El4ngbMwq49qSqqPYC5bfj49EWBXqwjvTFswGE2Fg==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/license-checker-rseidelsohn/-/license-checker-rseidelsohn-4.2.11.tgz", + "integrity": "sha512-ZzLC4k66TqlcJQliZCy8ZOngy2IJrh1xUhMz/xyUQmg9LEt+mUisl9/eacEObIBmZ353bEMSK7Ne/T9pFQwlPA==", "dev": true, "dependencies": { "chalk": "4.1.2", @@ -23146,9 +23146,9 @@ "dev": true }, "node_modules/react-i18next": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.4.1.tgz", - "integrity": "sha512-z02JvLbt6Gavbuhr4CBOI6vasLypo+JSLvMgUOGeOMPv1g6spngfAb9jWAPwvuavPlKYU4dro9yRduflwyBeyA==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.5.0.tgz", + "integrity": "sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==", "dependencies": { "@babel/runtime": "^7.22.5", "html-parse-stringify": "^3.0.1" diff --git a/package.json b/package.json index cf04ce7df3..86ce9d90c3 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@material-table/core": "^6.3.0", "@matt-block/react-recaptcha-v2": "^2.0.1", "@microsoft/signalr": "^8.0.0", - "@mui/icons-material": "^5.14.11", + "@mui/icons-material": "^5.14.19", "@mui/material": "^5.14.16", "@redux-devtools/extension": "^3.2.5", "@reduxjs/toolkit": "^1.9.5", @@ -69,7 +69,7 @@ "react-beautiful-dnd": "^13.1.1", "react-chartjs-2": "^5.2.0", "react-dom": "^18.2.0", - "react-i18next": "^13.3.1", + "react-i18next": "^13.5.0", "react-modal": "^3.16.1", "react-redux": "^8.1.3", "react-router-dom": "^6.16.0", @@ -97,7 +97,7 @@ "@types/react-beautiful-dnd": "^13.1.4", "@types/react-dom": "^18.2.15", "@types/react-modal": "^3.16.0", - "@types/react-test-renderer": "^18.0.6", + "@types/react-test-renderer": "^18.0.7", "@types/recordrtc": "^5.6.12", "@types/redux-mock-store": "^1.0.4", "@types/segment-analytics": "^0.0.37", @@ -114,7 +114,7 @@ "eslint-plugin-unused-imports": "^3.0.0", "hunspell-reader": "^7.0.0", "jest-canvas-mock": "^2.5.2", - "license-checker-rseidelsohn": "^4.2.6", + "license-checker-rseidelsohn": "^4.2.11", "madge": "^6.1.0", "npm-run-all": "^4.1.5", "prettier": "^3.0.3", From 73789f62c7e68d6c398fcdb039c32b588163d9fd Mon Sep 17 00:00:00 2001 From: "D. Ror" Date: Mon, 4 Dec 2023 13:21:10 -0500 Subject: [PATCH 19/98] Expand DeleteCell testing (#2823) --- .../ReviewEntriesTable/CellColumns.tsx | 1 + .../CellComponents/DeleteCell.tsx | 16 +-- .../CellComponents/tests/DeleteCell.test.tsx | 97 +++++++++++++++++-- src/goals/ReviewEntries/ReviewEntriesTypes.ts | 1 + 4 files changed, 100 insertions(+), 15 deletions(-) diff --git a/src/goals/ReviewEntries/ReviewEntriesTable/CellColumns.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellColumns.tsx index 868e88cd48..566fb133a0 100644 --- a/src/goals/ReviewEntries/ReviewEntriesTable/CellColumns.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellColumns.tsx @@ -449,6 +449,7 @@ const columns: Column[] = [ // Delete Entry column { + id: ColumnId.Delete, title: ColumnTitle.Delete, filtering: false, sorting: false, diff --git a/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell.tsx index eeb88118bf..cc7490258a 100644 --- a/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell.tsx @@ -1,6 +1,6 @@ import { Delete } from "@mui/icons-material"; import { IconButton, Tooltip } from "@mui/material"; -import React, { ReactElement, useState } from "react"; +import { ReactElement, useState } from "react"; import { useTranslation } from "react-i18next"; import { deleteFrontierWord as deleteFromBackend } from "backend"; @@ -10,6 +10,10 @@ import { ReviewEntriesWord } from "goals/ReviewEntries/ReviewEntriesTypes"; import { StoreState } from "types"; import { useAppDispatch, useAppSelector } from "types/hooks"; +export const buttonId = (wordId: string): string => `row-${wordId}-delete`; +export const buttonIdCancel = "delete-cancel"; +export const buttonIdConfirm = "delete-confirm"; + interface DeleteCellProps { rowData: ReviewEntriesWord; } @@ -40,7 +44,7 @@ export default function DeleteCell(props: DeleteCellProps): ReactElement { } return ( - + <> @@ -61,9 +65,9 @@ export default function DeleteCell(props: DeleteCellProps): ReactElement { textId={"reviewEntries.deleteWordWarning"} handleCancel={handleClose} handleConfirm={deleteFrontierWord} - buttonIdCancel="row-delete-cancel" - buttonIdConfirm="row-delete-confirm" + buttonIdCancel={buttonIdCancel} + buttonIdConfirm={buttonIdConfirm} /> - + ); } diff --git a/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DeleteCell.test.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DeleteCell.test.tsx index 2cc3b02281..ad471603da 100644 --- a/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DeleteCell.test.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/CellComponents/tests/DeleteCell.test.tsx @@ -1,24 +1,103 @@ import { Provider } from "react-redux"; -import renderer from "react-test-renderer"; +import { ReactTestRenderer, act, create } from "react-test-renderer"; import configureMockStore from "redux-mock-store"; import "tests/reactI18nextMock"; +import { CancelConfirmDialog } from "components/Dialogs"; import { defaultState as reviewEntriesState } from "goals/ReviewEntries/Redux/ReviewEntriesReduxTypes"; -import DeleteCell from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell"; +import DeleteCell, { + buttonId, + buttonIdCancel, + buttonIdConfirm, +} from "goals/ReviewEntries/ReviewEntriesTable/CellComponents/DeleteCell"; import mockWords from "goals/ReviewEntries/tests/WordsMock"; +// Dialog uses portals, which are not supported in react-test-renderer. +jest.mock("@mui/material", () => { + const materialUiCore = jest.requireActual("@mui/material"); + return { + ...jest.requireActual("@mui/material"), + Dialog: materialUiCore.Container, + }; +}); + +jest.mock("backend", () => ({ + deleteFrontierWord: () => mockDeleteFrontierWord(), +})); +jest.mock("types/hooks", () => { + return { + ...jest.requireActual("types/hooks"), + useAppDispatch: + () => + (...args: any[]) => + Promise.resolve(args), + }; +}); + +const mockDeleteFrontierWord = jest.fn(); + const mockStore = configureMockStore()({ reviewEntriesState }); const mockWord = mockWords()[0]; +const buttonIdDelete = buttonId(mockWord.id); + +let cellHandle: ReactTestRenderer; + +const renderDeleteCell = async (): Promise => { + await act(async () => { + cellHandle = create( + + + + ); + }); +}; + +beforeEach(async () => { + jest.clearAllMocks(); + await renderDeleteCell(); +}); describe("DeleteCell", () => { - it("renders", () => { - renderer.act(() => { - renderer.create( - - - - ); + it("has working dialog buttons", async () => { + const dialog = cellHandle.root.findByType(CancelConfirmDialog); + const deleteButton = cellHandle.root.findByProps({ id: buttonIdDelete }); + const cancelButton = cellHandle.root.findByProps({ id: buttonIdCancel }); + const confButton = cellHandle.root.findByProps({ id: buttonIdConfirm }); + + expect(dialog.props.open).toBeFalsy(); + await act(async () => { + deleteButton.props.onClick(); + }); + expect(dialog.props.open).toBeTruthy(); + await act(async () => { + cancelButton.props.onClick(); + }); + expect(dialog.props.open).toBeFalsy(); + await act(async () => { + deleteButton.props.onClick(); + }); + expect(dialog.props.open).toBeTruthy(); + await act(async () => { + await confButton.props.onClick(); + }); + expect(dialog.props.open).toBeFalsy(); + }); + + it("only deletes after confirmation", async () => { + const deleteButton = cellHandle.root.findByProps({ id: buttonIdDelete }); + const cancelButton = cellHandle.root.findByProps({ id: buttonIdCancel }); + const confButton = cellHandle.root.findByProps({ id: buttonIdConfirm }); + + await act(async () => { + deleteButton.props.onClick(); + cancelButton.props.onClick(); + deleteButton.props.onClick(); + }); + expect(mockDeleteFrontierWord).not.toBeCalled(); + await act(async () => { + await confButton.props.onClick(); }); + expect(mockDeleteFrontierWord).toBeCalled(); }); }); diff --git a/src/goals/ReviewEntries/ReviewEntriesTypes.ts b/src/goals/ReviewEntries/ReviewEntriesTypes.ts index 4b660d7575..2d1e96af61 100644 --- a/src/goals/ReviewEntries/ReviewEntriesTypes.ts +++ b/src/goals/ReviewEntries/ReviewEntriesTypes.ts @@ -22,6 +22,7 @@ export enum ColumnId { Pronunciations, Note, Flag, + Delete, } export class ReviewEntries extends Goal { From 4ed6a041679aa16a202e12b8d14893a2c16b60d1 Mon Sep 17 00:00:00 2001 From: "D. Ror" Date: Mon, 4 Dec 2023 14:38:41 -0500 Subject: [PATCH 20/98] Organize ReviewEntriesTableState; Tidy other things (#2794) --- src/components/App/SignalRHub.tsx | 6 +- src/components/AppBar/UserMenu.tsx | 4 +- src/components/Buttons/FlagButton.tsx | 2 +- src/components/Buttons/LoadingDoneButton.tsx | 10 +- src/components/DataEntry/DataEntryHeader.tsx | 6 +- .../DataEntryTable/NewEntry/index.tsx | 2 +- .../DataEntry/DataEntryTable/index.tsx | 163 ++++++++---------- src/components/LandingPage/index.tsx | 10 +- .../ProjectScreen/CreateProjectActions.ts | 4 +- .../ProjectSettings/ProjectSchedule/index.tsx | 2 +- src/components/ProjectUsers/EmailInvite.tsx | 2 +- src/components/ProjectUsers/UserList.tsx | 4 +- .../SiteSettings/UserManagement/UserList.tsx | 4 +- .../SiteSettings/UserManagement/index.tsx | 2 +- .../TreeView/TreeDepiction/TreeTile.tsx | 2 +- src/goals/DefaultGoal/Loading.tsx | 6 +- .../MergeDuplicates/MergeDupsCompleted.tsx | 5 +- .../ReviewEntriesTable/index.tsx | 2 +- 18 files changed, 113 insertions(+), 123 deletions(-) diff --git a/src/components/App/SignalRHub.tsx b/src/components/App/SignalRHub.tsx index 0606481cda..38e7d70c68 100644 --- a/src/components/App/SignalRHub.tsx +++ b/src/components/App/SignalRHub.tsx @@ -34,7 +34,7 @@ export default function SignalRHub(): ReactElement { const finishDisconnect = useCallback((): void => { setConnection(undefined); setDisconnect(false); - }, [setConnection, setDisconnect]); + }, []); /** Act on the disconnect state to stop and delete the connection. */ useEffect(() => { @@ -57,7 +57,7 @@ export default function SignalRHub(): ReactElement { setReconnect(false); setConnection(newConnection); } - }, [disconnect, reconnect, setConnection, setReconnect]); + }, [disconnect, reconnect]); /** Any change in exportState should cause a disconnect. * Only ExportStatus.Exporting should open a new connection. @@ -67,7 +67,7 @@ export default function SignalRHub(): ReactElement { if (exportState.status === ExportStatus.Exporting) { setReconnect(true); } - }, [exportState, setDisconnect, setReconnect]); + }, [exportState]); /** Once a connection is opened, start the relevant methods. */ useEffect(() => { diff --git a/src/components/AppBar/UserMenu.tsx b/src/components/AppBar/UserMenu.tsx index 1eea6f9426..371dcaad8a 100644 --- a/src/components/AppBar/UserMenu.tsx +++ b/src/components/AppBar/UserMenu.tsx @@ -12,7 +12,7 @@ import { MenuItem, Typography, } from "@mui/material"; -import React, { ReactElement, useState } from "react"; +import React, { Fragment, ReactElement, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -89,7 +89,7 @@ export default function UserMenu(props: TabProps): ReactElement { ) : ( - + )} {avatar ? ( diff --git a/src/components/Buttons/FlagButton.tsx b/src/components/Buttons/FlagButton.tsx index b9cdc8d4e2..5dd801c6d1 100644 --- a/src/components/Buttons/FlagButton.tsx +++ b/src/components/Buttons/FlagButton.tsx @@ -20,7 +20,7 @@ export default function FlagButton(props: FlagButtonProps): ReactElement { useEffect(() => { setActive(props.flag.active); setText(props.flag.active ? props.flag.text : undefined); - }, [props.flag, setActive, setText]); + }, [props.flag]); function updateFlag(text: string): void { setActive(true); diff --git a/src/components/Buttons/LoadingDoneButton.tsx b/src/components/Buttons/LoadingDoneButton.tsx index 7c83f6460c..2055123076 100644 --- a/src/components/Buttons/LoadingDoneButton.tsx +++ b/src/components/Buttons/LoadingDoneButton.tsx @@ -1,17 +1,17 @@ import { Check } from "@mui/icons-material"; import { Button, CircularProgress } from "@mui/material"; import { ButtonProps } from "@mui/material/Button"; -import React, { ReactElement } from "react"; +import { ReactElement, ReactNode } from "react"; import { useTranslation } from "react-i18next"; import { themeColors } from "types/theme"; interface LoadingDoneProps { buttonProps?: ButtonProps; - children?: React.ReactNode; + children?: ReactNode; disabled?: boolean; done?: boolean; - doneText?: React.ReactNode | string; + doneText?: ReactNode | string; loading?: boolean; } @@ -36,10 +36,10 @@ export default function LoadingDoneButton( }} > {props.done ? ( - + <> {props.doneText ?? t("buttons.done")} - + ) : ( props.children )} diff --git a/src/components/DataEntry/DataEntryHeader.tsx b/src/components/DataEntry/DataEntryHeader.tsx index 037d9868bc..4d0333f046 100644 --- a/src/components/DataEntry/DataEntryHeader.tsx +++ b/src/components/DataEntry/DataEntryHeader.tsx @@ -1,6 +1,6 @@ import { Help } from "@mui/icons-material"; import { Switch, Typography } from "@mui/material"; -import React, { ReactElement } from "react"; +import { ReactElement } from "react"; import { useTranslation } from "react-i18next"; import { Key } from "ts-key-enum"; @@ -52,12 +52,12 @@ export default function DataEntryHeader( function Questions(props: { questions: string[] }): ReactElement { return ( - + <> {props.questions.map((question, index) => ( {question} ))} - + ); } diff --git a/src/components/DataEntry/DataEntryTable/NewEntry/index.tsx b/src/components/DataEntry/DataEntryTable/NewEntry/index.tsx index d1d6dde042..0e657ea901 100644 --- a/src/components/DataEntry/DataEntryTable/NewEntry/index.tsx +++ b/src/components/DataEntry/DataEntryTable/NewEntry/index.tsx @@ -119,7 +119,7 @@ export default function NewEntry(props: NewEntryProps): ReactElement { resetNewEntry(); setVernOpen(false); focus(FocusTarget.Vernacular); - }, [focus, resetNewEntry, setVernOpen]); + }, [focus, resetNewEntry]); /** Reset when tree opens, except for the first time it is open. */ useEffect(() => { diff --git a/src/components/DataEntry/DataEntryTable/index.tsx b/src/components/DataEntry/DataEntryTable/index.tsx index 8c44cfac8a..6c510683a6 100644 --- a/src/components/DataEntry/DataEntryTable/index.tsx +++ b/src/components/DataEntry/DataEntryTable/index.tsx @@ -68,7 +68,7 @@ enum DefunctStatus { Retire = "RETIRE", } -/*** Add current semantic domain to specified sense within a word. */ +/** Add current semantic domain to specified sense within a word. */ export function addSemanticDomainToSense( semDom: SemanticDomain, word: Word, @@ -83,7 +83,7 @@ export function addSemanticDomainToSense( return { ...word, senses }; } -/*** Focus on a specified object. */ +/** Focus on a specified object. */ export function focusInput(ref: RefObject): void { if (ref.current) { ref.current.focus(); @@ -91,7 +91,7 @@ export function focusInput(ref: RefObject): void { } } -/*** Find suggestions for given text from a list of strings. */ +/** Find suggestions for given text from a list of strings. */ export function getSuggestions( text: string, all: string[], @@ -121,13 +121,13 @@ export function getSuggestions( return some; } -/*** Return a copy of the semantic domain with current UserId and timestamp. */ +/** Return a copy of the semantic domain with current UserId and timestamp. */ export function makeSemDomCurrent(semDom: SemanticDomain): SemanticDomain { const created = new Date().toISOString(); return { ...semDom, created, userId: getUserId() }; } -/*** Given a WordAccess and a new gloss, returns a copy of the word +/** Given a WordAccess and a new gloss, returns a copy of the word * with the gloss of the specified sense changed to the new gloss. * If that sense has multiple semantic domains, split into two senses: * one with the specified domain and the new gloss, @@ -172,17 +172,7 @@ export function updateEntryGloss( return { ...entry.word, senses }; } -interface DataEntryTableState { - // word data - allVerns: string[]; - allWords: Word[]; - recentWords: WordAccess[]; - // state management - defunctUpdates: Hash; - defunctWordIds: Hash; - isFetchingFrontier: boolean; - senseSwitches: SenseSwitch[]; - // new entry state +interface NewEntryState { newAudioUrls: string[]; newGloss: string; newNote: string; @@ -192,7 +182,38 @@ interface DataEntryTableState { suggestedDups: Word[]; } -/*** A data entry table containing recent word entries. */ +const defaultNewEntryState = (): NewEntryState => ({ + newAudioUrls: [], + newGloss: "", + newNote: "", + newVern: "", + selectedDup: undefined, + suggestedDups: [], + suggestedVerns: [], +}); + +interface EntryTableState extends NewEntryState { + defunctUpdates: Hash; + defunctWordIds: Hash; + recentWords: WordAccess[]; + senseSwitches: SenseSwitch[]; +} + +const defaultEntryTableState = (): EntryTableState => ({ + ...defaultNewEntryState(), + defunctUpdates: {}, + defunctWordIds: {}, + recentWords: [], + senseSwitches: [], +}); + +interface DataEntryTableState extends EntryTableState { + allVerns: string[]; + allWords: Word[]; + isFetchingFrontier: boolean; +} + +/** A data entry table containing recent word entries. */ export default function DataEntryTable( props: DataEntryTableProps ): ReactElement { @@ -214,22 +235,10 @@ export default function DataEntryTable( const updateHeight = props.updateHeight; const [state, setState] = useState({ - // word data allVerns: [], allWords: [], - recentWords: [], - // state management - defunctUpdates: {}, - defunctWordIds: {}, isFetchingFrontier: true, - senseSwitches: [], - // new entry state - newAudioUrls: [], - newGloss: "", - newNote: "", - newVern: "", - suggestedVerns: [], - suggestedDups: [], + ...defaultEntryTableState(), }); const levDist = useMemo(() => new LevenshteinDistance(), []); @@ -245,7 +254,7 @@ export default function DataEntryTable( // These are preferably non-async function that return void. //////////////////////////////////// - /*** Use this without newId before updating any word on the backend, + /** Use this without newId before updating any word on the backend, * to make sure that word doesn't get edited by two different functions. * Use this with newId to specify the replacement of a defunct word. */ @@ -273,7 +282,7 @@ export default function DataEntryTable( [state.defunctWordIds] ); - /*** Update a recent entry to a different sense of the same word. */ + /** Update a recent entry to a different sense of the same word. */ const switchSense = useCallback( (oldGuid: string, newGuid: string): void => { const entry = state.recentWords.find((w) => w.senseGuid === oldGuid); @@ -293,7 +302,7 @@ export default function DataEntryTable( [state.recentWords] ); - /*** Add to recent entries every sense of the word with the current semantic domain. */ + /** Add to recent entries every sense of the word with the current semantic domain. */ const addAllSensesToDisplay = useCallback( (word: Word): void => { const domId = props.semanticDomain.id; @@ -310,7 +319,7 @@ export default function DataEntryTable( [props.semanticDomain.id] ); - /*** Add one-sense word to the display of recent entries. */ + /** Add one-sense word to the display of recent entries. */ const addToDisplay = (wordAccess: WordAccess, insertIndex?: number): void => { setState((prevState) => { const recentWords = [...prevState.recentWords]; @@ -323,7 +332,7 @@ export default function DataEntryTable( }); }; - /*** Remove recent entry from specified index. */ + /** Remove recent entry from specified index. */ const removeRecentEntry = (index: number): void => { setState((prevState) => { const recentWords = prevState.recentWords.filter((_w, i) => i !== index); @@ -331,7 +340,7 @@ export default function DataEntryTable( }); }; - /*** Add a senseSwitch to the queue to be processed when possible. */ + /** Add a senseSwitch to the queue to be processed when possible. */ const queueSenseSwitch = (oldGuid: string, newGuid: string): void => { if (!oldGuid || !newGuid) { return; @@ -342,7 +351,7 @@ export default function DataEntryTable( }); }; - /*** Replace every displayed instance of a word. */ + /** Replace every displayed instance of a word. */ const replaceInDisplay = (oldId: string, word: Word): void => { setState((prevState) => { const recentWords = prevState.recentWords.map((a) => @@ -352,18 +361,12 @@ export default function DataEntryTable( }); }; - /*** Clear all new entry state elements. */ + /** Clear all new entry state elements. */ const resetNewEntry = (): void => { - setState((prevState) => ({ - ...prevState, - newAudioUrls: [], - newGloss: "", - newNote: "", - newVern: "", - })); + setState((prevState) => ({ ...prevState, ...defaultNewEntryState() })); }; - /*** Add an audio file to newAudioUrls. */ + /** Add an audio file to newAudioUrls. */ const addNewAudioUrl = (file: File): void => { setState((prevState) => { const newAudioUrls = [...prevState.newAudioUrls]; @@ -372,7 +375,7 @@ export default function DataEntryTable( }); }; - /*** Delete a url from newAudioUrls. */ + /** Delete a url from newAudioUrls. */ const delNewAudioUrl = (url: string): void => { setState((prevState) => { const newAudioUrls = prevState.newAudioUrls.filter((u) => u !== url); @@ -380,28 +383,28 @@ export default function DataEntryTable( }); }; - /*** Set the new entry gloss def. */ + /** Set the new entry gloss def. */ const setNewGloss = (gloss: string): void => { if (gloss !== state.newGloss) { setState((prev) => ({ ...prev, newGloss: gloss })); } }; - /*** Set the new entry note text. */ + /** Set the new entry note text. */ const setNewNote = (note: string): void => { if (note !== state.newNote) { setState((prev) => ({ ...prev, newNote: note })); } }; - /*** Set the new entry vernacular. */ + /** Set the new entry vernacular. */ const setNewVern = (vern: string): void => { if (vern !== state.newVern) { setState((prev) => ({ ...prev, newVern: vern })); } }; - /*** Set or clear the selected vern-duplicate word. */ + /** Set or clear the selected vern-duplicate word. */ const setSelectedDup = (id?: string): void => { setState((prev) => ({ ...prev, @@ -413,25 +416,11 @@ export default function DataEntryTable( })); }; - /*** Reset things specific to the current data entry session in the current semantic domain. */ + /** Reset things specific to the current data entry session in the current semantic domain. */ const resetEverything = (): void => { props.openTree(); props.hideQuestions(); - setState((prevState) => ({ - ...prevState, - defunctUpdates: {}, - defunctWordIds: {}, - recentWords: [], - senseSwitches: [], - // new entry state: - newAudioUrls: [], - newGloss: "", - newNote: "", - newVern: "", - selectedDup: undefined, - suggestedDups: [], - suggestedVerns: [], - })); + setState((prevState) => ({ ...prevState, ...defaultEntryTableState() })); }; //////////////////////////////////// @@ -439,12 +428,12 @@ export default function DataEntryTable( // These cannot be async, so use asyncFunction().then(...) as needed. //////////////////////////////////// - /*** Trigger a parent height update if the number of recent entries changes. */ + /** Trigger a parent height update if the number of recent entries changes. */ useEffect(() => { updateHeight(); }, [state.recentWords.length, updateHeight]); - /*** Manages the senseSwitches queue. */ + /** Manages the senseSwitches queue. */ useEffect(() => { if (!state.senseSwitches.length) { return; @@ -460,7 +449,7 @@ export default function DataEntryTable( switchSense(oldGuid, newGuid); }, [switchSense, state.recentWords, state.senseSwitches]); - /*** Manages fetching the frontier. + /** Manages fetching the frontier. * This is the ONLY place to update allWords and allVerns * or to switch isFetchingFrontier to false. */ useEffect(() => { @@ -499,7 +488,7 @@ export default function DataEntryTable( } }, [state.isFetchingFrontier]); - /*** If vern-autocomplete is on for the project, make list of all vernaculars. */ + /** If vern-autocomplete is on for the project, make list of all vernaculars. */ useEffect(() => { setState((prev) => ({ ...prev, @@ -509,7 +498,7 @@ export default function DataEntryTable( })); }, [state.allWords, suggestVerns]); - /*** Act on the defunctUpdates queue. */ + /** Act on the defunctUpdates queue. */ useEffect(() => { const ids = Object.keys(state.defunctUpdates); if (!ids.length) { @@ -531,7 +520,7 @@ export default function DataEntryTable( } }, [state.defunctUpdates, state.recentWords]); - /*** Update vern suggestions. */ + /** Update vern suggestions. */ useEffect(() => { if (!suggestVerns) { return; @@ -563,7 +552,7 @@ export default function DataEntryTable( // After the update, defunctWord(updatedWord.id). //////////////////////////////////// - /*** Given an array of audio file urls, add them all to specified word. */ + /** Given an array of audio file urls, add them all to specified word. */ const addAudiosToBackend = useCallback( async (oldId: string, audioURLs: string[]): Promise => { if (!audioURLs.length) { @@ -580,7 +569,7 @@ export default function DataEntryTable( [defunctWord] ); - /*** Given a single audio file, add to specified word. */ + /** Given a single audio file, add to specified word. */ const addAudioFileToWord = useCallback( async (oldId: string, audioFile: File): Promise => { defunctWord(oldId); @@ -590,7 +579,7 @@ export default function DataEntryTable( [defunctWord] ); - /*** Add a word determined to be a duplicate. + /** Add a word determined to be a duplicate. * Ensures the updated word has representation in the display. * Note: Only for use after backend.getDuplicateId(). */ @@ -612,7 +601,7 @@ export default function DataEntryTable( [addAllSensesToDisplay, addAudiosToBackend, defunctWord, state.recentWords] ); - /*** Deletes specified audio file from specified word. */ + /** Deletes specified audio file from specified word. */ const deleteAudioFromWord = useCallback( async (oldId: string, fileName: string): Promise => { defunctWord(oldId); @@ -622,7 +611,7 @@ export default function DataEntryTable( [defunctWord] ); - /*** Updates word. */ + /** Updates word. */ const updateWordInBackend = useCallback( async (word: Word): Promise => { defunctWord(word.id); @@ -637,7 +626,7 @@ export default function DataEntryTable( // General async functions. ///////////////////////////////// - /*** Add a new word to the project, or update if new word is a duplicate. */ + /** Add a new word to the project, or update if new word is a duplicate. */ const addNewWord = useCallback( async ( wordToAdd: Word, @@ -662,7 +651,7 @@ export default function DataEntryTable( [addAudiosToBackend, addDuplicateWord, analysisLang.bcp47] ); - /*** Update the word in the backend and the frontend. */ + /** Update the word in the backend and the frontend. */ const updateWordBackAndFront = async ( wordToUpdate: Word, senseGuid: string, @@ -676,7 +665,7 @@ export default function DataEntryTable( addToDisplay({ word, senseGuid }); }; - /*** Reset the entry table. If there is an un-submitted word then submit it. */ + /** Reset the entry table. If there is an un-submitted word then submit it. */ const handleExit = async (): Promise => { // Check if there is a new word, but user exited without pressing enter. if (state.newVern) { @@ -698,7 +687,7 @@ export default function DataEntryTable( // Async functions for handling changes of the NewEntry. ///////////////////////////////// - /*** Assemble a word from the new entry state and add it. */ + /** Assemble a word from the new entry state and add it. */ const addNewEntry = async (): Promise => { const word = newWord(state.newVern); const lang = analysisLang.bcp47; @@ -709,7 +698,7 @@ export default function DataEntryTable( await addNewWord(word, state.newAudioUrls); }; - /*** Checks if sense already exists with this gloss and semantic domain. */ + /** Checks if sense already exists with this gloss and semantic domain. */ const updateWordWithNewEntry = async (wordId: string): Promise => { const oldWord = state.allWords.find((w: Word) => w.id === wordId); if (!oldWord) { @@ -757,7 +746,7 @@ export default function DataEntryTable( // Async functions for handling changes of a RecentEntry. ///////////////////////////////// - /*** Retract a recent entry. */ + /** Retract a recent entry. */ const undoRecentEntry = useCallback( async (eIndex: number): Promise => { const { word, senseGuid } = state.recentWords[eIndex]; @@ -793,7 +782,7 @@ export default function DataEntryTable( ] ); - /*** Update the vernacular in a recent entry. */ + /** Update the vernacular in a recent entry. */ const updateRecentVern = useCallback( async ( index: number, @@ -824,7 +813,7 @@ export default function DataEntryTable( [addNewWord, state.recentWords, undoRecentEntry, updateWordInBackend] ); - /*** Update the gloss def in a recent entry. */ + /** Update the gloss def in a recent entry. */ const updateRecentGloss = useCallback( async (index: number, def: string): Promise => { const oldEntry = state.recentWords[index]; @@ -852,7 +841,7 @@ export default function DataEntryTable( const handleFocusNewEntry = useCallback(() => focusInput(newVernInput), []); - /*** Update the note text in a recent entry. */ + /** Update the note text in a recent entry. */ const updateRecentNote = useCallback( async (index: number, text: string): Promise => { const oldWord = state.recentWords[index].word; diff --git a/src/components/LandingPage/index.tsx b/src/components/LandingPage/index.tsx index fc88991ac1..b413489036 100644 --- a/src/components/LandingPage/index.tsx +++ b/src/components/LandingPage/index.tsx @@ -1,5 +1,5 @@ import { Box, Grid, Hidden, Typography } from "@mui/material"; -import React, { ReactElement, useEffect } from "react"; +import { ReactElement, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -28,7 +28,7 @@ export default function LandingPage(): ReactElement { navigate(Path.Root); }, [navigate]); return ( - + <> @@ -58,7 +58,7 @@ export default function LandingPage(): ReactElement { - + ); } @@ -66,7 +66,7 @@ function Body(): ReactElement { const { t } = useTranslation(); return ( - + <>
{t("landingPage.descriptionP1")} @@ -100,6 +100,6 @@ function Body(): ReactElement { marginTop: theme.spacing(4), }} /> - + ); } diff --git a/src/components/ProjectScreen/CreateProjectActions.ts b/src/components/ProjectScreen/CreateProjectActions.ts index 1c6a3c2e85..7270655fc4 100644 --- a/src/components/ProjectScreen/CreateProjectActions.ts +++ b/src/components/ProjectScreen/CreateProjectActions.ts @@ -9,7 +9,7 @@ import { newProject } from "types/project"; // Dispatch Functions -/*** Create a project without an import. */ +/** Create a project without an import. */ export function asyncCreateProject( name: string, vernacularWritingSystem: WritingSystem, @@ -31,7 +31,7 @@ export function asyncCreateProject( }; } -/*** Create a project with a pre-uploaded import. */ +/** Create a project with a pre-uploaded import. */ export function asyncFinishProject( name: string, vernacularWritingSystem: WritingSystem diff --git a/src/components/ProjectSettings/ProjectSchedule/index.tsx b/src/components/ProjectSettings/ProjectSchedule/index.tsx index 3839efabbf..9db44c07c8 100644 --- a/src/components/ProjectSettings/ProjectSchedule/index.tsx +++ b/src/components/ProjectSettings/ProjectSchedule/index.tsx @@ -42,7 +42,7 @@ export default function ProjectSchedule( const schedule = props.project.workshopSchedule?.map((d) => new Date(d)) ?? []; setProjectSchedule(schedule); - }, [props.project.workshopSchedule, setProjectSchedule]); + }, [props.project.workshopSchedule]); useEffect(() => { // Every time a modal is closed, fetch the updated schedule. diff --git a/src/components/ProjectUsers/EmailInvite.tsx b/src/components/ProjectUsers/EmailInvite.tsx index 4ddc5fe9a9..3a8cef799c 100644 --- a/src/components/ProjectUsers/EmailInvite.tsx +++ b/src/components/ProjectUsers/EmailInvite.tsx @@ -44,7 +44,7 @@ export default function EmailInvite(props: InviteProps): ReactElement { useEffect(() => { setIsValid(validator.isEmail(email) && email !== "example@gmail.com"); - }, [email, setIsValid]); + }, [email]); return ( diff --git a/src/components/ProjectUsers/UserList.tsx b/src/components/ProjectUsers/UserList.tsx index 669be20171..140e7196de 100644 --- a/src/components/ProjectUsers/UserList.tsx +++ b/src/components/ProjectUsers/UserList.tsx @@ -47,7 +47,7 @@ export default function UserList(props: UserListProps): ReactElement { const projUserIds = props.projectUsers.map((u) => u.id); setNonProjUsers(users.filter((u) => !projUserIds.includes(u.id))); }); - }, [props.projectUsers, setNonProjUsers]); + }, [props.projectUsers]); useEffect(() => { const newUserAvatar: Hash = {}; @@ -57,7 +57,7 @@ export default function UserList(props: UserListProps): ReactElement { } }); Promise.all(promises).then(() => setUserAvatar(newUserAvatar)); - }, [props.projectUsers, setUserAvatar]); + }, [props.projectUsers]); const updateUsers = (text: string): void => { setFilterInput(text); diff --git a/src/components/SiteSettings/UserManagement/UserList.tsx b/src/components/SiteSettings/UserManagement/UserList.tsx index eb80301c37..c6de593514 100644 --- a/src/components/SiteSettings/UserManagement/UserList.tsx +++ b/src/components/SiteSettings/UserManagement/UserList.tsx @@ -48,7 +48,7 @@ export default function UserList(props: UserListProps): ReactElement { useEffect(() => { setSortedUsers([...filteredUsers].sort(compareUsers)); - }, [compareUsers, filteredUsers, setFilteredUsers]); + }, [compareUsers, filteredUsers]); useEffect(() => { const newUserAvatar: Hash = {}; @@ -58,7 +58,7 @@ export default function UserList(props: UserListProps): ReactElement { } }); Promise.all(promises).then(() => setUserAvatar(newUserAvatar)); - }, [props.allUsers, setUserAvatar]); + }, [props.allUsers]); useEffect(() => { setFilteredUsers( diff --git a/src/components/SiteSettings/UserManagement/index.tsx b/src/components/SiteSettings/UserManagement/index.tsx index 20ecf8e5b7..bfff55a4c7 100644 --- a/src/components/SiteSettings/UserManagement/index.tsx +++ b/src/components/SiteSettings/UserManagement/index.tsx @@ -34,7 +34,7 @@ export default function UserManagement(): ReactElement { console.error(err); toast.error(t("siteSettings.populateUsers.toastFailure")); }); - }, [setAllUsers, t]); + }, [t]); useEffect(() => { Modal.setAppElement("body"); diff --git a/src/components/TreeView/TreeDepiction/TreeTile.tsx b/src/components/TreeView/TreeDepiction/TreeTile.tsx index d3a343bbec..2d393522a2 100644 --- a/src/components/TreeView/TreeDepiction/TreeTile.tsx +++ b/src/components/TreeView/TreeDepiction/TreeTile.tsx @@ -5,7 +5,7 @@ interface TreeTileProps { colWidth: number; imgSrc: string; } -/*** Creates a section of the tree diagram (one of the branches) set to proper dimensions. */ +/** Creates a section of the tree diagram (one of the branches) set to proper dimensions. */ export default function TreeTile(props: TreeTileProps): ReactElement { return ( diff --git a/src/goals/DefaultGoal/Loading.tsx b/src/goals/DefaultGoal/Loading.tsx index 61245e2e80..abdbaf2ef7 100644 --- a/src/goals/DefaultGoal/Loading.tsx +++ b/src/goals/DefaultGoal/Loading.tsx @@ -1,6 +1,6 @@ import { Typography } from "@mui/material"; import { animate } from "motion"; -import React, { ReactElement, useEffect } from "react"; +import { ReactElement, useEffect } from "react"; import { useTranslation } from "react-i18next"; import tractor from "resources/tractor.png"; @@ -19,7 +19,7 @@ export default function Loading(): ReactElement { }, []); return ( - + <> {t("generic.loadingTitle")} @@ -32,6 +32,6 @@ export default function Loading(): ReactElement { {t("generic.loadingText")} - + ); } diff --git a/src/goals/MergeDuplicates/MergeDupsCompleted.tsx b/src/goals/MergeDuplicates/MergeDupsCompleted.tsx index 0f9dfbf308..802bdeaa2c 100644 --- a/src/goals/MergeDuplicates/MergeDupsCompleted.tsx +++ b/src/goals/MergeDuplicates/MergeDupsCompleted.tsx @@ -111,12 +111,13 @@ interface WordPaperProps { function WordPaper(props: WordPaperProps): ReactElement { const [word, setWord] = useState(); const [flag, setFlag] = useState(newFlag()); + useEffect(() => { getWord(props.wordId).then(setWord); - }, [props.wordId, setWord]); + }, [props.wordId]); useEffect(() => { setFlag(word?.flag ?? newFlag()); - }, [word, setFlag]); + }, [word]); return ( diff --git a/src/goals/ReviewEntries/ReviewEntriesTable/index.tsx b/src/goals/ReviewEntries/ReviewEntriesTable/index.tsx index ff4579f341..ca85451581 100644 --- a/src/goals/ReviewEntries/ReviewEntriesTable/index.tsx +++ b/src/goals/ReviewEntries/ReviewEntriesTable/index.tsx @@ -80,7 +80,7 @@ export default function ReviewEntriesTable( } return { pageSize: options[i], pageSizeOptions: options }; }); - }, [maxRows, setPageState]); + }, [maxRows]); useEffect(() => { // onRowsPerPageChange={() => window.scrollTo({ top: 0 })} doesn't work. From 59a40f8cac474bf806028494ffc1c737b86a94e8 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 4 Dec 2023 15:34:11 -0500 Subject: [PATCH 21/98] Add local.thecombine.app to list of certificates for offline use (#2825) --- deploy/scripts/setup_files/profiles/prod.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/scripts/setup_files/profiles/prod.yaml b/deploy/scripts/setup_files/profiles/prod.yaml index 7a360a553f..b439a0043a 100644 --- a/deploy/scripts/setup_files/profiles/prod.yaml +++ b/deploy/scripts/setup_files/profiles/prod.yaml @@ -40,4 +40,4 @@ charts: global: awsS3Location: prod.thecombine.app pullSecretName: None - combineCertProxyList: nuc1.thecombine.app nuc2.thecombine.app nuc3.thecombine.app + combineCertProxyList: nuc1.thecombine.app nuc2.thecombine.app nuc3.thecombine.app local.thecombine.app From d8975e7d7f13254ee8cc17d6c23366b4a314898d Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 5 Dec 2023 09:45:40 -0500 Subject: [PATCH 22/98] Add role to install helm --- deploy/ansible/group_vars/nuc/main.yml | 5 +++++ deploy/ansible/group_vars/server/main.yml | 5 +++++ deploy/ansible/host_vars/localhost/main.yml | 5 +++++ deploy/ansible/playbook_desktop_setup.yaml | 9 +++++---- deploy/ansible/roles/helm_install/tasks/main.yml | 8 ++++++++ 5 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 deploy/ansible/roles/helm_install/tasks/main.yml diff --git a/deploy/ansible/group_vars/nuc/main.yml b/deploy/ansible/group_vars/nuc/main.yml index 945e06b1b5..ca4d5eeebc 100644 --- a/deploy/ansible/group_vars/nuc/main.yml +++ b/deploy/ansible/group_vars/nuc/main.yml @@ -20,6 +20,11 @@ app_namespace: thecombine k8s_user: sillsdev +################################################ +# Helm Installation +################################################ +install_helm: false + ####################################### # Ingress configuration ingress_namespace: ingress-nginx diff --git a/deploy/ansible/group_vars/server/main.yml b/deploy/ansible/group_vars/server/main.yml index 5e2035b3fa..7569fd8e52 100644 --- a/deploy/ansible/group_vars/server/main.yml +++ b/deploy/ansible/group_vars/server/main.yml @@ -19,6 +19,11 @@ create_namespaces: [] # k8s namespaces app_namespace: thecombine +################################################ +# Helm Installation +################################################ +install_helm: false + ####################################### # Ingress configuration ingress_namespace: ingress-nginx diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index c461e5b046..2f9d3376a1 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -20,6 +20,11 @@ app_namespace: thecombine k8s_user: "{{ ansible_user_id }}" +################################################ +# Helm Installation +################################################ +install_helm: true + ####################################### # Ingress configuration ingress_namespace: ingress-nginx diff --git a/deploy/ansible/playbook_desktop_setup.yaml b/deploy/ansible/playbook_desktop_setup.yaml index b2eb8ccd54..1ef8c4384a 100644 --- a/deploy/ansible/playbook_desktop_setup.yaml +++ b/deploy/ansible/playbook_desktop_setup.yaml @@ -37,10 +37,6 @@ import_role: name: network_config - # - name: Install Docker Subsystem - # import_role: - # name: docker_install - - name: Install Kubernetes import_role: name: k8s_install @@ -51,6 +47,11 @@ tags: - kubeconfig + - name: Install Helm + import_role: + name: helm_install + when: install_helm + - name: Setup Support Tool import_role: name: support_tools diff --git a/deploy/ansible/roles/helm_install/tasks/main.yml b/deploy/ansible/roles/helm_install/tasks/main.yml new file mode 100644 index 0000000000..9abe494712 --- /dev/null +++ b/deploy/ansible/roles/helm_install/tasks/main.yml @@ -0,0 +1,8 @@ +--- +- name: "Get Latest Release" + get_url: + url: https://github.com/helm/helm/releases/latest + dest: "{{ ansible_user_dir }}/Downloads/helm/" + owner: "{{ ansible_user_id }}" + group: "{{ ansible_user_gid }}" + mode: 0755 From a7f0b148f44c522f974dd50fa39bb97c4117b309 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 5 Dec 2023 10:39:09 -0500 Subject: [PATCH 23/98] Correct install of helm --- deploy/ansible/roles/helm_install/tasks/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/ansible/roles/helm_install/tasks/main.yml b/deploy/ansible/roles/helm_install/tasks/main.yml index 9abe494712..54f7925a26 100644 --- a/deploy/ansible/roles/helm_install/tasks/main.yml +++ b/deploy/ansible/roles/helm_install/tasks/main.yml @@ -2,7 +2,7 @@ - name: "Get Latest Release" get_url: url: https://github.com/helm/helm/releases/latest - dest: "{{ ansible_user_dir }}/Downloads/helm/" - owner: "{{ ansible_user_id }}" - group: "{{ ansible_user_gid }}" + dest: "/usr/local/bin/helm" + owner: root + group: root mode: 0755 From f6f1447bca37f05e878284b030ec5ad06b2d1d1b Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 5 Dec 2023 10:44:35 -0500 Subject: [PATCH 24/98] Add initial helm repo setup --- deploy/ansible/roles/helm_install/tasks/main.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deploy/ansible/roles/helm_install/tasks/main.yml b/deploy/ansible/roles/helm_install/tasks/main.yml index 54f7925a26..74ef4e1bb9 100644 --- a/deploy/ansible/roles/helm_install/tasks/main.yml +++ b/deploy/ansible/roles/helm_install/tasks/main.yml @@ -6,3 +6,9 @@ owner: root group: root mode: 0755 + +- name: "Add stable charts" + command: helm repo install stable https://charts.helm.sh/stable + +- name: "Add bitnami charts" + command: helm repo install bitnami https://charts.bitnami.com/bitnami From 76b1b1ff8bde35e7831e5ae5765719fb504140e5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 5 Dec 2023 13:17:46 -0500 Subject: [PATCH 25/98] Update helm_install role --- .../roles/helm_install/defaults/main.yml | 2 ++ .../ansible/roles/helm_install/tasks/main.yml | 26 +++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 deploy/ansible/roles/helm_install/defaults/main.yml diff --git a/deploy/ansible/roles/helm_install/defaults/main.yml b/deploy/ansible/roles/helm_install/defaults/main.yml new file mode 100644 index 0000000000..e0619b70cd --- /dev/null +++ b/deploy/ansible/roles/helm_install/defaults/main.yml @@ -0,0 +1,2 @@ +--- +helm_version: v3.13.2 diff --git a/deploy/ansible/roles/helm_install/tasks/main.yml b/deploy/ansible/roles/helm_install/tasks/main.yml index 74ef4e1bb9..fa8b0e612c 100644 --- a/deploy/ansible/roles/helm_install/tasks/main.yml +++ b/deploy/ansible/roles/helm_install/tasks/main.yml @@ -1,8 +1,30 @@ --- +- name: "Create working directory" + file: + path: /opt/helm-{{ helm_version }} + state: directory + owner: root + group: root + mode: 0755 + - name: "Get Latest Release" get_url: - url: https://github.com/helm/helm/releases/latest - dest: "/usr/local/bin/helm" + url: "https://get.helm.sh/helm-{{ helm_version }}-linux-arm64.tar.gz" + dest: /opt/helm-{{ helm_version }}/helm.tar.gz + owner: root + group: root + mode: 0755 + +- name: "Unpack helm tarball" + command: tar -zxvf /tmp/helm-{{ helm_version }}/helm.tar.gz + chdir: /opt/helm-{{ helm_version }} + creates: /opt/helm-{{ helm_version }}/linux-arm64/helm + +- name: "Link to extracted helm file" + file: + src: /opt/helm-{{ helm_version }}/linux-arm64/helm + path: /usr/local/bin/helm + state: link owner: root group: root mode: 0755 From 9c8f6ae8968203552273660fa181a7f68c7427d4 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 5 Dec 2023 13:25:15 -0500 Subject: [PATCH 26/98] Fix unpacking of helm command --- deploy/ansible/roles/helm_install/tasks/main.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/deploy/ansible/roles/helm_install/tasks/main.yml b/deploy/ansible/roles/helm_install/tasks/main.yml index fa8b0e612c..20ce8a2652 100644 --- a/deploy/ansible/roles/helm_install/tasks/main.yml +++ b/deploy/ansible/roles/helm_install/tasks/main.yml @@ -16,8 +16,9 @@ mode: 0755 - name: "Unpack helm tarball" - command: tar -zxvf /tmp/helm-{{ helm_version }}/helm.tar.gz - chdir: /opt/helm-{{ helm_version }} + command: + cmd: "tar -zxvf /opt/helm-{{ helm_version }}/helm.tar.gz" + chdir: "/opt/helm-{{ helm_version }}" creates: /opt/helm-{{ helm_version }}/linux-arm64/helm - name: "Link to extracted helm file" From 09e66d6570dbd9ee0e9d0dc24a91799eed9d2575 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 5 Dec 2023 13:40:41 -0500 Subject: [PATCH 27/98] Fix target architecture --- deploy/ansible/roles/helm_install/tasks/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/ansible/roles/helm_install/tasks/main.yml b/deploy/ansible/roles/helm_install/tasks/main.yml index 20ce8a2652..d5e3b5622e 100644 --- a/deploy/ansible/roles/helm_install/tasks/main.yml +++ b/deploy/ansible/roles/helm_install/tasks/main.yml @@ -9,7 +9,7 @@ - name: "Get Latest Release" get_url: - url: "https://get.helm.sh/helm-{{ helm_version }}-linux-arm64.tar.gz" + url: "https://get.helm.sh/helm-{{ helm_version }}-linux-amd64.tar.gz" dest: /opt/helm-{{ helm_version }}/helm.tar.gz owner: root group: root @@ -19,11 +19,11 @@ command: cmd: "tar -zxvf /opt/helm-{{ helm_version }}/helm.tar.gz" chdir: "/opt/helm-{{ helm_version }}" - creates: /opt/helm-{{ helm_version }}/linux-arm64/helm + creates: /opt/helm-{{ helm_version }}/linux-amd64/helm - name: "Link to extracted helm file" file: - src: /opt/helm-{{ helm_version }}/linux-arm64/helm + src: /opt/helm-{{ helm_version }}/linux-amd64/helm path: /usr/local/bin/helm state: link owner: root From 5ee202d967e28dafc68972bce43e472e5103c917 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 5 Dec 2023 14:32:53 -0500 Subject: [PATCH 28/98] Fix helm installation --- .../roles/helm_install/defaults/main.yml | 3 ++ .../ansible/roles/helm_install/tasks/main.yml | 42 ++++++++++++------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/deploy/ansible/roles/helm_install/defaults/main.yml b/deploy/ansible/roles/helm_install/defaults/main.yml index e0619b70cd..5e6d43b831 100644 --- a/deploy/ansible/roles/helm_install/defaults/main.yml +++ b/deploy/ansible/roles/helm_install/defaults/main.yml @@ -1,2 +1,5 @@ --- helm_version: v3.13.2 +helm_arch: linux-amd64 + +helm_download_dir: /opt/helm-{{ helm_version }}-{{ helm_arch }} diff --git a/deploy/ansible/roles/helm_install/tasks/main.yml b/deploy/ansible/roles/helm_install/tasks/main.yml index 20ce8a2652..4ad1ca1fab 100644 --- a/deploy/ansible/roles/helm_install/tasks/main.yml +++ b/deploy/ansible/roles/helm_install/tasks/main.yml @@ -1,37 +1,49 @@ --- -- name: "Create working directory" +- name: Create working directory file: - path: /opt/helm-{{ helm_version }} + path: "{{ helm_download_dir }}" state: directory owner: root group: root mode: 0755 -- name: "Get Latest Release" +- name: Ansible user + become: false + debug: + msg: "Ansible User: {{ ansible_user_id }}" + +- name: Get Latest Release get_url: - url: "https://get.helm.sh/helm-{{ helm_version }}-linux-arm64.tar.gz" - dest: /opt/helm-{{ helm_version }}/helm.tar.gz + # https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz + url: "https://get.helm.sh/helm-{{ helm_version }}-{{ helm_arch }}.tar.gz" + dest: "{{ helm_download_dir }}/helm.tar.gz" owner: root group: root mode: 0755 -- name: "Unpack helm tarball" +- name: Unpack helm tarball command: - cmd: "tar -zxvf /opt/helm-{{ helm_version }}/helm.tar.gz" - chdir: "/opt/helm-{{ helm_version }}" - creates: /opt/helm-{{ helm_version }}/linux-arm64/helm + cmd: "tar -zxvf {{ helm_download_dir }}/helm.tar.gz" + chdir: "{{ helm_download_dir }}" + creates: "{{ helm_download_dir }}/{{ helm_arch }}/helm" -- name: "Link to extracted helm file" +- name: Link to extracted helm file file: - src: /opt/helm-{{ helm_version }}/linux-arm64/helm + src: "{{ helm_download_dir }}/{{ helm_arch }}/helm" path: /usr/local/bin/helm state: link owner: root group: root mode: 0755 -- name: "Add stable charts" - command: helm repo install stable https://charts.helm.sh/stable +############################################# +# These chart repos get setup for root +# Add the commands to the general installation +# script +- name: Add stable charts + command: + cmd: helm repo add stable https://charts.helm.sh/stable -- name: "Add bitnami charts" - command: helm repo install bitnami https://charts.bitnami.com/bitnami +- name: Add bitnami charts + command: + cmd: helm repo add bitnami https://charts.bitnami.com/bitnami From 083b0af44e2c03ca1768f9566ff30b476ed1bf8c Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 7 Dec 2023 14:10:46 -0500 Subject: [PATCH 29/98] Setup makeself to build installation self-extractor --- .gitignore | 4 ++++ deploy/scripts/install-combine | 24 ++++++++++++++++++++++++ installer/make-combine-installer.sh | 3 +++ 3 files changed, 31 insertions(+) create mode 100755 deploy/scripts/install-combine create mode 100755 installer/make-combine-installer.sh diff --git a/.gitignore b/.gitignore index c17a3a9fa8..7e4b530994 100644 --- a/.gitignore +++ b/.gitignore @@ -84,6 +84,10 @@ src/resources/dictionaries/*.txt deploy/scripts/semantic_domains/json/*.json database/semantic_domains/* +# Combine installer +installer/makeself-* +installer/combine-installer.run + # Kubernetes Configuration files **/site_files/ **/charts/*.tgz diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine new file mode 100755 index 0000000000..5655e63b2c --- /dev/null +++ b/deploy/scripts/install-combine @@ -0,0 +1,24 @@ +#! /usr/bin/env bash + +##### +# Install required packages +sudo apt install -y python3-pip python3-venv +##### +# Setup Python virtual environment +python3 -m venv venv +source venv/bin/activate +python -m pip install --upgrade pip pip-tools +python -m piptools sync requirements.txt + +##### +# Setup Kubernetes environment and WiFi Access Point +echo "Setting up the software environment and WiFi Access Point" +echo "used by The Combine. At the" +echo "" +echo "BECOME: " +echo "" +echo "prompt, enter your password to allow the script to perform" +echo "administrative setup tasks." + +cd ansible +ansible-playbook playbook_desktop_setup.yaml -K diff --git a/installer/make-combine-installer.sh b/installer/make-combine-installer.sh new file mode 100755 index 0000000000..d5c7938338 --- /dev/null +++ b/installer/make-combine-installer.sh @@ -0,0 +1,3 @@ +#! /usr/bin/env bash + +makeself --tar-quietly ../deploy ./combine-installer.run "Combine Installer" scripts/install-combine From 7d3fe5b7d913b03f79bcb98bbb29787deedeb968 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 22 Jan 2024 09:45:38 -0500 Subject: [PATCH 30/98] Add combinectl command to installation --- deploy/ansible/group_vars/nuc/main.yml | 8 +- deploy/ansible/group_vars/server/main.yml | 8 +- deploy/ansible/host_vars/localhost/main.yml | 12 ++- .../roles/support_tools/defaults/main.yml | 3 + .../roles/support_tools/files/combinectl | 73 +++++++++++++++++++ .../roles/support_tools/tasks/main.yml | 11 +++ 6 files changed, 109 insertions(+), 6 deletions(-) create mode 100755 deploy/ansible/roles/support_tools/files/combinectl diff --git a/deploy/ansible/group_vars/nuc/main.yml b/deploy/ansible/group_vars/nuc/main.yml index ca4d5eeebc..1c85395b17 100644 --- a/deploy/ansible/group_vars/nuc/main.yml +++ b/deploy/ansible/group_vars/nuc/main.yml @@ -23,7 +23,13 @@ k8s_user: sillsdev ################################################ # Helm Installation ################################################ -install_helm: false +install_helm: no + +################################################ +# Support Tool Settings +################################################ +install_ip_viewer: yes +install_combinectl: yes ####################################### # Ingress configuration diff --git a/deploy/ansible/group_vars/server/main.yml b/deploy/ansible/group_vars/server/main.yml index 7569fd8e52..8bc8a5189f 100644 --- a/deploy/ansible/group_vars/server/main.yml +++ b/deploy/ansible/group_vars/server/main.yml @@ -22,7 +22,13 @@ app_namespace: thecombine ################################################ # Helm Installation ################################################ -install_helm: false +install_helm: no + +################################################ +# Support Tool Settings +################################################ +install_ip_viewer: no +install_combinectl: no ####################################### # Ingress configuration diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index 2f9d3376a1..80076b260e 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -1,8 +1,6 @@ --- ################################################# -# Group specific configuration items -# -# Group: nuc +# Host specific configuration items for localhost ################################################ ################################################ @@ -23,7 +21,13 @@ k8s_user: "{{ ansible_user_id }}" ################################################ # Helm Installation ################################################ -install_helm: true +install_helm: yes + +################################################ +# Support Tool Settings +################################################ +install_ip_viewer: no +install_combinectl: yes ####################################### # Ingress configuration diff --git a/deploy/ansible/roles/support_tools/defaults/main.yml b/deploy/ansible/roles/support_tools/defaults/main.yml index 5a7ed314dc..030da5ade0 100644 --- a/deploy/ansible/roles/support_tools/defaults/main.yml +++ b/deploy/ansible/roles/support_tools/defaults/main.yml @@ -1,3 +1,6 @@ --- eth_update_period: 5s eth_update_program: /usr/local/bin/display-eth-addr + +install_ip_viewer: no +install_combinectl: no diff --git a/deploy/ansible/roles/support_tools/files/combinectl b/deploy/ansible/roles/support_tools/files/combinectl new file mode 100755 index 0000000000..44befbfa0f --- /dev/null +++ b/deploy/ansible/roles/support_tools/files/combinectl @@ -0,0 +1,73 @@ +#! /usr/bin/env bash + +usage() { + cat < Date: Mon, 22 Jan 2024 09:46:11 -0500 Subject: [PATCH 31/98] Add desktop install target --- deploy/scripts/setup_files/combine_config.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/deploy/scripts/setup_files/combine_config.yaml b/deploy/scripts/setup_files/combine_config.yaml index 4e8384fd55..5adfff5e3a 100644 --- a/deploy/scripts/setup_files/combine_config.yaml +++ b/deploy/scripts/setup_files/combine_config.yaml @@ -18,6 +18,14 @@ targets: thecombine: global: serverName: thecombine.localhost + desktop: + profile: nuc + env_vars_required: false + override: + # override values for 'thecombine' chart + thecombine: + global: + serverName: local.thecombine.app nuc1: profile: nuc env_vars_required: false @@ -99,6 +107,9 @@ profiles: dev: # Profile for local development machines charts: - thecombine + desktop: # Profile for installing The Combine on Ubuntu Desktop (or derivative). + charts: + - thecombine nuc: # Profile for a NUC or a machine whose TLS certificate will be created by another # system and is downloaded from AWS S3 # Container images must be stored in AWS ECR Public repositories From 9b3f94ed69cdd202406f3e1efc3dc41ecf0e8bec Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 22 Jan 2024 09:46:45 -0500 Subject: [PATCH 32/98] Improve password prompts --- deploy/scripts/install-combine | 41 +++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index 5655e63b2c..ea86a4d7be 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -1,5 +1,24 @@ #! /usr/bin/env bash +##### +# Let the user know what to expect +cat <<.EOM +Setting up the software environment and WiFi Access Point +used by The Combine. You will be prompted for your password twice to allow +the script to setup system services. One prompt will look like: + +[sudo] password for xxxx: + +where xxxx is your user name. + +Afterwards, you will see a + +BECOME password: + +prompt, enter your password here as well. +.EOM + + ##### # Install required packages sudo apt install -y python3-pip python3-venv @@ -12,13 +31,19 @@ python -m piptools sync requirements.txt ##### # Setup Kubernetes environment and WiFi Access Point -echo "Setting up the software environment and WiFi Access Point" -echo "used by The Combine. At the" -echo "" -echo "BECOME: " -echo "" -echo "prompt, enter your password to allow the script to perform" -echo "administrative setup tasks." - cd ansible ansible-playbook playbook_desktop_setup.yaml -K +cd ../scripts + +##### +# Install base helm charts +helm repo add stable https://charts.helm.sh/stable +helm repo add bitnami https://charts.bitnami.com/bitnami + +##### +# Setup required cluster services +./setup_cluster.py + +##### +# Setup The Combine +./setup_combine.py --tag v1.1.6 --repo public.ecr.aws/thecombine --target desktop From 3bd61b714a285584c161623a20ae19cfce2dd678 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 19:55:29 -0500 Subject: [PATCH 33/98] Rename "docker_install" role to "container_engine" --- deploy/ansible/playbook_desktop_setup.yaml | 4 ++++ deploy/ansible/playbook_nuc_setup.yaml | 4 ++-- deploy/ansible/roles/container_engine/defaults/main.yml | 3 +++ .../{docker_install => container_engine}/tasks/main.yml | 4 +--- deploy/ansible/roles/docker_install/defaults/main.yml | 6 ------ deploy/ansible/roles/docker_install/handlers/main.yml | 3 --- 6 files changed, 10 insertions(+), 14 deletions(-) create mode 100644 deploy/ansible/roles/container_engine/defaults/main.yml rename deploy/ansible/roles/{docker_install => container_engine}/tasks/main.yml (94%) delete mode 100644 deploy/ansible/roles/docker_install/defaults/main.yml delete mode 100644 deploy/ansible/roles/docker_install/handlers/main.yml diff --git a/deploy/ansible/playbook_desktop_setup.yaml b/deploy/ansible/playbook_desktop_setup.yaml index 1ef8c4384a..963ab55812 100644 --- a/deploy/ansible/playbook_desktop_setup.yaml +++ b/deploy/ansible/playbook_desktop_setup.yaml @@ -37,6 +37,10 @@ import_role: name: network_config + - name: Install Container Engine + import_role: + name: container_engine + - name: Install Kubernetes import_role: name: k8s_install diff --git a/deploy/ansible/playbook_nuc_setup.yaml b/deploy/ansible/playbook_nuc_setup.yaml index 573f432965..61bc9422ae 100644 --- a/deploy/ansible/playbook_nuc_setup.yaml +++ b/deploy/ansible/playbook_nuc_setup.yaml @@ -37,9 +37,9 @@ import_role: name: network_config - - name: Install Docker Subsystem + - name: Install Container Engine import_role: - name: docker_install + name: container_engine - name: Install Kubernetes Tools import_role: diff --git a/deploy/ansible/roles/container_engine/defaults/main.yml b/deploy/ansible/roles/container_engine/defaults/main.yml new file mode 100644 index 0000000000..802a83f543 --- /dev/null +++ b/deploy/ansible/roles/container_engine/defaults/main.yml @@ -0,0 +1,3 @@ +--- +container_packages: + - containerd.io diff --git a/deploy/ansible/roles/docker_install/tasks/main.yml b/deploy/ansible/roles/container_engine/tasks/main.yml similarity index 94% rename from deploy/ansible/roles/docker_install/tasks/main.yml rename to deploy/ansible/roles/container_engine/tasks/main.yml index a4fcc6d2f3..03d4d99dc6 100644 --- a/deploy/ansible/roles/docker_install/tasks/main.yml +++ b/deploy/ansible/roles/container_engine/tasks/main.yml @@ -27,7 +27,6 @@ - gnupg - lsb-release state: present - notify: reboot target - name: Create keyring directory file: @@ -50,6 +49,5 @@ - name: Install Docker Packages apt: - name: "{{ docker_packages }}" + name: "{{ container_packages }}" update_cache: yes - notify: reboot target diff --git a/deploy/ansible/roles/docker_install/defaults/main.yml b/deploy/ansible/roles/docker_install/defaults/main.yml deleted file mode 100644 index bdbc2bb4a9..0000000000 --- a/deploy/ansible/roles/docker_install/defaults/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -install_credential_helper: false -credential_helper_version: v0.6.3 - -docker_packages: - - containerd.io diff --git a/deploy/ansible/roles/docker_install/handlers/main.yml b/deploy/ansible/roles/docker_install/handlers/main.yml deleted file mode 100644 index 708664f6f8..0000000000 --- a/deploy/ansible/roles/docker_install/handlers/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -- name: reboot target - reboot: From 32c88a730c1f0ecdef20d65e31bdf308a1bb77a5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 19:56:34 -0500 Subject: [PATCH 34/98] Separate hostname from DNS name for The Combine for local install --- deploy/ansible/group_vars/nuc/main.yml | 2 +- deploy/ansible/host_vars/localhost/main.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/ansible/group_vars/nuc/main.yml b/deploy/ansible/group_vars/nuc/main.yml index 2c61d03205..1c85395b17 100644 --- a/deploy/ansible/group_vars/nuc/main.yml +++ b/deploy/ansible/group_vars/nuc/main.yml @@ -40,7 +40,7 @@ ingress_namespace: ingress-nginx # The server name will direct traffic to the production # server since it is used to get the certificates for the # NUC. -public_dns_name: "{{ ansible_hostname }}" +k8s_dns_name: "{{ ansible_hostname }}" ################################################ # Ethernet settings diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index 80076b260e..668bdc9f11 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -38,7 +38,7 @@ ingress_namespace: ingress-nginx # The server name will direct traffic to the production # server since it is used to get the certificates for the # NUC. -k8s_dns_name: "{{ ansible_hostname }}" +k8s_dns_name: "local" ################################################ # Ethernet settings @@ -53,7 +53,7 @@ ap_domain: thecombine.app ap_ssid: "{{ansible_hostname}}_ap" ap_passphrase: "Combine2020" ap_gateway: "10.10.10.1" -ap_hostname: "{{ansible_hostname}}" +ap_hostname: "local" ################################################ # hardware monitoring settings From db2939a2fdfbd209f597a51a224a8433199f7b7d Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 19:58:37 -0500 Subject: [PATCH 35/98] Update script to install the combine --- deploy/scripts/install-combine | 88 ++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index ea86a4d7be..8b9175868e 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -1,5 +1,43 @@ #! /usr/bin/env bash +function get-password () { + PASS1="foo" + PASS2="bar" + while [ "$PASS1" != "$PASS2" ] ; do + read -s -p "$1"$'\n' PASS1 + read -s -p "Confirm password:"$'\n' PASS2 + done + echo "$PASS1" +} + +function set-combine-env () { + CONFIG_DIR=${HOME}/.config/combine + echo "CONFIG_DIR == ${CONFIG_DIR}" + if [ ! -d "${CONFIG_DIR}" ] ; then + echo "Creating ${CONFIG_DIR}" + mkdir -p ${CONFIG_DIR} + fi + if [ ! -f "${CONFIG_DIR}/env" ] ; then + # Collect values from user + COMBINE_JWT_SECRET_KEY=`LC_ALL=C tr -dc 'A-Za-z0-9*\-_@!' ${CONFIG_DIR}/env + export COMBINE_JWT_SECRET_KEY="${COMBINE_JWT_SECRET_KEY}" + export COMBINE_ADMIN_PASSWORD="${COMBINE_ADMIN_PASSWORD}" + export COMBINE_ADMIN_USERNAME="${COMBINE_ADMIN_USERNAME}" + export AWS_DEFAULT_REGION="us-east-1" + export AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" + export AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" + export COMBINE_SMTP_USERNAME="nobody" +.EOF + fi + source ${CONFIG_DIR}/env +} + ##### # Let the user know what to expect cat <<.EOM @@ -20,10 +58,13 @@ prompt, enter your password here as well. ##### +# Mark our place +INSTALL_DIR=`pwd` # Install required packages sudo apt install -y python3-pip python3-venv + ##### -# Setup Python virtual environment +# Setup Python to run ansible python3 -m venv venv source venv/bin/activate python -m pip install --upgrade pip pip-tools @@ -31,9 +72,49 @@ python -m piptools sync requirements.txt ##### # Setup Kubernetes environment and WiFi Access Point -cd ansible +cd ${INSTALL_DIR}/ansible ansible-playbook playbook_desktop_setup.yaml -K -cd ../scripts + +if [ -f /var/run/reboot-required ]; then + cat <<.EOM + ***** Restart required ***** + + Rerun $0 after the system has been restarted. + +.EOM + read -p "Restart now? (Y/n) " RESTART + if [[ "$RESTART" =~ ^[yY] ]] ; then + sudo reboot + fi + exit 0 +fi + +##### +# Setup kubectl configuration file +K3S_CONFIG_FILE=${HOME}/.kube/config +if [ ! -e ${K3S_CONFIG_FILE} ] ; then + echo >2 "Kubernetes (k3s) configuration file is missing." + exit 1 +fi +export KUBECONFIG=${K3S_CONFIG_FILE} + +set-combine-env + +##### +# Save install scripts to allow upgrades +COMBINE_DIR=${HOME}/.combine +mkdir -p ${COMBINE_DIR} +echo "Copying files from ${INSTALL_DIR}" +cp ${INSTALL_DIR}/requirements.* ${COMBINE_DIR} +cp -r ${INSTALL_DIR}/scripts ${COMBINE_DIR} +cp -r ${INSTALL_DIR}/helm ${COMBINE_DIR} + +##### +# Copy Python virtual environment for install and upgrades +deactivate +cd ${COMBINE_DIR} +cp -r ${INSTALL_DIR}/venv ${COMBINE_DIR} +source venv/bin/activate ##### # Install base helm charts @@ -42,6 +123,7 @@ helm repo add bitnami https://charts.bitnami.com/bitnami ##### # Setup required cluster services +cd ${COMBINE_DIR}/scripts ./setup_cluster.py ##### From d233a97afff8dc9da888e08b4f5faad48fcbcddb Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 20:00:00 -0500 Subject: [PATCH 36/98] change 'public_dns_name' back to 'k8s_dns_name' --- deploy/ansible/roles/k8s_config/defaults/main.yml | 2 +- deploy/ansible/roles/k8s_config/tasks/main.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/ansible/roles/k8s_config/defaults/main.yml b/deploy/ansible/roles/k8s_config/defaults/main.yml index b51b2332a9..2b9f3d9889 100644 --- a/deploy/ansible/roles/k8s_config/defaults/main.yml +++ b/deploy/ansible/roles/k8s_config/defaults/main.yml @@ -1,4 +1,4 @@ --- # Used to setup the certificate for kubectl # Can be overridden by specific groups/hosts -public_dns_name: "{{ combine_server_name }}" +k8s_dns_name: "{{ combine_server_name }}" diff --git a/deploy/ansible/roles/k8s_config/tasks/main.yml b/deploy/ansible/roles/k8s_config/tasks/main.yml index 2587c57ade..8f0d5a0f8b 100644 --- a/deploy/ansible/roles/k8s_config/tasks/main.yml +++ b/deploy/ansible/roles/k8s_config/tasks/main.yml @@ -37,7 +37,7 @@ path: "{{ kubecfg }}" regexp: '^(\s+server: https:\/\/)[.0-9]+:(1?6443)' backrefs: yes - line: '\1{{ public_dns_name }}:\2' + line: '\1{{ k8s_dns_name }}:\2' - name: Replace 'default' cluster, user, etc with {{ kubecfgdir }} delegate_to: localhost From fec3f3f54544a45ab8887ccd13b85d5e75dc2f4a Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 20:01:28 -0500 Subject: [PATCH 37/98] Comment out test of WiFi access point (temporary) --- deploy/ansible/roles/wifi_ap/tasks/main.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy/ansible/roles/wifi_ap/tasks/main.yml b/deploy/ansible/roles/wifi_ap/tasks/main.yml index f54f9d5a0a..01299580d5 100644 --- a/deploy/ansible/roles/wifi_ap/tasks/main.yml +++ b/deploy/ansible/roles/wifi_ap/tasks/main.yml @@ -5,8 +5,8 @@ tags: - install - meta: flush_handlers -- name: Set WiFi Access point - include_tasks: - file: test.yml - tags: - - test +# - name: Test WiFi Access point +# include_tasks: +# file: test.yml +# tags: +# - test From 0167eb88c90fc1568998fed97c6cd5394aa3c9cd Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 20:02:00 -0500 Subject: [PATCH 38/98] Move install of base helm charts to installation script --- .../ansible/roles/helm_install/tasks/main.yml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/deploy/ansible/roles/helm_install/tasks/main.yml b/deploy/ansible/roles/helm_install/tasks/main.yml index 4ad1ca1fab..6956f09f06 100644 --- a/deploy/ansible/roles/helm_install/tasks/main.yml +++ b/deploy/ansible/roles/helm_install/tasks/main.yml @@ -7,11 +7,6 @@ group: root mode: 0755 -- name: Ansible user - become: false - debug: - msg: "Ansible User: {{ ansible_user_id }}" - - name: Get Latest Release get_url: # https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz @@ -35,15 +30,3 @@ owner: root group: root mode: 0755 - -############################################# -# These chart repos get setup for root -# Add the commands to the general installation -# script -- name: Add stable charts - command: - cmd: helm repo add stable https://charts.helm.sh/stable - -- name: Add bitnami charts - command: - cmd: helm repo add bitnami https://charts.bitnami.com/bitnami From 3e757b6740abe57c299c9f6cbecfcb608a0238e7 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 20:02:49 -0500 Subject: [PATCH 39/98] Make Kubeconfig file only readable to owner --- deploy/ansible/roles/k8s_install/defaults/main.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/deploy/ansible/roles/k8s_install/defaults/main.yml b/deploy/ansible/roles/k8s_install/defaults/main.yml index b5ae9cae4c..450ab1fade 100644 --- a/deploy/ansible/roles/k8s_install/defaults/main.yml +++ b/deploy/ansible/roles/k8s_install/defaults/main.yml @@ -1,7 +1,7 @@ --- # Used to setup the certificate for kubectl # Can be overridden by specific groups/hosts -public_dns_name: "{{ combine_server_name }}" +k8s_dns_name: "{{ combine_server_name }}" k8s_required_pkgs: - apt-transport-https @@ -11,9 +11,11 @@ k8s_required_pkgs: # Options for installing the k3s engine k3s_options: - --write-kubeconfig-mode - - 644 + - 600 - --disable - traefik - --tls-san - - "{{ public_dns_name }}" + - "{{ k8s_dns_name }}" + k3s_version: "v1.25.14+k3s1" +kubectl_version: "v1.29" From aeff438a59a9f399622517fe2a96507a6142c7c1 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 20:03:20 -0500 Subject: [PATCH 40/98] Update repo for installing kubectl --- .../ansible/roles/k8s_install/tasks/main.yml | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/deploy/ansible/roles/k8s_install/tasks/main.yml b/deploy/ansible/roles/k8s_install/tasks/main.yml index 19db968ab9..cfa844a943 100644 --- a/deploy/ansible/roles/k8s_install/tasks/main.yml +++ b/deploy/ansible/roles/k8s_install/tasks/main.yml @@ -9,17 +9,32 @@ file: "{{ k8s_engine }}.yml" when: k8s_engine != "none" -- name: Download the Google Cloud public signing key +- name: Create keyring directory if necessary + file: + path: /etc/apt/keyrings + state: directory + owner: root + group: root + mode: "0755" + +- name: Download the Kubernetes public signing key shell: cmd: > - curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg - | gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg - creates: /etc/apt/keyrings/kubernetes-archive-keyring.gpg + curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key + | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + creates: /etc/apt/keyrings/kubernetes-apt-keyring.gpg + +- name: Set signing key permissions + file: + name: /etc/apt/keyrings/kubernetes-apt-keyring.gpg + mode: 0644 + state: file - name: Add repository apt_repository: - repo: "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" + repo: "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" filename: kubernetes + mode: 0644 - name: Install kubectl apt: From 5345e44d0f6b117f25022fc1ec5c2ee3d4d11666 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 10 Feb 2024 20:03:42 -0500 Subject: [PATCH 41/98] Script to manage Combine installation --- .../roles/support_tools/files/combinectl | 156 +++++++++++------- 1 file changed, 97 insertions(+), 59 deletions(-) diff --git a/deploy/ansible/roles/support_tools/files/combinectl b/deploy/ansible/roles/support_tools/files/combinectl index 44befbfa0f..af737192fa 100755 --- a/deploy/ansible/roles/support_tools/files/combinectl +++ b/deploy/ansible/roles/support_tools/files/combinectl @@ -1,73 +1,111 @@ #! /usr/bin/env bash -usage() { - cat < Date: Sun, 11 Feb 2024 11:28:35 -0500 Subject: [PATCH 42/98] Improve display of status for The Combine --- deploy/ansible/roles/support_tools/files/combinectl | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/deploy/ansible/roles/support_tools/files/combinectl b/deploy/ansible/roles/support_tools/files/combinectl index af737192fa..af894af115 100755 --- a/deploy/ansible/roles/support_tools/files/combinectl +++ b/deploy/ansible/roles/support_tools/files/combinectl @@ -59,7 +59,17 @@ combine_stop () { } combine_status () { - kubectl -n thecombine get deployments + if systemctl is-active --quiet create_ap ; then + echo "WiFi hotspot is UP." + else + echo "WiFi hotspot is DOWN." + fi + if systemctl is-active --quiet k3s ; then + echo "The Combine is UP." + kubectl -n thecombine get deployments + else + echo "The Combine is DOWN." + fi } combine_cert () { From a4f5da54a62bea749230340d165b0696a4316e1a Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 13 Feb 2024 09:23:35 -0500 Subject: [PATCH 43/98] Add enabled/disabled info to combinectl status --- deploy/ansible/roles/support_tools/files/combinectl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/deploy/ansible/roles/support_tools/files/combinectl b/deploy/ansible/roles/support_tools/files/combinectl index af894af115..3cbe9f45f3 100755 --- a/deploy/ansible/roles/support_tools/files/combinectl +++ b/deploy/ansible/roles/support_tools/files/combinectl @@ -59,6 +59,11 @@ combine_stop () { } combine_status () { + if systemctl is-enabled --quiet create_ap && systemctl is-enabled --quiet k3s ; then + echo "The Combine starts automatically at boot time." + else + echo "The Combine does not start automatically." + fi if systemctl is-active --quiet create_ap ; then echo "WiFi hotspot is UP." else From d7d25deef2aea0710a99ff7c55d00b0d37d3b22b Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 13 Feb 2024 10:04:12 -0500 Subject: [PATCH 44/98] Restore conditional reboots --- .../roles/container_engine/handlers/main.yml | 5 +++++ .../ansible/roles/container_engine/tasks/main.yml | 13 ++++++++++++- .../roles/monitor_hardware/handlers/main.yml | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 deploy/ansible/roles/container_engine/handlers/main.yml diff --git a/deploy/ansible/roles/container_engine/handlers/main.yml b/deploy/ansible/roles/container_engine/handlers/main.yml new file mode 100644 index 0000000000..9183a38c29 --- /dev/null +++ b/deploy/ansible/roles/container_engine/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: reboot target + reboot: + when: ansible_connection != "local" + diff --git a/deploy/ansible/roles/container_engine/tasks/main.yml b/deploy/ansible/roles/container_engine/tasks/main.yml index 03d4d99dc6..41423f3cab 100644 --- a/deploy/ansible/roles/container_engine/tasks/main.yml +++ b/deploy/ansible/roles/container_engine/tasks/main.yml @@ -27,7 +27,7 @@ - gnupg - lsb-release state: present - + - name: Create keyring directory file: path: /etc/apt/keyrings @@ -51,3 +51,14 @@ apt: name: "{{ container_packages }}" update_cache: yes + +- name: Check if reboot is required + stat: + path: /var/run/reboot-required + register: reboot_required + +- name: Reboot + reboot: + when: + - reboot_required.stat.exists + - ansible_connection != "local diff --git a/deploy/ansible/roles/monitor_hardware/handlers/main.yml b/deploy/ansible/roles/monitor_hardware/handlers/main.yml index 62bf80bebf..5a4d679aae 100644 --- a/deploy/ansible/roles/monitor_hardware/handlers/main.yml +++ b/deploy/ansible/roles/monitor_hardware/handlers/main.yml @@ -6,8 +6,10 @@ - name: restart target reboot: + when: ansible_connection != "local" - name: restart sysstat service service: name: sysstat state: restarted + From 84e8c60cdf3300ee0eb7b71abe4ba674db96c2c8 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 14 Feb 2024 14:34:26 -0500 Subject: [PATCH 45/98] Add input arguments; resume from last install step --- deploy/scripts/install-combine | 208 ++++++++++++++++++++++----------- 1 file changed, 139 insertions(+), 69 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index 8b9175868e..0bddc10ff3 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -1,27 +1,22 @@ #! /usr/bin/env bash -function get-password () { +get-password () { PASS1="foo" PASS2="bar" while [ "$PASS1" != "$PASS2" ] ; do - read -s -p "$1"$'\n' PASS1 - read -s -p "Confirm password:"$'\n' PASS2 + read -s -p "$1 " PASS1 + read -s -p $'\n'"Confirm password: " PASS2 done echo "$PASS1" } -function set-combine-env () { - CONFIG_DIR=${HOME}/.config/combine - echo "CONFIG_DIR == ${CONFIG_DIR}" - if [ ! -d "${CONFIG_DIR}" ] ; then - echo "Creating ${CONFIG_DIR}" - mkdir -p ${CONFIG_DIR} - fi +set-combine-env () { if [ ! -f "${CONFIG_DIR}/env" ] ; then # Collect values from user COMBINE_JWT_SECRET_KEY=`LC_ALL=C tr -dc 'A-Za-z0-9*\-_@!' 2 "Kubernetes (k3s) configuration file is missing." - exit 1 -fi -export KUBECONFIG=${K3S_CONFIG_FILE} +} -set-combine-env +set-k3s-env () { + ##### + # Setup kubectl configuration file + K3S_CONFIG_FILE=${HOME}/.kube/config + if [ ! -e ${K3S_CONFIG_FILE} ] ; then + echo >2 "Kubernetes (k3s) configuration file is missing." + exit 1 + fi + export KUBECONFIG=${K3S_CONFIG_FILE} +} -##### -# Save install scripts to allow upgrades -COMBINE_DIR=${HOME}/.combine -mkdir -p ${COMBINE_DIR} -echo "Copying files from ${INSTALL_DIR}" -cp ${INSTALL_DIR}/requirements.* ${COMBINE_DIR} -cp -r ${INSTALL_DIR}/scripts ${COMBINE_DIR} -cp -r ${INSTALL_DIR}/helm ${COMBINE_DIR} +install-required-charts () { + set-k3s-env + ##### + # Install base helm charts + helm repo add stable https://charts.helm.sh/stable + helm repo add bitnami https://charts.bitnami.com/bitnami + + ##### + # Setup required cluster services + cd ${INSTALL_DIR}/scripts + ./setup_cluster.py +} -##### -# Copy Python virtual environment for install and upgrades -deactivate -cd ${COMBINE_DIR} -cp -r ${INSTALL_DIR}/venv ${COMBINE_DIR} -source venv/bin/activate +install-the-combine () { + ##### + # Setup The Combine + cd ${INSTALL_DIR}/scripts + set-combine-env + set-k3s-env + ./setup_combine.py --tag v1.1.6 --repo public.ecr.aws/thecombine --target desktop +} -##### -# Install base helm charts -helm repo add stable https://charts.helm.sh/stable -helm repo add bitnami https://charts.bitnami.com/bitnami +# Create directory for configuration files +CONFIG_DIR=${HOME}/.config/combine +echo "CONFIG_DIR == ${CONFIG_DIR}" +if [ ! -d "${CONFIG_DIR}" ] ; then + echo "Creating ${CONFIG_DIR}" + mkdir -p ${CONFIG_DIR} +fi -##### -# Setup required cluster services -cd ${COMBINE_DIR}/scripts -./setup_cluster.py +# See if we need to continue from a previous install +STATE_FILE=${HOME}/.config/combine/install-state +if [ -f ${STATE_FILE} ] ; then + STATE=`cat ${STATE_FILE}` +else + STATE=pre-reqs +fi -##### -# Setup The Combine -./setup_combine.py --tag v1.1.6 --repo public.ecr.aws/thecombine --target desktop +# Parse arguments to customize installation +while (( "$#" )) ; do + OPT=$1 + case $OPT in + --version|-v) + if [[ $# > 1 ]] ; then + $COMBINE_VERSION=$2 + shift + fi + ;; + --update|-u) + if [[ $# > 1 ]] ; then + $COMBINE_VERSION=$2 + shift + STATE=Combine + fi + ;; + --clean) + STATE=pre-reqs + if [ -f ${CONFIG_DIR}/env ] ; then + rm ${CONFIG_DIR}/env + fi + ;; + --restart) + STATE=pre-reqs + ;; + *) + echo "Unrecognized option: $OPT" >2 + ;; + esac + shift +done + +# Step through the installation stages +while [ "$STATE" != "Done" ] ; do + case $STATE in + pre-reqs) + echo `print-instructions` + install-kubernetes + copy-install-scripts + STATE=Base_charts + echo -n ${STATE} > ${STATE_FILE} + restart-install + ;; + Base_charts) + install-required-charts + STATE=Combine + echo -n ${STATE} > ${STATE_FILE} + ;; + Combine) + install-the-combine + STATE="Done" + rm ${STATE_FILE} + ;; + *) + echo "Unrecognized STATE: ${STATE}" + rm ${STATE_FILE} + exit 1 + ;; + esac +done From a348deb6f3fd9f914c37c93546d35012bdb8f733 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 14 Feb 2024 15:13:11 -0500 Subject: [PATCH 46/98] copy install scripts to local storage --- deploy/scripts/install-combine | 57 ++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index 0bddc10ff3..27d1922d19 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -36,25 +36,23 @@ set-combine-env () { ##### # Mark our place INSTALL_DIR=`pwd` - +mkdir -p ${HOME}/.combine +COMBINE_DIR=${HOME}/.combine print-instructions () { ##### # Let the user know what to expect - cat <<.EOM -Setting up the software environment and WiFi Access Point -used by The Combine. You will be prompted for your password twice to allow -the script to setup system services. One prompt will look like: - -[sudo] password for xxxx: - -where xxxx is your user name. - -Afterwards, you will see a - -BECOME password: - -prompt, enter your password here as well. -.EOM + echo "\n +Setting up the software environment and WiFi Access Point\n +used by The Combine. You will be prompted for your password twice to allow\n +the script to setup system services. One prompt will look like:\n +\n + [sudo] password for ${USER}:\n +\n +Afterwards, you will see a\n +\n + BECOME password: \n +\n +prompt, enter your password here as well." } install-kubernetes () { @@ -100,6 +98,15 @@ set-k3s-env () { export KUBECONFIG=${K3S_CONFIG_FILE} } +copy-install-scripts () { + cp -r ${INSTALL_DIR}/helm ${COMBINE_DIR} + cp -r ${INSTALL_DIR}/scripts ${COMBINE_DIR} + cp -r ${INSTALL_DIR}/venv ${COMBINE_DIR} + pushd ${COMBINE_DIR}/venv/bin > /dev/null + sed -i "s|${INSTALL_DIR}|${COMBINE_DIR}|g" * + popd > /dev/null +} + install-required-charts () { set-k3s-env ##### @@ -109,26 +116,28 @@ install-required-charts () { ##### # Setup required cluster services - cd ${INSTALL_DIR}/scripts + cd ${COMBINE_DIR} + . venv/bin/activate + cd ${COMBINE_DIR}/scripts ./setup_cluster.py + deactivate } install-the-combine () { ##### # Setup The Combine - cd ${INSTALL_DIR}/scripts + cd ${COMBINE_DIR} + . venv/bin/activate + cd ${COMBINE_DIR}/scripts set-combine-env set-k3s-env ./setup_combine.py --tag v1.1.6 --repo public.ecr.aws/thecombine --target desktop + deactivate } # Create directory for configuration files CONFIG_DIR=${HOME}/.config/combine -echo "CONFIG_DIR == ${CONFIG_DIR}" -if [ ! -d "${CONFIG_DIR}" ] ; then - echo "Creating ${CONFIG_DIR}" - mkdir -p ${CONFIG_DIR} -fi +mkdir -p ${CONFIG_DIR} # See if we need to continue from a previous install STATE_FILE=${HOME}/.config/combine/install-state @@ -175,7 +184,7 @@ done while [ "$STATE" != "Done" ] ; do case $STATE in pre-reqs) - echo `print-instructions` + echo -e `print-instructions` install-kubernetes copy-install-scripts STATE=Base_charts From fd86571c6175f82566392b802901b5146ea82467 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 16 Feb 2024 10:08:25 -0500 Subject: [PATCH 47/98] Only update server in kubeconfig when not local --- deploy/ansible/roles/k8s_config/tasks/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/deploy/ansible/roles/k8s_config/tasks/main.yml b/deploy/ansible/roles/k8s_config/tasks/main.yml index 8f0d5a0f8b..0091cdb8a1 100644 --- a/deploy/ansible/roles/k8s_config/tasks/main.yml +++ b/deploy/ansible/roles/k8s_config/tasks/main.yml @@ -38,6 +38,7 @@ regexp: '^(\s+server: https:\/\/)[.0-9]+:(1?6443)' backrefs: yes line: '\1{{ k8s_dns_name }}:\2' + when: ansible_connection != "local" - name: Replace 'default' cluster, user, etc with {{ kubecfgdir }} delegate_to: localhost From af75b1bdf6b70c6dc0e992bc874019ee75a9b8dc Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 16 Feb 2024 10:16:16 -0500 Subject: [PATCH 48/98] Build combinectl from template --- .../ansible/roles/support_tools/defaults/main.yml | 2 ++ deploy/ansible/roles/support_tools/tasks/main.yml | 13 +++++++++++-- .../{files/combinectl => templates/combinectl.sh} | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) rename deploy/ansible/roles/support_tools/{files/combinectl => templates/combinectl.sh} (98%) diff --git a/deploy/ansible/roles/support_tools/defaults/main.yml b/deploy/ansible/roles/support_tools/defaults/main.yml index 030da5ade0..1faf3d765f 100644 --- a/deploy/ansible/roles/support_tools/defaults/main.yml +++ b/deploy/ansible/roles/support_tools/defaults/main.yml @@ -4,3 +4,5 @@ eth_update_program: /usr/local/bin/display-eth-addr install_ip_viewer: no install_combinectl: no + +wifi_interfaces: "{{ ansible_facts.interfaces | select('search', '^wlp[0-9][a-z][0-9]') }}" diff --git a/deploy/ansible/roles/support_tools/tasks/main.yml b/deploy/ansible/roles/support_tools/tasks/main.yml index 71f11dd1da..774c691a1c 100644 --- a/deploy/ansible/roles/support_tools/tasks/main.yml +++ b/deploy/ansible/roles/support_tools/tasks/main.yml @@ -21,9 +21,18 @@ notify: start display eth when: install_ip_viewer +- name: Verify that there is a single WiFi interface + assert: + that: wifi_interfaces|length == 1 + success_msg: "Setup WiFi Interface: {{ wifi_interfaces[0] }}" + fail_msg: | + Only a single WiFi interface is supported. + Found the following interfaces: + {{ wifi_interfaces }} + - name: Install combinectl tool - copy: - src: combinectl + template: + src: combinectl.sh dest: /usr/local/bin/combinectl owner: root group: root diff --git a/deploy/ansible/roles/support_tools/files/combinectl b/deploy/ansible/roles/support_tools/templates/combinectl.sh similarity index 98% rename from deploy/ansible/roles/support_tools/files/combinectl rename to deploy/ansible/roles/support_tools/templates/combinectl.sh index 3cbe9f45f3..d53b9e790d 100755 --- a/deploy/ansible/roles/support_tools/files/combinectl +++ b/deploy/ansible/roles/support_tools/templates/combinectl.sh @@ -47,6 +47,7 @@ combine_start () { sudo systemctl restart systemd-resolved sudo systemctl restart systemd-networkd sudo systemctl start k3s + sudo ip link set ${WIFI_IF} up } combine_stop () { @@ -96,6 +97,7 @@ combine_update () { kubectl -n thecombine set image deployment/maintenance maintenance="public.ecr.aws/thecombine/combine_maint:$IMAGE_TAG" } +WIFI_IF={{ wifi_interfaces[0] }} export KUBECONFIG=${HOME}/.kube/config if [[ $# -eq 0 ]] ; then From c812091a3b03e2fbc111021c82de34c09000aa60 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 17 Feb 2024 07:56:31 -0500 Subject: [PATCH 49/98] Initial readme --- .../support_tools/templates/combinectl.sh | 2 +- deploy/scripts/install_README.md | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 deploy/scripts/install_README.md diff --git a/deploy/ansible/roles/support_tools/templates/combinectl.sh b/deploy/ansible/roles/support_tools/templates/combinectl.sh index d53b9e790d..a8dd449d9a 100755 --- a/deploy/ansible/roles/support_tools/templates/combinectl.sh +++ b/deploy/ansible/roles/support_tools/templates/combinectl.sh @@ -21,7 +21,7 @@ usage () { at https://github.com/sillsdev/TheCombine/releases. Note that not all releases can be updated this way. If - The Combine fails to run properly, download and run the + The Combine does not run properly, download and run the updated install package. If the command is omitted or unrecognized, this usage message is diff --git a/deploy/scripts/install_README.md b/deploy/scripts/install_README.md new file mode 100644 index 0000000000..689378fcdd --- /dev/null +++ b/deploy/scripts/install_README.md @@ -0,0 +1,19 @@ +# Installing The Combine + +## Running the script + +1. Download the installation script from + [https://s3.amazonaws.com/software.thecombine.app/combine-installer.run](https://s3.amazonaws.com/software.thecombine.app/combine-installer.run) +2. Open a terminal window (Ctrl-Alt-T) and run the script: + + ```bash + cd + ./combine-installer.run + ``` + +3. Once installation is complete, you can use the `combinectl` command to start/stop _The Combine_. Type + `combinectl --help` to get a description of the possible commands: + +```bash + +``` From 5d0454a7dbd8169686f08008d1113f9173927d73 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sat, 17 Feb 2024 07:57:14 -0500 Subject: [PATCH 50/98] Clean up prompting during install --- deploy/scripts/install-combine | 95 ++++++++++++++++++---------------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index 27d1922d19..3edd4cd687 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -12,8 +12,9 @@ get-password () { set-combine-env () { if [ ! -f "${CONFIG_DIR}/env" ] ; then - # Collect values from user + # Generate JWT Secret Key COMBINE_JWT_SECRET_KEY=`LC_ALL=C tr -dc 'A-Za-z0-9*\-_@!' /dev/null - sed -i "s|${INSTALL_DIR}|${COMBINE_DIR}|g" * - popd > /dev/null + # Update the Python virtual environment to use its new location + sed -i "s|${INSTALL_DIR}|${COMBINE_DIR}|g" ${COMBINE_DIR}/venv/bin/* } install-required-charts () { @@ -135,12 +103,31 @@ install-the-combine () { deactivate } +create-dest-directory () { + if [ -d ${COMBINE_DIR} ] ; then + echo "The installation directory already exists. ($COMBINE_DIR)" + read -p "Overwrite? (Y/n)" CONTINUE + if [[ -z $CONTINUE || "$CONTINUE" =~ ^[Yy] ]] ; then + rm -rf $COMBINE_DIR/* + else + exit 1 + fi + else + mkdir -p ${COMBINE_DIR} + fi +} + +##### +# Setup initial variables +INSTALL_DIR=`pwd` +COMBINE_DIR=${HOME}/.thecombine + # Create directory for configuration files CONFIG_DIR=${HOME}/.config/combine mkdir -p ${CONFIG_DIR} # See if we need to continue from a previous install -STATE_FILE=${HOME}/.config/combine/install-state +STATE_FILE=${CONFIG_DIR}/install-state if [ -f ${STATE_FILE} ] ; then STATE=`cat ${STATE_FILE}` else @@ -184,12 +171,32 @@ done while [ "$STATE" != "Done" ] ; do case $STATE in pre-reqs) - echo -e `print-instructions` + create-dest-directory + python-venv + ##### + # Let the user know what to expect + echo -e "\nThe next step sets up the software environment and WiFi Access Point" + echo -e "for The Combine. You will be prompted for your password with the prompt:\n" + echo -e " BECOME password: \n" install-kubernetes copy-install-scripts + STATE=Restart + echo -n ${STATE} > ${STATE_FILE} + ;; + Restart) STATE=Base_charts echo -n ${STATE} > ${STATE_FILE} - restart-install + if [ -f /var/run/reboot-required ] ; then + echo -e "***** Restart required *****\n" + echo -e "Rerun combine-installer.run after the system has been restarted.\n" + read -p "Restart now? (Y/n) " RESTART + if [[ -z $RESTART || $RESTART =~ ^[yY].* ]] ; then + sudo reboot + else + STATE=Done + echo -n ${STATE} > ${STATE_FILE} + fi + fi ;; Base_charts) install-required-charts From b0db872e9d13e2353129feb781f0f6a62bb018a5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 19 Feb 2024 15:44:09 -0500 Subject: [PATCH 51/98] Move installed file back to subfolder of home directory --- deploy/scripts/install-combine | 94 ++++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 22 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index 3edd4cd687..97adafc019 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -15,7 +15,17 @@ set-combine-env () { # Generate JWT Secret Key COMBINE_JWT_SECRET_KEY=`LC_ALL=C tr -dc 'A-Za-z0-9*\-_@!' /dev/null + combinectl status +} + create-dest-directory () { if [ -d ${COMBINE_DIR} ] ; then echo "The installation directory already exists. ($COMBINE_DIR)" @@ -120,8 +167,8 @@ create-dest-directory () { ##### # Setup initial variables INSTALL_DIR=`pwd` -COMBINE_DIR=${HOME}/.thecombine - +COMBINE_DIR=${HOME}/thecombine +COMBINE_VERSION="${COMBINE_VERSION:-v1.2.0}" # Create directory for configuration files CONFIG_DIR=${HOME}/.config/combine mkdir -p ${CONFIG_DIR} @@ -131,7 +178,7 @@ STATE_FILE=${CONFIG_DIR}/install-state if [ -f ${STATE_FILE} ] ; then STATE=`cat ${STATE_FILE}` else - STATE=pre-reqs + STATE=Pre-reqs fi # Parse arguments to customize installation @@ -148,17 +195,20 @@ while (( "$#" )) ; do if [[ $# > 1 ]] ; then $COMBINE_VERSION=$2 shift - STATE=Combine + STATE=Install-combine fi + rm ${STATE_FILE} ;; --clean) - STATE=pre-reqs + STATE=Pre-reqs + rm ${STATE_FILE} if [ -f ${CONFIG_DIR}/env ] ; then rm ${CONFIG_DIR}/env fi ;; --restart) - STATE=pre-reqs + STATE=Pre-reqs + rm ${STATE_FILE} ;; *) echo "Unrecognized option: $OPT" >2 @@ -170,21 +220,16 @@ done # Step through the installation stages while [ "$STATE" != "Done" ] ; do case $STATE in - pre-reqs) + Pre-reqs) create-dest-directory - python-venv - ##### - # Let the user know what to expect - echo -e "\nThe next step sets up the software environment and WiFi Access Point" - echo -e "for The Combine. You will be prompted for your password with the prompt:\n" - echo -e " BECOME password: \n" + create-python-venv install-kubernetes copy-install-scripts STATE=Restart echo -n ${STATE} > ${STATE_FILE} ;; Restart) - STATE=Base_charts + STATE=Base-charts echo -n ${STATE} > ${STATE_FILE} if [ -f /var/run/reboot-required ] ; then echo -e "***** Restart required *****\n" @@ -198,13 +243,18 @@ while [ "$STATE" != "Done" ] ; do fi fi ;; - Base_charts) + Base-charts) install-required-charts - STATE=Combine + STATE=Install-combine echo -n ${STATE} > ${STATE_FILE} ;; - Combine) + Install-combine) install-the-combine + STATE=Shutdown-combine + echo -n ${STATE} > ${STATE_FILE} + ;; + Shutdown-combine) + shutdown-the-combine STATE="Done" rm ${STATE_FILE} ;; From 6ce694f5d0e72356ec75fc82eaf6b9e03aa25408 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 20 Feb 2024 08:34:56 -0500 Subject: [PATCH 52/98] Remove if up/down commands; improve service status messages --- .../roles/support_tools/templates/combinectl.sh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/deploy/ansible/roles/support_tools/templates/combinectl.sh b/deploy/ansible/roles/support_tools/templates/combinectl.sh index a8dd449d9a..4247bb91bd 100755 --- a/deploy/ansible/roles/support_tools/templates/combinectl.sh +++ b/deploy/ansible/roles/support_tools/templates/combinectl.sh @@ -47,14 +47,13 @@ combine_start () { sudo systemctl restart systemd-resolved sudo systemctl restart systemd-networkd sudo systemctl start k3s - sudo ip link set ${WIFI_IF} up +# sudo ip link set ${WIFI_IF} up } combine_stop () { echo "Stopping The Combine." sudo systemctl stop k3s sudo systemctl stop create_ap - sudo ip link set vip down sudo systemctl restart systemd-resolved sudo systemctl restart systemd-networkd } @@ -66,15 +65,15 @@ combine_status () { echo "The Combine does not start automatically." fi if systemctl is-active --quiet create_ap ; then - echo "WiFi hotspot is UP." + echo "WiFi hotspot is Running." else - echo "WiFi hotspot is DOWN." + echo "WiFi hotspot is Stopped." fi if systemctl is-active --quiet k3s ; then - echo "The Combine is UP." + echo "The Combine is Running." kubectl -n thecombine get deployments else - echo "The Combine is DOWN." + echo "The Combine is Stopped." fi } From 2cca83d4bd1a631a9a64586a5e20ff59f9ea18a0 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 23 Feb 2024 11:02:17 -0500 Subject: [PATCH 53/98] Add terminal profiles to developer tools --- .../files/gnome-terminal-profiles.dconf | 182 ++++++++++++++++++ .../files/install-terminal-profiles.sh | 3 + deploy/ansible/playbook_dev_tools.yaml | 54 ++++++ 3 files changed, 239 insertions(+) create mode 100644 deploy/ansible/files/gnome-terminal-profiles.dconf create mode 100644 deploy/ansible/files/install-terminal-profiles.sh diff --git a/deploy/ansible/files/gnome-terminal-profiles.dconf b/deploy/ansible/files/gnome-terminal-profiles.dconf new file mode 100644 index 0000000000..131b20bd8b --- /dev/null +++ b/deploy/ansible/files/gnome-terminal-profiles.dconf @@ -0,0 +1,182 @@ +[/] +default='6a0f96db-55fc-473c-ab3c-5221b410ed13' +list=['27799efc-28cb-4d10-8b08-7aed7c4e154c', '1c5fcfe9-9dc4-47e4-b018-e7f70ad963cc', 'a4897f17-21ed-48c2-8244-0942611119d3', 'e5a751ab-9476-4fd4-bc99-075e21340016', '02ad3004-c8f0-403e-bc30-df4f115fdfd9', '615564e2-bab4-44ce-94f5-c9d3b9d5dc43', '811b5a85-5b34-46de-8df0-a66f78d2481b', 'c68267a0-137c-46d9-ab69-f832ef972f93', '6a0f96db-55fc-473c-ab3c-5221b410ed13', 'abab88dc-1c66-4410-a83d-f302b3ffa455'] + +[:02ad3004-c8f0-403e-bc30-df4f115fdfd9] +background-color='#000000000000' +bold-color='#ffffffffffff' +bold-color-same-as-fg=true +cursor-background-color='#ffffffffffff' +cursor-colors-set=true +cursor-foreground-color='#000000000000' +font='Monospace 14' +foreground-color='#ffffffffffff' +palette=['#000000000000', '#ffff55555555', '#5555ffff5555', '#ffffffff5555', '#55555555ffff', '#ffff5555ffff', '#5555ffffffff', '#bbbbbbbbbbbb', '#555555555555', '#ffff55555555', '#5555ffff5555', '#ffffffff5555', '#55555555ffff', '#ffff5555ffff', '#5555ffffffff', '#ffffffffffff'] +use-system-font=false +use-theme-colors=false +use-theme-transparency=false +visible-name='Dark Pastel - 14 pt' + +[:08eb7f48-be7d-4a97-b297-cf899b1d9902] +use-theme-colors=false +visible-name='Tango Dark' + +[:1c5fcfe9-9dc4-47e4-b018-e7f70ad963cc] +allow-bold=true +background-color='#000000000000' +bold-color='#ffffffffffff' +bold-color-same-as-fg=true +cursor-background-color='#ffffffffffff' +cursor-colors-set=true +cursor-foreground-color='#000000000000' +default-size-columns=120 +font='Monospace 14' +foreground-color='#ffffffffffff' +palette=['#000000000000', '#ffff55555555', '#5555ffff5555', '#ffffffff5555', '#55555555ffff', '#ffff5555ffff', '#5555ffffffff', '#bbbbbbbbbbbb', '#555555555555', '#ffff55555555', '#5555ffff5555', '#ffffffff5555', '#55555555ffff', '#ffff5555ffff', '#5555ffffffff', '#ffffffffffff'] +use-system-font=true +use-theme-background=false +use-theme-colors=false +use-theme-transparency=false +visible-name='Dark Pastel - wide' + +[:27480fc5-447a-426a-a2e3-40763d8ea62d] +background-color='rgb(253,246,227)' +foreground-color='rgb(101,123,131)' +use-theme-colors=false +visible-name='Solarized light' + +[:27799efc-28cb-4d10-8b08-7aed7c4e154c] +palette=['rgb(23,20,33)', 'rgb(192,28,40)', 'rgb(38,162,105)', 'rgb(189,182,43)', 'rgb(54,123,209)', 'rgb(163,71,186)', 'rgb(42,161,179)', 'rgb(208,207,204)', 'rgb(94,92,100)', 'rgb(246,97,81)', 'rgb(51,209,122)', 'rgb(233,173,12)', 'rgb(42,123,222)', 'rgb(192,97,203)', 'rgb(51,199,222)', 'rgb(255,255,255)'] +use-theme-colors=true +use-theme-transparency=false +visible-name='System' + +[:615564e2-bab4-44ce-94f5-c9d3b9d5dc43] +allow-bold=true +background-color='#222223232424' +bold-color='#BABABABABABA' +bold-color-same-as-fg=true +cursor-background-color='#BABABABABABA' +cursor-colors-set=true +cursor-foreground-color='#222223232424' +default-size-columns=120 +font='Monospace 14' +foreground-color='#BABABABABABA' +palette=['#000000000000', '#E8E834341C1C', '#6868C2C25656', '#F2F2D4D42C2C', '#1C1C9898E8E8', '#8E8E6969C9C9', '#1C1C9898E8E8', '#BABABABABABA', '#000000000000', '#E0E05A5A4F4F', '#7777B8B86969', '#EFEFD6D64B4B', '#38387C7CD3D3', '#95957B7BBEBE', '#3D3D9797E2E2', '#BABABABABABA'] +use-system-font=true +use-theme-background=false +use-theme-colors=false +use-theme-transparency=false +visible-name='Darkside' + +[:6a0f96db-55fc-473c-ab3c-5221b410ed13] +allow-bold=true +background-color='#29292D2D3E3E' +bold-color='#BFBFC7C7D5D5' +bold-color-same-as-fg=true +cursor-background-color='#BFBFC7C7D5D5' +cursor-colors-set=true +cursor-foreground-color='#29292D2D3E3E' +default-size-columns=120 +font='Monospace 14' +foreground-color='#BFBFC7C7D5D5' +palette=['#29292D2D3E3E', '#F0F071717878', '#6262DEDE8484', '#FFFFCBCB6B6B', '#7575A1A1FFFF', '#F5F58080FFFF', '#6060BABAECEC', '#ABABB2B2BFBF', '#95959D9DCBCB', '#F0F071717878', '#C3C3E8E88D8D', '#FFFF55557272', '#8282AAAAFFFF', '#FFFFCBCB6B6B', '#67676E6E9595', '#FFFFFEFEFEFE'] +use-system-font=true +use-theme-background=false +use-theme-colors=false +use-theme-transparency=false +visible-name='Gogh' + +[:7abf49bb-24e2-4e7a-809a-e685c36c4e67] +background-color='rgb(0,43,54)' +foreground-color='rgb(131,148,150)' +use-theme-colors=false +visible-name='Solarized dark' + +[:811b5a85-5b34-46de-8df0-a66f78d2481b] +allow-bold=true +background-color='#282828282828' +bold-color='#EBEBDBDBB2B2' +bold-color-same-as-fg=true +cursor-background-color='#EBEBDBDBB2B2' +cursor-colors-set=true +cursor-foreground-color='#282828282828' +default-size-columns=120 +font='Monospace 14' +foreground-color='#EBEBDBDBB2B2' +palette=['#282828282828', '#CCCC24241D1D', '#989897971A1A', '#D7D799992121', '#454585858888', '#B1B162628686', '#68689D9D6A6A', '#A8A899998484', '#929283837474', '#FBFB49493434', '#B8B8BBBB2626', '#FAFABDBD2F2F', '#8383A5A59898', '#D3D386869B9B', '#8E8EC0C07C7C', '#EBEBDBDBB2B2'] +use-system-font=true +use-theme-background=false +use-theme-colors=false +use-theme-transparency=false +visible-name='Gruvbox Dark' + +[:8f96488e-af2a-4614-843d-e3e22a70a1fe] +background-color='rgb(238,238,236)' +foreground-color='rgb(46,52,54)' +use-theme-colors=false +visible-name='Tango light' + +[:a4897f17-21ed-48c2-8244-0942611119d3] +allow-bold=true +background-color='#222222222222' +bold-color='#d0d0d0d0d0d0' +bold-color-same-as-fg=true +cursor-background-color='#d0d0d0d0d0d0' +cursor-colors-set=true +cursor-foreground-color='#222222222222' +foreground-color='rgb(240,240,240)' +palette=['#151515151515', '#a5a53c3c2323', '#7b7b92924646', '#d3d3a0a04d4d', '#6c6c9999bbbb', '#9f9f4e4e8585', '#7d7dd6d6cfcf', '#d0d0d0d0d0d0', '#505050505050', '#a5a53c3c2323', '#7b7b92924646', '#d3d3a0a04d4d', '#54547c7c9999', '#9f9f4e4e8585', '#7d7dd6d6cfcf', '#f5f5f5f5f5f5'] +use-theme-background=false +use-theme-colors=false +use-theme-transparency=false +visible-name='Afterglow' + +[:abab88dc-1c66-4410-a83d-f302b3ffa455] +background-color='rgb(31,34,47)' +bold-color='#BFBFC7C7D5D5' +bold-color-same-as-fg=true +cursor-background-color='#BFBFC7C7D5D5' +cursor-colors-set=true +cursor-foreground-color='#29292D2D3E3E' +default-size-columns=120 +font='Monospace 14' +foreground-color='#BFBFC7C7D5D5' +palette=['#29292D2D3E3E', '#F0F071717878', '#6262DEDE8484', '#FFFFCBCB6B6B', '#7575A1A1FFFF', '#F5F58080FFFF', '#6060BABAECEC', '#ABABB2B2BFBF', '#95959D9DCBCB', '#F0F071717878', '#C3C3E8E88D8D', '#FFFF55557272', '#8282AAAAFFFF', '#FFFFCBCB6B6B', '#67676E6E9595', '#FFFFFEFEFEFE'] +use-system-font=true +use-theme-colors=false +use-theme-transparency=false +visible-name='Gogh but a bit darker' + +[:c68267a0-137c-46d9-ab69-f832ef972f93] +allow-bold=true +background-color='#282828282828' +bold-color='#D4D4BEBE9898' +bold-color-same-as-fg=true +cursor-background-color='#D4D4BEBE9898' +cursor-colors-set=true +cursor-foreground-color='#282828282828' +default-size-columns=120 +font='Monospace 14' +foreground-color='#D4D4BEBE9898' +palette=['#3C3C38383636', '#EAEA69696262', '#A9A9B6B66565', '#D8D8A6A65757', '#7D7DAEAEA3A3', '#D3D386869B9B', '#8989B4B48282', '#D4D4BEBE9898', '#3C3C38383636', '#EAEA69696262', '#A9A9B6B66565', '#D8D8A6A65757', '#7D7DAEAEA3A3', '#D3D386869B9B', '#8989B4B48282', '#D4D4BEBE9898'] +use-system-font=true +use-theme-background=false +use-theme-colors=false +use-theme-transparency=false +visible-name='Gruvbox Material' + +[:e5a751ab-9476-4fd4-bc99-075e21340016] +allow-bold=true +background-color='#FFFFFFFFFFFF' +bold-color='#4D4D4D4D4C4C' +bold-color-same-as-fg=true +cursor-background-color='#4C4C4C4C4C4C' +cursor-colors-set=true +cursor-foreground-color='#FFFFFFFFFFFF' +foreground-color='#4D4D4D4D4C4C' +palette=['#000000000000', '#C8C828282828', '#71718C8C0000', '#EAEAB7B70000', '#41417171AEAE', '#89895959A8A8', '#3E3E99999F9F', '#FFFFFEFEFEFE', '#000000000000', '#C8C828282828', '#70708B8B0000', '#E9E9B6B60000', '#41417070AEAE', '#89895858A7A7', '#3D3D99999F9F', '#FFFFFEFEFEFE'] +use-theme-background=false +use-theme-colors=false +use-theme-transparency=false +visible-name='Tomorrow' diff --git a/deploy/ansible/files/install-terminal-profiles.sh b/deploy/ansible/files/install-terminal-profiles.sh new file mode 100644 index 0000000000..cbadc2cdcf --- /dev/null +++ b/deploy/ansible/files/install-terminal-profiles.sh @@ -0,0 +1,3 @@ +#! /usr/bin/env bash + +dconf load /org/gnome/terminal/legacy/profiles:/ < ${HOME}/.config/user-terminal-prefs/gnome-terminal-profiles.dconf diff --git a/deploy/ansible/playbook_dev_tools.yaml b/deploy/ansible/playbook_dev_tools.yaml index d0d916fe2f..f1246ed905 100644 --- a/deploy/ansible/playbook_dev_tools.yaml +++ b/deploy/ansible/playbook_dev_tools.yaml @@ -12,6 +12,8 @@ vars: developer: "{{ k8s_user | default('none') }}" + developer_group: "{{ k8s_group | default('none') }}" + tasks: - name: Update cache and upgrade existing packages apt: @@ -33,3 +35,55 @@ group: root mode: 0440 when: developer != 'none' + + - name: Print ansible_user + debug: + msg: "ansible_user: {{ ansible_facts.ansible_user }}" + + - name: Get home directory for {{ developer }} + shell: > + getent passwd {{ developer }} | awk -F: '{ print $6 }' + register: developer_home + changed_when: false + when: developer != 'none' + + - name: Print home directory + debug: + msg: "Developer home directory is: {{ developer_home.stdout }}" + when: developer != 'none' + + - name: Create directory for terminal profiles + file: + state: directory + path: "{{ developer_home.stdout }}/.config/user-terminal-prefs" + owner: "{{ developer }}" + group: "{{ developer_group }}" + mode: 0755 + when: developer != 'none' + + - name: Copy gnome-terminal profiles + copy: + src: gnome-terminal-profiles.dconf + dest: "{{ developer_home.stdout }}/.config/user-terminal-prefs/gnome-terminal-profiles.dconf" + owner: "{{ developer }}" + group: "{{ developer_group }}" + mode: 0644 + when: + - developer != 'none' + - developer_group != 'none' + + - name: Create ~/.local/bin + file: + state: directory + path: "{{ developer_home.stdout }}/.local/bin" + mode: 0755 + when: developer != 'none' + + - name: Copy script to install terminal profiles + copy: + src: install-terminal-profiles.sh + dest: "{{ developer_home.stdout }}/.local/bin/install-terminal-profiles" + owner: "{{ developer }}" + group: "{{ developer_group }}" + mode: 0755 + when: developer != 'none' From 074df358630b75b39ece39cb412a835d0c23d8db Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 23 Feb 2024 11:03:56 -0500 Subject: [PATCH 54/98] Specify natwork management tool --- deploy/ansible/group_vars/nuc/main.yml | 8 ++++++++ deploy/ansible/group_vars/server/main.yml | 8 ++++++++ deploy/ansible/host_vars/localhost/main.yml | 8 ++++++++ deploy/ansible/roles/network_config/defaults/main.yaml | 8 ++++++++ 4 files changed, 32 insertions(+) diff --git a/deploy/ansible/group_vars/nuc/main.yml b/deploy/ansible/group_vars/nuc/main.yml index 1c85395b17..baef8b9600 100644 --- a/deploy/ansible/group_vars/nuc/main.yml +++ b/deploy/ansible/group_vars/nuc/main.yml @@ -5,6 +5,14 @@ # Group: nuc ################################################ +################################################ +# Configure Network Service +# systemd-networkd is normally used in server installations, where the network environment is fairly static. +# network-manager is normally used in desktop installations. It is easier to use in environments where network +# requirements can change frequently. +################################################ +network_service: systemd-networkd + ################################################ # Configure Kubernetes cluster ################################################ diff --git a/deploy/ansible/group_vars/server/main.yml b/deploy/ansible/group_vars/server/main.yml index 8bc8a5189f..aec1126717 100644 --- a/deploy/ansible/group_vars/server/main.yml +++ b/deploy/ansible/group_vars/server/main.yml @@ -5,6 +5,14 @@ # Group: server ################################################ +################################################ +# Configure Network Service +# systemd-networkd is normally used in server installations, where the network environment is fairly static. +# network-manager is normally used in desktop installations. It is easier to use in environments where network +# requirements can change frequently. +################################################ +network_service: systemd-networkd + ################################################ # Configure Kubernetes cluster ################################################ diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index 668bdc9f11..e574f00924 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -3,6 +3,14 @@ # Host specific configuration items for localhost ################################################ +################################################ +# Configure Network Service +# systemd-networkd is normally used in server installations, where the network environment is fairly static. +# network-manager is normally used in desktop installations. It is easier to use in environments where network +# requirements can change frequently. +################################################ +network_service: network-manager + ################################################ # Configure Kubernetes cluster ################################################ diff --git a/deploy/ansible/roles/network_config/defaults/main.yaml b/deploy/ansible/roles/network_config/defaults/main.yaml index 5b01a024e8..5d5fe3143b 100644 --- a/deploy/ansible/roles/network_config/defaults/main.yaml +++ b/deploy/ansible/roles/network_config/defaults/main.yaml @@ -2,6 +2,14 @@ eth_optional: no eth_if_pattern: "en[a-z][0-9]" +################################################ +# Configure Network Service +# systemd-networkd is normally used in server installations, where the network environment is fairly static. +# network-manager is normally used in desktop installations. It is easier to use in environments where network +# requirements can change frequently. +################################################ +network_service: systemd-networkd + ############################### # virtual_if device # This is needed when k3s is running on a target that From 63586aaab9dea6fb9d4617b8e608748d3b51ebb6 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 23 Feb 2024 11:04:21 -0500 Subject: [PATCH 55/98] Add KUBECONFIG to user profile --- deploy/ansible/roles/k8s_config/handlers/main.yml | 8 ++++++++ deploy/ansible/roles/k8s_config/tasks/main.yml | 1 + 2 files changed, 9 insertions(+) create mode 100644 deploy/ansible/roles/k8s_config/handlers/main.yml diff --git a/deploy/ansible/roles/k8s_config/handlers/main.yml b/deploy/ansible/roles/k8s_config/handlers/main.yml new file mode 100644 index 0000000000..b551f844ab --- /dev/null +++ b/deploy/ansible/roles/k8s_config/handlers/main.yml @@ -0,0 +1,8 @@ +--- +- name: update profile + lineinfile: + state: present + path: "{{ k8s_user_home }}/.profile" + line: "export KUBECONFIG={{ lookup('env', 'HOME') }}/.kube/config" + mode: 0600 + when: ansible_connection == "local" diff --git a/deploy/ansible/roles/k8s_config/tasks/main.yml b/deploy/ansible/roles/k8s_config/tasks/main.yml index 0091cdb8a1..0bf52afb50 100644 --- a/deploy/ansible/roles/k8s_config/tasks/main.yml +++ b/deploy/ansible/roles/k8s_config/tasks/main.yml @@ -39,6 +39,7 @@ backrefs: yes line: '\1{{ k8s_dns_name }}:\2' when: ansible_connection != "local" + notify: update profile - name: Replace 'default' cluster, user, etc with {{ kubecfgdir }} delegate_to: localhost From acce5d500d02352cfcd5058b2999cfed04711ac6 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 23 Feb 2024 11:29:04 -0500 Subject: [PATCH 56/98] Fix missing " --- deploy/ansible/roles/container_engine/tasks/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/ansible/roles/container_engine/tasks/main.yml b/deploy/ansible/roles/container_engine/tasks/main.yml index 41423f3cab..e7da448d08 100644 --- a/deploy/ansible/roles/container_engine/tasks/main.yml +++ b/deploy/ansible/roles/container_engine/tasks/main.yml @@ -27,7 +27,7 @@ - gnupg - lsb-release state: present - + - name: Create keyring directory file: path: /etc/apt/keyrings @@ -51,7 +51,7 @@ apt: name: "{{ container_packages }}" update_cache: yes - + - name: Check if reboot is required stat: path: /var/run/reboot-required @@ -61,4 +61,4 @@ reboot: when: - reboot_required.stat.exists - - ansible_connection != "local + - ansible_connection != "local" From 4c4bf8f31bf188d07808523040d455e1917ddd9a Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 28 Feb 2024 10:35:39 -0500 Subject: [PATCH 57/98] Ansible code cleanup --- deploy/ansible/group_vars/nuc/main.yml | 8 -------- deploy/ansible/group_vars/server/main.yml | 8 -------- deploy/ansible/host_vars/localhost/main.yml | 10 +--------- deploy/ansible/playbook_dev_tools.yaml | 4 ---- deploy/ansible/roles/network_config/defaults/main.yaml | 8 -------- 5 files changed, 1 insertion(+), 37 deletions(-) diff --git a/deploy/ansible/group_vars/nuc/main.yml b/deploy/ansible/group_vars/nuc/main.yml index baef8b9600..1c85395b17 100644 --- a/deploy/ansible/group_vars/nuc/main.yml +++ b/deploy/ansible/group_vars/nuc/main.yml @@ -5,14 +5,6 @@ # Group: nuc ################################################ -################################################ -# Configure Network Service -# systemd-networkd is normally used in server installations, where the network environment is fairly static. -# network-manager is normally used in desktop installations. It is easier to use in environments where network -# requirements can change frequently. -################################################ -network_service: systemd-networkd - ################################################ # Configure Kubernetes cluster ################################################ diff --git a/deploy/ansible/group_vars/server/main.yml b/deploy/ansible/group_vars/server/main.yml index aec1126717..8bc8a5189f 100644 --- a/deploy/ansible/group_vars/server/main.yml +++ b/deploy/ansible/group_vars/server/main.yml @@ -5,14 +5,6 @@ # Group: server ################################################ -################################################ -# Configure Network Service -# systemd-networkd is normally used in server installations, where the network environment is fairly static. -# network-manager is normally used in desktop installations. It is easier to use in environments where network -# requirements can change frequently. -################################################ -network_service: systemd-networkd - ################################################ # Configure Kubernetes cluster ################################################ diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index e574f00924..faabde0d7f 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -3,14 +3,6 @@ # Host specific configuration items for localhost ################################################ -################################################ -# Configure Network Service -# systemd-networkd is normally used in server installations, where the network environment is fairly static. -# network-manager is normally used in desktop installations. It is easier to use in environments where network -# requirements can change frequently. -################################################ -network_service: network-manager - ################################################ # Configure Kubernetes cluster ################################################ @@ -34,7 +26,7 @@ install_helm: yes ################################################ # Support Tool Settings ################################################ -install_ip_viewer: no +install_ip_viewer: yes install_combinectl: yes ####################################### diff --git a/deploy/ansible/playbook_dev_tools.yaml b/deploy/ansible/playbook_dev_tools.yaml index f1246ed905..b30cde1a16 100644 --- a/deploy/ansible/playbook_dev_tools.yaml +++ b/deploy/ansible/playbook_dev_tools.yaml @@ -36,10 +36,6 @@ mode: 0440 when: developer != 'none' - - name: Print ansible_user - debug: - msg: "ansible_user: {{ ansible_facts.ansible_user }}" - - name: Get home directory for {{ developer }} shell: > getent passwd {{ developer }} | awk -F: '{ print $6 }' diff --git a/deploy/ansible/roles/network_config/defaults/main.yaml b/deploy/ansible/roles/network_config/defaults/main.yaml index 5d5fe3143b..5b01a024e8 100644 --- a/deploy/ansible/roles/network_config/defaults/main.yaml +++ b/deploy/ansible/roles/network_config/defaults/main.yaml @@ -2,14 +2,6 @@ eth_optional: no eth_if_pattern: "en[a-z][0-9]" -################################################ -# Configure Network Service -# systemd-networkd is normally used in server installations, where the network environment is fairly static. -# network-manager is normally used in desktop installations. It is easier to use in environments where network -# requirements can change frequently. -################################################ -network_service: systemd-networkd - ############################### # virtual_if device # This is needed when k3s is running on a target that From 5992dd57511035d9e94aa9c17c9025c3707684b5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 28 Feb 2024 10:36:54 -0500 Subject: [PATCH 58/98] Migrate from netplan to network-manager --- .../files/01-network-manager-all.yaml | 4 + .../roles/network_config/tasks/main.yml | 83 +++++++++++-------- 2 files changed, 53 insertions(+), 34 deletions(-) create mode 100644 deploy/ansible/roles/network_config/files/01-network-manager-all.yaml diff --git a/deploy/ansible/roles/network_config/files/01-network-manager-all.yaml b/deploy/ansible/roles/network_config/files/01-network-manager-all.yaml new file mode 100644 index 0000000000..4a8fd08590 --- /dev/null +++ b/deploy/ansible/roles/network_config/files/01-network-manager-all.yaml @@ -0,0 +1,4 @@ +# Let NetworkManager manage all devices on this system +network: + version: 2 + renderer: NetworkManager diff --git a/deploy/ansible/roles/network_config/tasks/main.yml b/deploy/ansible/roles/network_config/tasks/main.yml index 7c5cf2da2d..5438b4ba24 100644 --- a/deploy/ansible/roles/network_config/tasks/main.yml +++ b/deploy/ansible/roles/network_config/tasks/main.yml @@ -1,50 +1,65 @@ --- ################################## -# Update the netplan configuration files -# for the ethernet interface to mark it -# as optional +# Install network-manager if +# necessary and setup dummy +# ethernet connection for +# air gap operation. ################################## -- name: List netplan ethernet configuration files - shell: grep -l "{{ eth_if_pattern }}" /etc/netplan/*.yaml - when: eth_optional - register: net_config - changed_when: false - failed_when: false - -- name: Set Ethernet I/F as optional - lineinfile: - path: "{{ item }}" - state: present - insertafter: "^ {{ eth_if_pattern }}" - line: " optional: true" - when: eth_optional - loop: "{{ net_config.stdout_lines }}" - notify: Apply netplan +- name: Install network-manager + apt: + name: network-manager -- name: Configure resolv.conf to use {{ ap_gateway }} as DNS nameserver - template: - src: resolved.conf.j2 - dest: /etc/systemd/resolved.conf +# - name: List non-network-manager config files +# find: +# paths: "/etc/netplan/" +# patterns: "00-installed.*\\.yaml" +# use_regex: yes +# register: netplan_files + +# - name: List existing netplan files +# debug: +# var: netplan_files + +# - name: Remove non-network-manager config files +# file: +# path: "{{ item.path }}" +# state: absent +# loop: "{{ netplan_files.files }}" + +- name: Set network-manager as renderer + copy: + src: 01-network-manager-all.yaml + dest: /etc/netplan/01-network-manager-all.yaml owner: root group: root - mode: 0644 - notify: Restart resolved - when: has_wifi + mode: 0600 + notify: Apply netplan + +- meta: flush_handlers ### # Create a virtual network interface so that k3s can run # when no ethernet connection is attached. ### -- name: Create virtual network I/F +- name: Create virtual IP connection + community.general.nmcli: + conn_name: "dummy-{{ virtual_if }}" + ifname: "{{ virtual_if }}" + autoconnect: yes + ip4: 172.16.1.23/16 + gw4: 172.16.1.23 + method4: "manual" + method6: "link-local" + state: "present" + type: "dummy" + +- name: Configure resolv.conf to use {{ ap_gateway }} as DNS nameserver template: - src: "{{ item }}.j2" - dest: /etc/systemd/network/{{ virtual_if }}.{{ item }} + src: resolved.conf.j2 + dest: /etc/systemd/resolved.conf owner: root group: root mode: 0644 - with_items: - - netdev - - network - when: k8s_engine != "none" - notify: Restart networkd + notify: Restart resolved + when: has_wifi From 4eb5eb148d6b1765b68efbf050a6c6172af85721 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 28 Feb 2024 10:37:41 -0500 Subject: [PATCH 59/98] Fix pattern for WiFi interfaces --- deploy/ansible/roles/support_tools/defaults/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/ansible/roles/support_tools/defaults/main.yml b/deploy/ansible/roles/support_tools/defaults/main.yml index 1faf3d765f..76e1a42aca 100644 --- a/deploy/ansible/roles/support_tools/defaults/main.yml +++ b/deploy/ansible/roles/support_tools/defaults/main.yml @@ -5,4 +5,4 @@ eth_update_program: /usr/local/bin/display-eth-addr install_ip_viewer: no install_combinectl: no -wifi_interfaces: "{{ ansible_facts.interfaces | select('search', '^wlp[0-9][a-z][0-9]') }}" +wifi_interfaces: "{{ ansible_facts.interfaces | select('search', '^wl[op][0-9]+[a-z][a-z0-9]+') }}" From d0c417ebd67e49f23bed103c8ef732a5b127ca15 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 28 Feb 2024 10:38:13 -0500 Subject: [PATCH 60/98] Assert that there is only one WiFi interface present --- deploy/ansible/roles/support_tools/tasks/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/ansible/roles/support_tools/tasks/main.yml b/deploy/ansible/roles/support_tools/tasks/main.yml index 774c691a1c..eedd85ce43 100644 --- a/deploy/ansible/roles/support_tools/tasks/main.yml +++ b/deploy/ansible/roles/support_tools/tasks/main.yml @@ -24,11 +24,11 @@ - name: Verify that there is a single WiFi interface assert: that: wifi_interfaces|length == 1 - success_msg: "Setup WiFi Interface: {{ wifi_interfaces[0] }}" + success_msg: "Setup WiFi Interface: {{ wifi_interfaces }}" fail_msg: | Only a single WiFi interface is supported. Found the following interfaces: - {{ wifi_interfaces }} + {{ ansible_facts.interfaces }} - name: Install combinectl tool template: From 8be4441099d4433925e6c9982d7f0fc800a5743e Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 28 Feb 2024 10:38:40 -0500 Subject: [PATCH 61/98] Add state to wait for combine cluster to come up --- deploy/scripts/install-combine | 49 ++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index 97adafc019..ed47329ae8 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -143,6 +143,40 @@ install-the-combine () { deactivate } +#! /usr/bin/env bash + +get-deployment-status () { + deployment=$1 + results=$2 + + # echo "Results: ${results}" >&2 + status=$(echo ${results} | grep "${deployment}" | sed "s/^.*\([0-9]\)\/1.*/\1/") + echo ${status} +} + +wait-for-combine () { + # Wait for all combine deployments to be up + while true ; do + combine_status=`kubectl -n thecombine get deployments` + # assert the The Combine is up; if any components are not up, + # set it to false + combine_up=true + for deployment in frontend backend database maintenance ; do + deployment_status=$(get-deployment-status "${deployment}" "${combine_status}") + if [ "$deployment_status" == "0" ] ; then + combine_up=false + break + fi + done + if [ ${combine_up} != true ] ; then + sleep 5 + else + echo "The Combine is UP!" + break + fi + done +} + shutdown-the-combine () { # Shut down the combine services and set them to not start at boot time combinectl stop @@ -231,6 +265,8 @@ while [ "$STATE" != "Done" ] ; do Restart) STATE=Base-charts echo -n ${STATE} > ${STATE_FILE} + ### TEMPORARY - for debugging + STATE=Done if [ -f /var/run/reboot-required ] ; then echo -e "***** Restart required *****\n" echo -e "Rerun combine-installer.run after the system has been restarted.\n" @@ -239,7 +275,6 @@ while [ "$STATE" != "Done" ] ; do sudo reboot else STATE=Done - echo -n ${STATE} > ${STATE_FILE} fi fi ;; @@ -250,7 +285,17 @@ while [ "$STATE" != "Done" ] ; do ;; Install-combine) install-the-combine - STATE=Shutdown-combine + # STATE=Wait-for-combine + # echo -n ${STATE} > ${STATE_FILE} + STATE="Done" + rm ${STATE_FILE} + ;; + Wait-for-combine) + # Wait until all the combine deployments are up + echo "Waiting for The Combine to start up. This may take some time depending on your" + echo "Internet connection. Press Ctrl-C to interrupt." + wait-for-combine + STATE="Shutdown-combine" echo -n ${STATE} > ${STATE_FILE} ;; Shutdown-combine) From ff206dbd8b439a10ec5f42106340d9dfc2e92a77 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 28 Feb 2024 12:08:31 -0500 Subject: [PATCH 62/98] Delete obsolete ReviewEntriesReducer.test.tsx Removed in PR #2800 --- .../Redux/tests/ReviewEntriesReducer.test.tsx | 51 ------------------- 1 file changed, 51 deletions(-) delete mode 100644 src/goals/ReviewEntries/Redux/tests/ReviewEntriesReducer.test.tsx diff --git a/src/goals/ReviewEntries/Redux/tests/ReviewEntriesReducer.test.tsx b/src/goals/ReviewEntries/Redux/tests/ReviewEntriesReducer.test.tsx deleted file mode 100644 index 0192c2a340..0000000000 --- a/src/goals/ReviewEntries/Redux/tests/ReviewEntriesReducer.test.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { reviewEntriesReducer } from "goals/ReviewEntries/Redux/ReviewEntriesReducer"; -import { - defaultState, - ReviewEntriesActionTypes, -} from "goals/ReviewEntries/Redux/ReviewEntriesReduxTypes"; -import { - ReviewEntriesSense, - ReviewEntriesWord, -} from "goals/ReviewEntries/ReviewEntriesTypes"; - -describe("ReviewEntriesReducer", () => { - it("Returns default state when passed undefined state", () => { - expect(reviewEntriesReducer(undefined, { type: undefined } as any)).toEqual( - defaultState - ); - }); - - it("Adds a set of words to a list when passed an UpdateAllWords action", () => { - const revWords = [new ReviewEntriesWord(), new ReviewEntriesWord()]; - const state = reviewEntriesReducer(defaultState, { - type: ReviewEntriesActionTypes.UpdateAllWords, - words: revWords, - }); - expect(state).toEqual({ ...defaultState, words: revWords }); - }); - - it("Updates a specified word when passed an UpdateWord action", () => { - const oldId = "id-of-word-to-be-updated"; - const oldWords: ReviewEntriesWord[] = [ - { ...new ReviewEntriesWord(), id: "other-id" }, - { ...new ReviewEntriesWord(), id: oldId, vernacular: "old-vern" }, - ]; - const oldState = { ...defaultState, words: oldWords }; - - const newId = "id-after-update"; - const newRevWord: ReviewEntriesWord = { - ...new ReviewEntriesWord(), - id: newId, - vernacular: "new-vern", - senses: [{ ...new ReviewEntriesSense(), guid: "new-sense-id" }], - }; - const newWords = [oldWords[0], newRevWord]; - - const newState = reviewEntriesReducer(oldState, { - type: ReviewEntriesActionTypes.UpdateWord, - oldId, - updatedWord: newRevWord, - }); - expect(newState).toEqual({ ...oldState, words: newWords }); - }); -}); From 36191dce397c75f588272495345bb0adb3e193e1 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 28 Feb 2024 15:55:17 -0500 Subject: [PATCH 63/98] Prettier reformat --- deploy/ansible/roles/container_engine/handlers/main.yml | 1 - deploy/ansible/roles/monitor_hardware/handlers/main.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/deploy/ansible/roles/container_engine/handlers/main.yml b/deploy/ansible/roles/container_engine/handlers/main.yml index 9183a38c29..d10d637284 100644 --- a/deploy/ansible/roles/container_engine/handlers/main.yml +++ b/deploy/ansible/roles/container_engine/handlers/main.yml @@ -2,4 +2,3 @@ - name: reboot target reboot: when: ansible_connection != "local" - diff --git a/deploy/ansible/roles/monitor_hardware/handlers/main.yml b/deploy/ansible/roles/monitor_hardware/handlers/main.yml index 5a4d679aae..f0e8eaa537 100644 --- a/deploy/ansible/roles/monitor_hardware/handlers/main.yml +++ b/deploy/ansible/roles/monitor_hardware/handlers/main.yml @@ -12,4 +12,3 @@ service: name: sysstat state: restarted - From c5d94f3e3a85206cd82d4942d9439ddcc737513a Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 29 Feb 2024 10:03:38 -0500 Subject: [PATCH 64/98] Update setting of ~/.kube/config to support local & remote access Also obviates the need for k8s_config role. --- deploy/ansible/playbook_desktop_setup.yaml | 6 -- deploy/ansible/playbook_nuc_setup.yaml | 6 -- .../roles/k8s_config/defaults/main.yml | 4 -- .../roles/k8s_config/handlers/main.yml | 8 --- .../ansible/roles/k8s_config/tasks/main.yml | 60 ------------------- .../roles/k8s_install/handlers/main.yml | 8 +++ .../ansible/roles/k8s_install/tasks/k3s.yml | 18 +++--- .../k8s_install/tasks/k8s_remote_access.yml | 57 ++++++++++++++++++ .../ansible/roles/k8s_install/tasks/main.yml | 5 ++ 9 files changed, 81 insertions(+), 91 deletions(-) delete mode 100644 deploy/ansible/roles/k8s_config/defaults/main.yml delete mode 100644 deploy/ansible/roles/k8s_config/handlers/main.yml delete mode 100644 deploy/ansible/roles/k8s_config/tasks/main.yml create mode 100644 deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml diff --git a/deploy/ansible/playbook_desktop_setup.yaml b/deploy/ansible/playbook_desktop_setup.yaml index 963ab55812..6ddd67480f 100644 --- a/deploy/ansible/playbook_desktop_setup.yaml +++ b/deploy/ansible/playbook_desktop_setup.yaml @@ -45,12 +45,6 @@ import_role: name: k8s_install - - name: Get Kubernetes Configuration - import_role: - name: k8s_config - tags: - - kubeconfig - - name: Install Helm import_role: name: helm_install diff --git a/deploy/ansible/playbook_nuc_setup.yaml b/deploy/ansible/playbook_nuc_setup.yaml index 61bc9422ae..a55d4c8c1d 100644 --- a/deploy/ansible/playbook_nuc_setup.yaml +++ b/deploy/ansible/playbook_nuc_setup.yaml @@ -45,12 +45,6 @@ import_role: name: k8s_install - - name: Get Kubernetes Configuration - import_role: - name: k8s_config - tags: - - kubeconfig - - name: Setup Support Tool import_role: name: support_tools diff --git a/deploy/ansible/roles/k8s_config/defaults/main.yml b/deploy/ansible/roles/k8s_config/defaults/main.yml deleted file mode 100644 index 2b9f3d9889..0000000000 --- a/deploy/ansible/roles/k8s_config/defaults/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -# Used to setup the certificate for kubectl -# Can be overridden by specific groups/hosts -k8s_dns_name: "{{ combine_server_name }}" diff --git a/deploy/ansible/roles/k8s_config/handlers/main.yml b/deploy/ansible/roles/k8s_config/handlers/main.yml deleted file mode 100644 index b551f844ab..0000000000 --- a/deploy/ansible/roles/k8s_config/handlers/main.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- name: update profile - lineinfile: - state: present - path: "{{ k8s_user_home }}/.profile" - line: "export KUBECONFIG={{ lookup('env', 'HOME') }}/.kube/config" - mode: 0600 - when: ansible_connection == "local" diff --git a/deploy/ansible/roles/k8s_config/tasks/main.yml b/deploy/ansible/roles/k8s_config/tasks/main.yml deleted file mode 100644 index 0bf52afb50..0000000000 --- a/deploy/ansible/roles/k8s_config/tasks/main.yml +++ /dev/null @@ -1,60 +0,0 @@ ---- -- name: Get home directory for {{ k8s_user }} - shell: > - getent passwd {{ k8s_user }} | awk -F: '{ print $6 }' - register: k8s_user_home - changed_when: false - -- name: Save kubectl configuration on host - fetch: - src: "{{ k8s_user_home.stdout }}/.kube/config" - dest: "{{ kubecfg }}" - flat: yes - -- name: Restrict permissions to kubeconfig to owner - delegate_to: localhost - become: false - file: - path: "{{ kubecfg }}" - state: file - mode: 0600 - - # The kubeconfig file that is generated by k3s on the target - # system identifies the server by the IP address. This updates - # the file when it has been copied to the host to replace the - # IP address with the server name. This is needed in the a - # cloud environment where the IP address seen on the host is not - # the public IP address. For example: - # server: 10.0.0.40:6443 - # is changed to: - # server: nuc2:6443 - # (kubectl communicates with the cluster over port 16443 or 6443) -- name: Replace server IP with DNS name in site_files copy - delegate_to: localhost - become: false - lineinfile: - state: present - path: "{{ kubecfg }}" - regexp: '^(\s+server: https:\/\/)[.0-9]+:(1?6443)' - backrefs: yes - line: '\1{{ k8s_dns_name }}:\2' - when: ansible_connection != "local" - notify: update profile - -- name: Replace 'default' cluster, user, etc with {{ kubecfgdir }} - delegate_to: localhost - become: false - replace: - path: "{{ kubecfg }}" - regexp: "^(.*)default(.*)$" - replace: '\1{{ kubecfgdir }}\2' - -- name: Link ~/.kube/config to {{ kubecfg }} - delegate_to: localhost - become: false - file: - state: link - src: "{{ kubecfg }}" - dest: "{{ lookup('env', 'HOME') }}/.kube/config" - mode: 0600 - when: link_kubeconfig | default(false) diff --git a/deploy/ansible/roles/k8s_install/handlers/main.yml b/deploy/ansible/roles/k8s_install/handlers/main.yml index 3a779f8edf..03cb7602af 100644 --- a/deploy/ansible/roles/k8s_install/handlers/main.yml +++ b/deploy/ansible/roles/k8s_install/handlers/main.yml @@ -5,3 +5,11 @@ daemon_reload: yes enabled: yes state: restarted + +- name: update profile + lineinfile: + state: present + path: "{{ k8s_user_home }}/.profile" + line: "export KUBECONFIG={{ lookup('env', 'HOME') }}/.kube/config" + mode: 0600 + when: ansible_connection == "local" diff --git a/deploy/ansible/roles/k8s_install/tasks/k3s.yml b/deploy/ansible/roles/k8s_install/tasks/k3s.yml index d43a9062ed..b605f045fa 100644 --- a/deploy/ansible/roles/k8s_install/tasks/k3s.yml +++ b/deploy/ansible/roles/k8s_install/tasks/k3s.yml @@ -48,14 +48,18 @@ owner: root group: root -- name: Set link .kube/config to /etc/rancher/k3s/k3s.yaml - file: - src: /etc/rancher/k3s/k3s.yaml - path: "{{ item }}/.kube/config" - state: link +- name: Copy /etc/rancher/k3s/k3s.yaml to .kube/config + shell: | + cp /etc/rancher/k3s/k3s.yaml {{ item.home }}/.kube/config + chown {{ item.owner }}:{{ item.group }} {{ item.home }}/.kube/config + chmod 600 {{ item.home }}/.kube/config loop: - - "{{ k8s_user_home.stdout }}" - - /root + - home: "{{ k8s_user_home.stdout }}" + owner: "{{ k8s_user }}" + group: "{{ k8s_user_group_id.stdout }}" + - home: /root + owner: root + group: root - name: List contexts command: kubectl --kubeconfig=/etc/rancher/k3s/k3s.yaml config get-contexts diff --git a/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml b/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml new file mode 100644 index 0000000000..ab0cb4e4e3 --- /dev/null +++ b/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml @@ -0,0 +1,57 @@ +--- +- name: Get home directory for {{ k8s_user }} + shell: > + getent passwd {{ k8s_user }} | awk -F: '{ print $6 }' + register: k8s_user_home + changed_when: false + +- name: Save {{ k8s_user_home.stdout }}/.kube/config on host + fetch: + src: "{{ k8s_user_home.stdout }}/.kube/config" + dest: "{{ kubecfg }}" + flat: yes + +- name: Update kubeconfig file + delegate_to: localhost + become: false + block: + - name: Restrict permissions to kubeconfig to owner + file: + path: "{{ kubecfg }}" + state: file + mode: 0600 + + # The kubeconfig file that is generated by k3s on the target + # system identifies the server by the IP address. This updates + # the file when it has been copied to the host to replace the + # IP address with the server name. This is needed in the a + # cloud environment where the IP address seen on the host is not + # the public IP address. For example: + # server: 10.0.0.40:6443 + # is changed to: + # server: nuc2:6443 + # (kubectl communicates with the cluster over port 16443 or 6443) + - name: Replace server IP with {{ k8s_dns_name }} in {{ kubecfg }} + lineinfile: + state: present + path: "{{ kubecfg }}" + regexp: '^(\s+server: https:\/\/)[.0-9]+:(1?6443)' + backrefs: yes + line: '\1{{ k8s_dns_name }}:\2' + notify: update profile + + - name: Replace 'default' cluster, user, etc with {{ kubecfgdir }} + replace: + path: "{{ kubecfg }}" + regexp: "^(.*)default(.*)$" + replace: '\1{{ kubecfgdir }}\2' + + - name: Link ~/.kube/config to {{ kubecfg }} + delegate_to: localhost + become: false + file: + state: link + src: "{{ kubecfg }}" + dest: "{{ lookup('env', 'HOME') }}/.kube/config" + mode: 0600 + when: link_kubeconfig | default(false) diff --git a/deploy/ansible/roles/k8s_install/tasks/main.yml b/deploy/ansible/roles/k8s_install/tasks/main.yml index cfa844a943..5fdacac8e9 100644 --- a/deploy/ansible/roles/k8s_install/tasks/main.yml +++ b/deploy/ansible/roles/k8s_install/tasks/main.yml @@ -39,3 +39,8 @@ - name: Install kubectl apt: name: kubectl + +- name: Setup remote access to cluster + include_tasks: + file: k8s_remote_access.yml + when: ansible_connection != "local" From 3767c447d0a148cf7b219bcda4f97cea33953f2c Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 29 Feb 2024 11:37:22 -0500 Subject: [PATCH 65/98] Set k8s_user to current for ansible install; remove debugging output --- deploy/scripts/install-combine | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index ed47329ae8..ff026e30c1 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -73,7 +73,7 @@ install-kubernetes () { # Setup Kubernetes environment and WiFi Access Point cd ${INSTALL_DIR}/ansible - ansible-playbook playbook_desktop_setup.yaml -K + ansible-playbook playbook_desktop_setup.yaml -K -e k8s_user=`whoami` } set-k3s-env () { @@ -81,7 +81,7 @@ set-k3s-env () { # Setup kubectl configuration file K3S_CONFIG_FILE=${HOME}/.kube/config if [ ! -e ${K3S_CONFIG_FILE} ] ; then - echo >2 "Kubernetes (k3s) configuration file is missing." + echo "Kubernetes (k3s) configuration file is missing." >&2 exit 1 fi export KUBECONFIG=${K3S_CONFIG_FILE} @@ -245,7 +245,7 @@ while (( "$#" )) ; do rm ${STATE_FILE} ;; *) - echo "Unrecognized option: $OPT" >2 + echo "Unrecognized option: $OPT" >&2 ;; esac shift @@ -265,8 +265,6 @@ while [ "$STATE" != "Done" ] ; do Restart) STATE=Base-charts echo -n ${STATE} > ${STATE_FILE} - ### TEMPORARY - for debugging - STATE=Done if [ -f /var/run/reboot-required ] ; then echo -e "***** Restart required *****\n" echo -e "Rerun combine-installer.run after the system has been restarted.\n" From 7cbbbea214e146ac82d0671ae7564635a11517c1 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 7 Mar 2024 11:12:55 -0500 Subject: [PATCH 66/98] Rename readme file for installer --- deploy/scripts/{install_README.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename deploy/scripts/{install_README.md => README.md} (100%) diff --git a/deploy/scripts/install_README.md b/deploy/scripts/README.md similarity index 100% rename from deploy/scripts/install_README.md rename to deploy/scripts/README.md From 85feb93067e70d72f725832f0e5f8e35369c69a2 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 7 Mar 2024 11:14:06 -0500 Subject: [PATCH 67/98] Improve user environment setup --- deploy/ansible/roles/k8s_install/handlers/main.yml | 8 -------- .../roles/k8s_install/tasks/k8s_remote_access.yml | 9 --------- deploy/ansible/roles/k8s_install/tasks/main.yml | 14 ++++++++++++++ 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/deploy/ansible/roles/k8s_install/handlers/main.yml b/deploy/ansible/roles/k8s_install/handlers/main.yml index 03cb7602af..3a779f8edf 100644 --- a/deploy/ansible/roles/k8s_install/handlers/main.yml +++ b/deploy/ansible/roles/k8s_install/handlers/main.yml @@ -5,11 +5,3 @@ daemon_reload: yes enabled: yes state: restarted - -- name: update profile - lineinfile: - state: present - path: "{{ k8s_user_home }}/.profile" - line: "export KUBECONFIG={{ lookup('env', 'HOME') }}/.kube/config" - mode: 0600 - when: ansible_connection == "local" diff --git a/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml b/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml index ab0cb4e4e3..8346628c8e 100644 --- a/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml +++ b/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml @@ -1,10 +1,4 @@ --- -- name: Get home directory for {{ k8s_user }} - shell: > - getent passwd {{ k8s_user }} | awk -F: '{ print $6 }' - register: k8s_user_home - changed_when: false - - name: Save {{ k8s_user_home.stdout }}/.kube/config on host fetch: src: "{{ k8s_user_home.stdout }}/.kube/config" @@ -38,7 +32,6 @@ regexp: '^(\s+server: https:\/\/)[.0-9]+:(1?6443)' backrefs: yes line: '\1{{ k8s_dns_name }}:\2' - notify: update profile - name: Replace 'default' cluster, user, etc with {{ kubecfgdir }} replace: @@ -47,8 +40,6 @@ replace: '\1{{ kubecfgdir }}\2' - name: Link ~/.kube/config to {{ kubecfg }} - delegate_to: localhost - become: false file: state: link src: "{{ kubecfg }}" diff --git a/deploy/ansible/roles/k8s_install/tasks/main.yml b/deploy/ansible/roles/k8s_install/tasks/main.yml index 5fdacac8e9..533e1f6899 100644 --- a/deploy/ansible/roles/k8s_install/tasks/main.yml +++ b/deploy/ansible/roles/k8s_install/tasks/main.yml @@ -40,6 +40,20 @@ apt: name: kubectl +- name: Get home directory for {{ k8s_user }} + shell: > + getent passwd {{ k8s_user }} | awk -F: '{ print $6 }' + register: k8s_user_home + changed_when: false + +- name: update profile + lineinfile: + state: present + path: "{{ k8s_user_home.stdout }}/.profile" + line: "export KUBECONFIG=${HOME}/.kube/config" + mode: 0600 + when: ansible_connection == "local" + - name: Setup remote access to cluster include_tasks: file: k8s_remote_access.yml From 9dc46a2b0f9263e5ec31caa9b6c898b7a8294cee Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 7 Mar 2024 11:15:04 -0500 Subject: [PATCH 68/98] set route metrics for virtual IP device --- deploy/ansible/roles/network_config/tasks/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deploy/ansible/roles/network_config/tasks/main.yml b/deploy/ansible/roles/network_config/tasks/main.yml index 5438b4ba24..be12c36334 100644 --- a/deploy/ansible/roles/network_config/tasks/main.yml +++ b/deploy/ansible/roles/network_config/tasks/main.yml @@ -50,7 +50,9 @@ ip4: 172.16.1.23/16 gw4: 172.16.1.23 method4: "manual" + route_metric4: 999 method6: "link-local" + route_metric6: 999 state: "present" type: "dummy" From 9c41963399d61cbbf85753ec48ce7f700ca41fc5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 7 Mar 2024 12:02:04 -0500 Subject: [PATCH 69/98] Remove unhelpful messages from output when performing a standard installation --- deploy/scripts/aws_env.py | 1 - deploy/scripts/setup_combine.py | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/deploy/scripts/aws_env.py b/deploy/scripts/aws_env.py index 054d9e0ad9..ed7d983324 100755 --- a/deploy/scripts/aws_env.py +++ b/deploy/scripts/aws_env.py @@ -15,7 +15,6 @@ def aws_version() -> Optional[int]: try: result = run_cmd(["aws", "--version"], check_results=False, chomp=True) except FileNotFoundError: - print("AWS CLI version 2 is not installed.") return None else: if result.returncode == 0: diff --git a/deploy/scripts/setup_combine.py b/deploy/scripts/setup_combine.py index 26b9d382bb..aa37b40ae8 100755 --- a/deploy/scripts/setup_combine.py +++ b/deploy/scripts/setup_combine.py @@ -19,6 +19,7 @@ The script also adds value definitions from a profile specific configuration file if it exists. """ import argparse +import logging import os from pathlib import Path import sys @@ -143,8 +144,8 @@ def create_secrets( else: missing_env_vars.append(item["env_var"]) if len(missing_env_vars) > 0: - print("The following environment variables are not defined:") - print(", ".join(missing_env_vars)) + logging.debug("The following environment variables are not defined:") + logging.debug(", ".join(missing_env_vars)) if not env_vars_req: return secrets_written sys.exit(ExitStatus.FAILURE.value) @@ -170,7 +171,7 @@ def get_target(config: Dict[str, Any]) -> str: try: return input("Enter the target name (Ctrl-C to cancel):") except KeyboardInterrupt: - print("Exiting.") + logging.INFO("Exiting.") sys.exit(ExitStatus.FAILURE.value) @@ -223,6 +224,16 @@ def add_profile_values( def main() -> None: args = parse_args() + # Setup the logging level. The command output will be printed on stdout/stderr + # independent of the logging facility + if args.debug: + log_level = logging.DEBUG + elif args.quiet: + log_level = logging.WARNING + else: + log_level = logging.INFO + logging.basicConfig(format="%(levelname)s:%(message)s", level=log_level) + # Lookup the cluster configuration with open(args.config) as file: config: Dict[str, Any] = yaml.safe_load(file) From a54f680dc2f4ceb8af15c38baa50f741c37a52bd Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 7 Mar 2024 12:03:55 -0500 Subject: [PATCH 70/98] Add script for uninstall --- .gitignore | 2 +- deploy/scripts/install-combine | 127 +++++++++++++++++-------------- deploy/scripts/uninstall-combine | 53 +++++++++++++ 3 files changed, 122 insertions(+), 60 deletions(-) create mode 100755 deploy/scripts/uninstall-combine diff --git a/.gitignore b/.gitignore index b22a7a0cbc..c047b19fe4 100644 --- a/.gitignore +++ b/.gitignore @@ -82,8 +82,8 @@ deploy/scripts/semantic_domains/json/*.json database/semantic_domains/* # Combine installer -installer/makeself-* installer/combine-installer.run +installer/makeself-* # Kubernetes Configuration files **/site_files/ diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index ff026e30c1..5cc037747f 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -85,6 +85,11 @@ set-k3s-env () { exit 1 fi export KUBECONFIG=${K3S_CONFIG_FILE} + ##### + # Start k3s if it is not running + if ! systemctl is-active --quiet k3s ; then + sudo systemctl start k3s + fi } copy-install-scripts () { @@ -146,41 +151,39 @@ install-the-combine () { #! /usr/bin/env bash get-deployment-status () { - deployment=$1 - results=$2 + deployment=$1 + results=$2 - # echo "Results: ${results}" >&2 - status=$(echo ${results} | grep "${deployment}" | sed "s/^.*\([0-9]\)\/1.*/\1/") - echo ${status} + # echo "Results: ${results}" >&2 + status=$(echo ${results} | grep "${deployment}" | sed "s/^.*\([0-9]\)\/1.*/\1/") + echo ${status} } wait-for-combine () { - # Wait for all combine deployments to be up - while true ; do - combine_status=`kubectl -n thecombine get deployments` - # assert the The Combine is up; if any components are not up, - # set it to false - combine_up=true - for deployment in frontend backend database maintenance ; do - deployment_status=$(get-deployment-status "${deployment}" "${combine_status}") - if [ "$deployment_status" == "0" ] ; then - combine_up=false - break - fi - done - if [ ${combine_up} != true ] ; then - sleep 5 - else - echo "The Combine is UP!" - break - fi + # Wait for all combine deployments to be up + while true ; do + combine_status=`kubectl -n thecombine get deployments` + # assert the The Combine is up; if any components are not up, + # set it to false + combine_up=true + for deployment in frontend backend database maintenance ; do + deployment_status=$(get-deployment-status "${deployment}" "${combine_status}") + if [ "$deployment_status" == "0" ] ; then + combine_up=false + break + fi done + if [ ${combine_up} != true ] ; then + sleep 5 + else + break + fi + done } shutdown-the-combine () { # Shut down the combine services and set them to not start at boot time combinectl stop - combinectl noauto 2> /dev/null combinectl status } @@ -198,6 +201,15 @@ create-dest-directory () { fi } +next-state () { + STATE=$1 + if [[ "${STATE}" == "Done" && -f "${STATE_FILE}" ]] ; then + rm ${STATE_FILE} + else + echo -n ${STATE} > ${STATE_FILE} + fi +} + ##### # Setup initial variables INSTALL_DIR=`pwd` @@ -219,30 +231,28 @@ fi while (( "$#" )) ; do OPT=$1 case $OPT in - --version|-v) - if [[ $# > 1 ]] ; then - $COMBINE_VERSION=$2 - shift - fi - ;; - --update|-u) - if [[ $# > 1 ]] ; then - $COMBINE_VERSION=$2 - shift - STATE=Install-combine - fi - rm ${STATE_FILE} - ;; - --clean) - STATE=Pre-reqs - rm ${STATE_FILE} + clean) + next-state "Pre-reqs" if [ -f ${CONFIG_DIR}/env ] ; then rm ${CONFIG_DIR}/env fi ;; - --restart) - STATE=Pre-reqs - rm ${STATE_FILE} + restart) + next-state "Pre-reqs" + ;; + uninstall) + next-state "Uninstall-combine" + ;; + update|u) + next-state "Install-combine" + ;; + v*) + if [[ $OPT =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9-]+\.[0-9]+)?$ ]] ; then + COMBINE_VERSION="$OPT" + else + echo "Invalid version number, $OPT" + exit 1 + fi ;; *) echo "Unrecognized option: $OPT" >&2 @@ -259,12 +269,10 @@ while [ "$STATE" != "Done" ] ; do create-python-venv install-kubernetes copy-install-scripts - STATE=Restart - echo -n ${STATE} > ${STATE_FILE} + next-state "Restart" ;; Restart) - STATE=Base-charts - echo -n ${STATE} > ${STATE_FILE} + next-state "Base-charts" if [ -f /var/run/reboot-required ] ; then echo -e "***** Restart required *****\n" echo -e "Rerun combine-installer.run after the system has been restarted.\n" @@ -272,34 +280,35 @@ while [ "$STATE" != "Done" ] ; do if [[ -z $RESTART || $RESTART =~ ^[yY].* ]] ; then sudo reboot else + # We don't call next-state because we don't want the $STATE_FILE + # removed - we want the install script to resume with the recorded + # state. STATE=Done fi fi ;; Base-charts) install-required-charts - STATE=Install-combine - echo -n ${STATE} > ${STATE_FILE} + next-state "Install-combine" ;; Install-combine) install-the-combine - # STATE=Wait-for-combine - # echo -n ${STATE} > ${STATE_FILE} - STATE="Done" - rm ${STATE_FILE} + next-state "Wait-for-combine" ;; Wait-for-combine) # Wait until all the combine deployments are up echo "Waiting for The Combine to start up. This may take some time depending on your" echo "Internet connection. Press Ctrl-C to interrupt." wait-for-combine - STATE="Shutdown-combine" - echo -n ${STATE} > ${STATE_FILE} + next-state "Shutdown-combine" ;; Shutdown-combine) shutdown-the-combine - STATE="Done" - rm ${STATE_FILE} + next-state "Done" + ;; + Uninstall-combine) + ${INSTALL_DIR}/scripts/uninstall-combine + next-state "Done" ;; *) echo "Unrecognized STATE: ${STATE}" diff --git a/deploy/scripts/uninstall-combine b/deploy/scripts/uninstall-combine new file mode 100755 index 0000000000..15324e5d9e --- /dev/null +++ b/deploy/scripts/uninstall-combine @@ -0,0 +1,53 @@ +#! /usr/bin/env bash + +delete-files () { + for file in "$@" ; do + if [[ -f "$file" ]] ; then + echo "Removing $file" + sudo rm -rf $file >/dev/null 2>&1 + fi + done +} + +kill-service () { + # Stops and disables the specified service + if systemctl is-active $1 ; then + echo "Stopping service $1" + sudo systemctl stop $1 2>&1 >/dev/null + fi + if systemctl is-enabled $1 ; then + echo "Disabline service $1" + sudo systemctl disable $1 + fi +} + +# Stop & disable combine services +echo "Stopping combine services" +kill-service k3s +kill-service create_ap + +# Delete $HOME/thecombine; $HOME/.config/combine +delete-files ${HOME}/thecombine ${HOME}/.config/combine + +# Remove support tool + +kill-service display-eth.service +kill-service display-eth.timer +delete-files /lib/systemd/system/display-eth.service /lib/systemd/system/display-eth.timer + +# Remove combine management tool +delete-files /usr/local/bin/combinectl + + +# Uninstall k3s +if [[ -x /usr/local/bin/k3s-uninstall.sh ]] ; then + /usr/local/bin/k3s-uninstall.sh +fi + +# Remove network configurations +if nmcli c show dummy-vip >/dev/null 2>&1 ; then + nmcli c delete dummy-vip +fi + +# delete create_ap files +delete-files /etc/create_ap /usr/lib/systemd/system/create_ap.service From 1b1b7a7bd736ff9c0aa31ff374524d955159d925 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 7 Mar 2024 12:04:35 -0500 Subject: [PATCH 71/98] remove auto & noauto options; restart WiFi when combine is stopped --- .../support_tools/templates/combinectl.sh | 87 ++++++++++--------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/deploy/ansible/roles/support_tools/templates/combinectl.sh b/deploy/ansible/roles/support_tools/templates/combinectl.sh index 4247bb91bd..dda4ae36fb 100755 --- a/deploy/ansible/roles/support_tools/templates/combinectl.sh +++ b/deploy/ansible/roles/support_tools/templates/combinectl.sh @@ -9,14 +9,10 @@ usage () { help: Print this usage message. start: Start the combine services. stop: Stop the combine services. - auto: Configure the combine services to start at boot time. - Does not imply 'start'. - noauto: Configure the combine services to not start at boot time. - Does not imply 'stop'. status: List the status for the combine services. cert: Print the expiration date for the web certificate. - update release_number: - Update the version of The Combine to the "release_number" + update release-number: + Update the version of The Combine to the "release-number" specified. You can see the number of the latest release at https://github.com/sillsdev/TheCombine/releases. @@ -29,41 +25,51 @@ usage () { .EOM } -combine_enable () { - echo "Setting The Combine to start at boot." - sudo systemctl enable create_ap - sudo systemctl enable k3s +save-wifi-connection () { + # get the name of the WiFi Connection + WIFI_CONN=`nmcli d show "$WIFI_IF" | grep "^GENERAL.CONNECTION" | sed "s|^GENERAL.CONNECTION: *||"` + # save it so we can restore it later + echo "$WIFI_CONN" > ${COMBINE_CONFIG}/wifi_connection.txt + if [ "$WIFI_CONN" != "--" ] ; then + nmcli c down "$WIFI_CONN" + fi } -combine_disable () { - echo "Setting The Combine to not start at boot." - sudo systemctl disable create_ap - sudo systemctl disable k3s +restore-wifi-connection () { + if [ -f "${COMBINE_CONFIG}/wifi_connection.txt" ] ; then + WIFI_CONN=`cat ${COMBINE_CONFIG}/wifi_connection.txt` + echo "Restoring connection $WIFI_CONN" + if [ "$WIFI_CONN" != "--" ] ; then + nmcli c up "$WIFI_CONN" + fi + fi } -combine_start () { +combine-start () { echo "Starting The Combine." - sudo systemctl start create_ap - sudo systemctl restart systemd-resolved - sudo systemctl restart systemd-networkd - sudo systemctl start k3s -# sudo ip link set ${WIFI_IF} up + if ! systemctl is-active --quiet create_ap ; then + save-wifi-connection + sudo systemctl start create_ap + sudo systemctl restart systemd-resolved + fi + if ! systemctl is-active --quiet k3s ; then + sudo systemctl start k3s + fi } -combine_stop () { +combine-stop () { echo "Stopping The Combine." - sudo systemctl stop k3s - sudo systemctl stop create_ap - sudo systemctl restart systemd-resolved - sudo systemctl restart systemd-networkd + if systemctl is-active --quiet k3s ; then + sudo systemctl stop k3s + fi + if systemctl is-active --quiet create_ap ; then + sudo systemctl stop create_ap + restore-wifi-connection + sudo systemctl restart systemd-resolved + fi } -combine_status () { - if systemctl is-enabled --quiet create_ap && systemctl is-enabled --quiet k3s ; then - echo "The Combine starts automatically at boot time." - else - echo "The Combine does not start automatically." - fi +combine-status () { if systemctl is-active --quiet create_ap ; then echo "WiFi hotspot is Running." else @@ -77,13 +83,13 @@ combine_status () { fi } -combine_cert () { +combine-cert () { SECRET_NAME=`kubectl -n thecombine get secrets --field-selector type=kubernetes.io/tls -o name` CERT_DATA=`kubectl -n thecombine get $SECRET_NAME -o "jsonpath={.data['tls\.crt']}"` echo $CERT_DATA | base64 -d | openssl x509 -enddate -noout| sed -e "s/^notAfter=/Web certificate expires at /" } -combine_update () { +combine-update () { echo "Updating The Combine to $1" IMAGE_TAG=$1 while [[ ! $IMAGE_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]] ; do @@ -98,6 +104,7 @@ combine_update () { WIFI_IF={{ wifi_interfaces[0] }} export KUBECONFIG=${HOME}/.kube/config +COMBINE_CONFIG=${HOME}/.config/combine if [[ $# -eq 0 ]] ; then usage @@ -107,20 +114,16 @@ fi case "$1" in help) usage;; - auto) - combine_enable;; - noauto) - combine_disable;; start) - combine_start;; + combine-start;; stop) - combine_stop;; + combine-stop;; stat*) - combine_status;; + combine-status;; cert*) - combine_cert;; + combine-cert;; update) - combine_update $2;; + combine-update $2;; *) echo -e "Unrecognized command: \"$1\".\n" usage;; From 4c529c9aed4c72431a0b7bd6547efc36ae8286a1 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 7 Mar 2024 14:29:01 -0500 Subject: [PATCH 72/98] Clean-up from review --- .../files/gnome-terminal-profiles.dconf | 182 ------------------ .../files/install-terminal-profiles.sh | 3 - deploy/ansible/playbook_dev_tools.yaml | 85 -------- deploy/ansible/playbook_wifi_ap.yml | 29 --- .../roles/container_engine/handlers/main.yml | 4 - .../k8s_install/tasks/k8s_remote_access.yml | 5 + .../roles/network_config/tasks/main.yml | 17 -- deploy/scripts/setup_combine.py | 2 +- {deploy/scripts => installer}/README.md | 0 maintenance/scripts/combine-version.sh | 26 --- 10 files changed, 6 insertions(+), 347 deletions(-) delete mode 100644 deploy/ansible/files/gnome-terminal-profiles.dconf delete mode 100644 deploy/ansible/files/install-terminal-profiles.sh delete mode 100644 deploy/ansible/playbook_dev_tools.yaml delete mode 100644 deploy/ansible/playbook_wifi_ap.yml delete mode 100644 deploy/ansible/roles/container_engine/handlers/main.yml rename {deploy/scripts => installer}/README.md (100%) delete mode 100755 maintenance/scripts/combine-version.sh diff --git a/deploy/ansible/files/gnome-terminal-profiles.dconf b/deploy/ansible/files/gnome-terminal-profiles.dconf deleted file mode 100644 index 131b20bd8b..0000000000 --- a/deploy/ansible/files/gnome-terminal-profiles.dconf +++ /dev/null @@ -1,182 +0,0 @@ -[/] -default='6a0f96db-55fc-473c-ab3c-5221b410ed13' -list=['27799efc-28cb-4d10-8b08-7aed7c4e154c', '1c5fcfe9-9dc4-47e4-b018-e7f70ad963cc', 'a4897f17-21ed-48c2-8244-0942611119d3', 'e5a751ab-9476-4fd4-bc99-075e21340016', '02ad3004-c8f0-403e-bc30-df4f115fdfd9', '615564e2-bab4-44ce-94f5-c9d3b9d5dc43', '811b5a85-5b34-46de-8df0-a66f78d2481b', 'c68267a0-137c-46d9-ab69-f832ef972f93', '6a0f96db-55fc-473c-ab3c-5221b410ed13', 'abab88dc-1c66-4410-a83d-f302b3ffa455'] - -[:02ad3004-c8f0-403e-bc30-df4f115fdfd9] -background-color='#000000000000' -bold-color='#ffffffffffff' -bold-color-same-as-fg=true -cursor-background-color='#ffffffffffff' -cursor-colors-set=true -cursor-foreground-color='#000000000000' -font='Monospace 14' -foreground-color='#ffffffffffff' -palette=['#000000000000', '#ffff55555555', '#5555ffff5555', '#ffffffff5555', '#55555555ffff', '#ffff5555ffff', '#5555ffffffff', '#bbbbbbbbbbbb', '#555555555555', '#ffff55555555', '#5555ffff5555', '#ffffffff5555', '#55555555ffff', '#ffff5555ffff', '#5555ffffffff', '#ffffffffffff'] -use-system-font=false -use-theme-colors=false -use-theme-transparency=false -visible-name='Dark Pastel - 14 pt' - -[:08eb7f48-be7d-4a97-b297-cf899b1d9902] -use-theme-colors=false -visible-name='Tango Dark' - -[:1c5fcfe9-9dc4-47e4-b018-e7f70ad963cc] -allow-bold=true -background-color='#000000000000' -bold-color='#ffffffffffff' -bold-color-same-as-fg=true -cursor-background-color='#ffffffffffff' -cursor-colors-set=true -cursor-foreground-color='#000000000000' -default-size-columns=120 -font='Monospace 14' -foreground-color='#ffffffffffff' -palette=['#000000000000', '#ffff55555555', '#5555ffff5555', '#ffffffff5555', '#55555555ffff', '#ffff5555ffff', '#5555ffffffff', '#bbbbbbbbbbbb', '#555555555555', '#ffff55555555', '#5555ffff5555', '#ffffffff5555', '#55555555ffff', '#ffff5555ffff', '#5555ffffffff', '#ffffffffffff'] -use-system-font=true -use-theme-background=false -use-theme-colors=false -use-theme-transparency=false -visible-name='Dark Pastel - wide' - -[:27480fc5-447a-426a-a2e3-40763d8ea62d] -background-color='rgb(253,246,227)' -foreground-color='rgb(101,123,131)' -use-theme-colors=false -visible-name='Solarized light' - -[:27799efc-28cb-4d10-8b08-7aed7c4e154c] -palette=['rgb(23,20,33)', 'rgb(192,28,40)', 'rgb(38,162,105)', 'rgb(189,182,43)', 'rgb(54,123,209)', 'rgb(163,71,186)', 'rgb(42,161,179)', 'rgb(208,207,204)', 'rgb(94,92,100)', 'rgb(246,97,81)', 'rgb(51,209,122)', 'rgb(233,173,12)', 'rgb(42,123,222)', 'rgb(192,97,203)', 'rgb(51,199,222)', 'rgb(255,255,255)'] -use-theme-colors=true -use-theme-transparency=false -visible-name='System' - -[:615564e2-bab4-44ce-94f5-c9d3b9d5dc43] -allow-bold=true -background-color='#222223232424' -bold-color='#BABABABABABA' -bold-color-same-as-fg=true -cursor-background-color='#BABABABABABA' -cursor-colors-set=true -cursor-foreground-color='#222223232424' -default-size-columns=120 -font='Monospace 14' -foreground-color='#BABABABABABA' -palette=['#000000000000', '#E8E834341C1C', '#6868C2C25656', '#F2F2D4D42C2C', '#1C1C9898E8E8', '#8E8E6969C9C9', '#1C1C9898E8E8', '#BABABABABABA', '#000000000000', '#E0E05A5A4F4F', '#7777B8B86969', '#EFEFD6D64B4B', '#38387C7CD3D3', '#95957B7BBEBE', '#3D3D9797E2E2', '#BABABABABABA'] -use-system-font=true -use-theme-background=false -use-theme-colors=false -use-theme-transparency=false -visible-name='Darkside' - -[:6a0f96db-55fc-473c-ab3c-5221b410ed13] -allow-bold=true -background-color='#29292D2D3E3E' -bold-color='#BFBFC7C7D5D5' -bold-color-same-as-fg=true -cursor-background-color='#BFBFC7C7D5D5' -cursor-colors-set=true -cursor-foreground-color='#29292D2D3E3E' -default-size-columns=120 -font='Monospace 14' -foreground-color='#BFBFC7C7D5D5' -palette=['#29292D2D3E3E', '#F0F071717878', '#6262DEDE8484', '#FFFFCBCB6B6B', '#7575A1A1FFFF', '#F5F58080FFFF', '#6060BABAECEC', '#ABABB2B2BFBF', '#95959D9DCBCB', '#F0F071717878', '#C3C3E8E88D8D', '#FFFF55557272', '#8282AAAAFFFF', '#FFFFCBCB6B6B', '#67676E6E9595', '#FFFFFEFEFEFE'] -use-system-font=true -use-theme-background=false -use-theme-colors=false -use-theme-transparency=false -visible-name='Gogh' - -[:7abf49bb-24e2-4e7a-809a-e685c36c4e67] -background-color='rgb(0,43,54)' -foreground-color='rgb(131,148,150)' -use-theme-colors=false -visible-name='Solarized dark' - -[:811b5a85-5b34-46de-8df0-a66f78d2481b] -allow-bold=true -background-color='#282828282828' -bold-color='#EBEBDBDBB2B2' -bold-color-same-as-fg=true -cursor-background-color='#EBEBDBDBB2B2' -cursor-colors-set=true -cursor-foreground-color='#282828282828' -default-size-columns=120 -font='Monospace 14' -foreground-color='#EBEBDBDBB2B2' -palette=['#282828282828', '#CCCC24241D1D', '#989897971A1A', '#D7D799992121', '#454585858888', '#B1B162628686', '#68689D9D6A6A', '#A8A899998484', '#929283837474', '#FBFB49493434', '#B8B8BBBB2626', '#FAFABDBD2F2F', '#8383A5A59898', '#D3D386869B9B', '#8E8EC0C07C7C', '#EBEBDBDBB2B2'] -use-system-font=true -use-theme-background=false -use-theme-colors=false -use-theme-transparency=false -visible-name='Gruvbox Dark' - -[:8f96488e-af2a-4614-843d-e3e22a70a1fe] -background-color='rgb(238,238,236)' -foreground-color='rgb(46,52,54)' -use-theme-colors=false -visible-name='Tango light' - -[:a4897f17-21ed-48c2-8244-0942611119d3] -allow-bold=true -background-color='#222222222222' -bold-color='#d0d0d0d0d0d0' -bold-color-same-as-fg=true -cursor-background-color='#d0d0d0d0d0d0' -cursor-colors-set=true -cursor-foreground-color='#222222222222' -foreground-color='rgb(240,240,240)' -palette=['#151515151515', '#a5a53c3c2323', '#7b7b92924646', '#d3d3a0a04d4d', '#6c6c9999bbbb', '#9f9f4e4e8585', '#7d7dd6d6cfcf', '#d0d0d0d0d0d0', '#505050505050', '#a5a53c3c2323', '#7b7b92924646', '#d3d3a0a04d4d', '#54547c7c9999', '#9f9f4e4e8585', '#7d7dd6d6cfcf', '#f5f5f5f5f5f5'] -use-theme-background=false -use-theme-colors=false -use-theme-transparency=false -visible-name='Afterglow' - -[:abab88dc-1c66-4410-a83d-f302b3ffa455] -background-color='rgb(31,34,47)' -bold-color='#BFBFC7C7D5D5' -bold-color-same-as-fg=true -cursor-background-color='#BFBFC7C7D5D5' -cursor-colors-set=true -cursor-foreground-color='#29292D2D3E3E' -default-size-columns=120 -font='Monospace 14' -foreground-color='#BFBFC7C7D5D5' -palette=['#29292D2D3E3E', '#F0F071717878', '#6262DEDE8484', '#FFFFCBCB6B6B', '#7575A1A1FFFF', '#F5F58080FFFF', '#6060BABAECEC', '#ABABB2B2BFBF', '#95959D9DCBCB', '#F0F071717878', '#C3C3E8E88D8D', '#FFFF55557272', '#8282AAAAFFFF', '#FFFFCBCB6B6B', '#67676E6E9595', '#FFFFFEFEFEFE'] -use-system-font=true -use-theme-colors=false -use-theme-transparency=false -visible-name='Gogh but a bit darker' - -[:c68267a0-137c-46d9-ab69-f832ef972f93] -allow-bold=true -background-color='#282828282828' -bold-color='#D4D4BEBE9898' -bold-color-same-as-fg=true -cursor-background-color='#D4D4BEBE9898' -cursor-colors-set=true -cursor-foreground-color='#282828282828' -default-size-columns=120 -font='Monospace 14' -foreground-color='#D4D4BEBE9898' -palette=['#3C3C38383636', '#EAEA69696262', '#A9A9B6B66565', '#D8D8A6A65757', '#7D7DAEAEA3A3', '#D3D386869B9B', '#8989B4B48282', '#D4D4BEBE9898', '#3C3C38383636', '#EAEA69696262', '#A9A9B6B66565', '#D8D8A6A65757', '#7D7DAEAEA3A3', '#D3D386869B9B', '#8989B4B48282', '#D4D4BEBE9898'] -use-system-font=true -use-theme-background=false -use-theme-colors=false -use-theme-transparency=false -visible-name='Gruvbox Material' - -[:e5a751ab-9476-4fd4-bc99-075e21340016] -allow-bold=true -background-color='#FFFFFFFFFFFF' -bold-color='#4D4D4D4D4C4C' -bold-color-same-as-fg=true -cursor-background-color='#4C4C4C4C4C4C' -cursor-colors-set=true -cursor-foreground-color='#FFFFFFFFFFFF' -foreground-color='#4D4D4D4D4C4C' -palette=['#000000000000', '#C8C828282828', '#71718C8C0000', '#EAEAB7B70000', '#41417171AEAE', '#89895959A8A8', '#3E3E99999F9F', '#FFFFFEFEFEFE', '#000000000000', '#C8C828282828', '#70708B8B0000', '#E9E9B6B60000', '#41417070AEAE', '#89895858A7A7', '#3D3D99999F9F', '#FFFFFEFEFEFE'] -use-theme-background=false -use-theme-colors=false -use-theme-transparency=false -visible-name='Tomorrow' diff --git a/deploy/ansible/files/install-terminal-profiles.sh b/deploy/ansible/files/install-terminal-profiles.sh deleted file mode 100644 index cbadc2cdcf..0000000000 --- a/deploy/ansible/files/install-terminal-profiles.sh +++ /dev/null @@ -1,3 +0,0 @@ -#! /usr/bin/env bash - -dconf load /org/gnome/terminal/legacy/profiles:/ < ${HOME}/.config/user-terminal-prefs/gnome-terminal-profiles.dconf diff --git a/deploy/ansible/playbook_dev_tools.yaml b/deploy/ansible/playbook_dev_tools.yaml deleted file mode 100644 index b30cde1a16..0000000000 --- a/deploy/ansible/playbook_dev_tools.yaml +++ /dev/null @@ -1,85 +0,0 @@ ---- -############################################################## -# playbook_dev_tools.yml installs some packages that may be -# useful for developers. In addition, the apt cache is -# updated and existing packages are upgraded. -############################################################## - -- name: Install development tools - hosts: all - gather_facts: yes - become: yes - - vars: - developer: "{{ k8s_user | default('none') }}" - developer_group: "{{ k8s_group | default('none') }}" - - tasks: - - name: Update cache and upgrade existing packages - apt: - update_cache: yes - upgrade: "yes" - - - name: Install packages for development - apt: - name: - - emacs-nox - - yaml-mode - - net-tools - - - name: Skip sudo password for {{ developer }} - template: - src: sudoer.j2 - dest: /etc/sudoers.d/{{ developer }} - owner: root - group: root - mode: 0440 - when: developer != 'none' - - - name: Get home directory for {{ developer }} - shell: > - getent passwd {{ developer }} | awk -F: '{ print $6 }' - register: developer_home - changed_when: false - when: developer != 'none' - - - name: Print home directory - debug: - msg: "Developer home directory is: {{ developer_home.stdout }}" - when: developer != 'none' - - - name: Create directory for terminal profiles - file: - state: directory - path: "{{ developer_home.stdout }}/.config/user-terminal-prefs" - owner: "{{ developer }}" - group: "{{ developer_group }}" - mode: 0755 - when: developer != 'none' - - - name: Copy gnome-terminal profiles - copy: - src: gnome-terminal-profiles.dconf - dest: "{{ developer_home.stdout }}/.config/user-terminal-prefs/gnome-terminal-profiles.dconf" - owner: "{{ developer }}" - group: "{{ developer_group }}" - mode: 0644 - when: - - developer != 'none' - - developer_group != 'none' - - - name: Create ~/.local/bin - file: - state: directory - path: "{{ developer_home.stdout }}/.local/bin" - mode: 0755 - when: developer != 'none' - - - name: Copy script to install terminal profiles - copy: - src: install-terminal-profiles.sh - dest: "{{ developer_home.stdout }}/.local/bin/install-terminal-profiles" - owner: "{{ developer }}" - group: "{{ developer_group }}" - mode: 0755 - when: developer != 'none' diff --git a/deploy/ansible/playbook_wifi_ap.yml b/deploy/ansible/playbook_wifi_ap.yml deleted file mode 100644 index fc9b971ec2..0000000000 --- a/deploy/ansible/playbook_wifi_ap.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -############################################################## -# Playbook: playbook_test.yml -# -# playbook_docker.yml installs Docker, Docker Compose and any -# dependency packages. -# -############################################################## - -- name: Run Ansible Tests - hosts: all - gather_facts: yes - become: yes - - vars_files: - - "vars/config_common.yml" - - "vars/packages.yml" - - tasks: - - name: Update packages - apt: - update_cache: yes - upgrade: "yes" - - - name: Setup WiFi Access Point - import_role: - name: wifi_ap - tags: - - install diff --git a/deploy/ansible/roles/container_engine/handlers/main.yml b/deploy/ansible/roles/container_engine/handlers/main.yml deleted file mode 100644 index d10d637284..0000000000 --- a/deploy/ansible/roles/container_engine/handlers/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -- name: reboot target - reboot: - when: ansible_connection != "local" diff --git a/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml b/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml index 8346628c8e..c23ef7e510 100644 --- a/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml +++ b/deploy/ansible/roles/k8s_install/tasks/k8s_remote_access.yml @@ -1,4 +1,9 @@ --- +# +# Setup a kubeconfig file on the host machine so that users can +# connect to the target system when the host is not the target +# system. +# - name: Save {{ k8s_user_home.stdout }}/.kube/config on host fetch: src: "{{ k8s_user_home.stdout }}/.kube/config" diff --git a/deploy/ansible/roles/network_config/tasks/main.yml b/deploy/ansible/roles/network_config/tasks/main.yml index be12c36334..153991b42c 100644 --- a/deploy/ansible/roles/network_config/tasks/main.yml +++ b/deploy/ansible/roles/network_config/tasks/main.yml @@ -10,23 +10,6 @@ apt: name: network-manager -# - name: List non-network-manager config files -# find: -# paths: "/etc/netplan/" -# patterns: "00-installed.*\\.yaml" -# use_regex: yes -# register: netplan_files - -# - name: List existing netplan files -# debug: -# var: netplan_files - -# - name: Remove non-network-manager config files -# file: -# path: "{{ item.path }}" -# state: absent -# loop: "{{ netplan_files.files }}" - - name: Set network-manager as renderer copy: src: 01-network-manager-all.yaml diff --git a/deploy/scripts/setup_combine.py b/deploy/scripts/setup_combine.py index aa37b40ae8..bf3d532377 100755 --- a/deploy/scripts/setup_combine.py +++ b/deploy/scripts/setup_combine.py @@ -171,7 +171,7 @@ def get_target(config: Dict[str, Any]) -> str: try: return input("Enter the target name (Ctrl-C to cancel):") except KeyboardInterrupt: - logging.INFO("Exiting.") + logging.info("Exiting.") sys.exit(ExitStatus.FAILURE.value) diff --git a/deploy/scripts/README.md b/installer/README.md similarity index 100% rename from deploy/scripts/README.md rename to installer/README.md diff --git a/maintenance/scripts/combine-version.sh b/maintenance/scripts/combine-version.sh deleted file mode 100755 index 958d64fd58..0000000000 --- a/maintenance/scripts/combine-version.sh +++ /dev/null @@ -1,26 +0,0 @@ -#! /usr/bin/env bash - -if [ "$#" == "0" ] ; then - # Print versions - for deployment in frontend backend database maintenance ; do - VERSION=`kubectl describe deployment $deployment | grep "Image.*combine_" | sed -Ee "s/^ +Image: .*://"` - echo "$deployment: $VERSION" - done -else - echo "Set version to $1" - # Check to see if we are using public repos or private ones - VERSION_PATTERN='^v[0-9]+\.[0-9]+\.[0-9]+*$' - if [[ $1 =~ $VERSION_PATTERN ]] ; then - REPO="public.ecr.aws/thecombine/" - else - REPO="$AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com" - if ! kubectl get secrets aws-login-credentials 2>&1 >/dev/null ; then - echo "The requested version is in a private repo and this device does not have access to it." - exit 1 - fi - fi - kubectl -n thecombine set image deployment/database database="$REPO/combine_database:$1" - kubectl -n thecombine set image deployment/backend backend="$REPO/combine_backend:$1" - kubectl -n thecombine set image deployment/frontend frontend="$REPO/combine_frontend:$1" - kubectl -n thecombine set image deployment/maintenance maintenance="$REPO/combine_maint:$1" -fi From 1ce20600c8c28f29f6da794ab52c11dade13f790 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 14 Mar 2024 13:44:12 -0400 Subject: [PATCH 73/98] Remove template for sudoer file - no longer used --- deploy/ansible/templates/sudoer.j2 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 deploy/ansible/templates/sudoer.j2 diff --git a/deploy/ansible/templates/sudoer.j2 b/deploy/ansible/templates/sudoer.j2 deleted file mode 100644 index e2b42d0826..0000000000 --- a/deploy/ansible/templates/sudoer.j2 +++ /dev/null @@ -1 +0,0 @@ -{{ developer }} ALL=(ALL) NOPASSWD: ALL From 9567947767d66e4864fd397f3b5e971784972fc4 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 14 Mar 2024 13:46:06 -0400 Subject: [PATCH 74/98] Remove shutdown-the-combine function - did too many things not really related to shutdown --- deploy/scripts/install-combine | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine index 5cc037747f..0b1ec1a987 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine @@ -181,12 +181,6 @@ wait-for-combine () { done } -shutdown-the-combine () { - # Shut down the combine services and set them to not start at boot time - combinectl stop - combinectl status -} - create-dest-directory () { if [ -d ${COMBINE_DIR} ] ; then echo "The installation directory already exists. ($COMBINE_DIR)" @@ -297,13 +291,20 @@ while [ "$STATE" != "Done" ] ; do ;; Wait-for-combine) # Wait until all the combine deployments are up - echo "Waiting for The Combine to start up. This may take some time depending on your" - echo "Internet connection. Press Ctrl-C to interrupt." + echo "Waiting for The Combine components to download." + echo "This may take some time depending on your Internet connection." + echo "Press Ctrl-C to interrupt." wait-for-combine next-state "Shutdown-combine" ;; Shutdown-combine) - shutdown-the-combine + # Shut down the combine services + combinectl stop + # Disable combine services from starting at boot time + sudo systemctl disable create_ap + sudo systemctl disable k3s + # Print the current status + combinectl status next-state "Done" ;; Uninstall-combine) From 111e8202120e07d2af6c0f62a7c3789c8ccaf844 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 14 Mar 2024 13:46:48 -0400 Subject: [PATCH 75/98] Add ability to print or customize the WiFi passphrase --- .../support_tools/templates/combinectl.sh | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/deploy/ansible/roles/support_tools/templates/combinectl.sh b/deploy/ansible/roles/support_tools/templates/combinectl.sh index dda4ae36fb..2fe3ac9bbf 100755 --- a/deploy/ansible/roles/support_tools/templates/combinectl.sh +++ b/deploy/ansible/roles/support_tools/templates/combinectl.sh @@ -19,6 +19,17 @@ usage () { Note that not all releases can be updated this way. If The Combine does not run properly, download and run the updated install package. + wifi [wifi-passphrase]: + If no parameters are provieded, display the wifi + passphrase. If a new passphase is provided, the + wifi passphrase is updated to the new phrase. If + The Combine is running, it needs to be restarted. + Notes: + In general, it is best to enclose your pass phrase + in quotation marks ("). + Use + combinectl wifi "" + to clear the required passphrase. If the command is omitted or unrecognized, this usage message is printed. @@ -38,8 +49,8 @@ save-wifi-connection () { restore-wifi-connection () { if [ -f "${COMBINE_CONFIG}/wifi_connection.txt" ] ; then WIFI_CONN=`cat ${COMBINE_CONFIG}/wifi_connection.txt` - echo "Restoring connection $WIFI_CONN" if [ "$WIFI_CONN" != "--" ] ; then + echo "Restoring connection $WIFI_CONN" nmcli c up "$WIFI_CONN" fi fi @@ -102,7 +113,25 @@ combine-update () { kubectl -n thecombine set image deployment/maintenance maintenance="public.ecr.aws/thecombine/combine_maint:$IMAGE_TAG" } +combine-wifi-list-password () { + WIFI_PASSWD=`grep PASSPHRASE ${WIFI_CONFIG} | sed "s/PASSPHRASE=//g"` + echo "WiFi Password is \"${WIFI_PASSWD}\"" +} + +combine-wifi-set-password () { + if [[ ${#1} -ge 8 ]] ; then + sudo sed -i "s/PASSPHRASE=.*/PASSPHRASE=$1/" ${WIFI_CONFIG} + combine-wifi-list-password + elif [[ -z $1 ]] ; then + sudo sed -i "s/PASSPHRASE=.*/PASSPHRASE=/" ${WIFI_CONFIG} + combine-wifi-list-password + else + echo "Wifi password must be at least 8 characters long." + fi +} + WIFI_IF={{ wifi_interfaces[0] }} +WIFI_CONFIG=/etc/create_ap/create_ap.conf export KUBECONFIG=${HOME}/.kube/config COMBINE_CONFIG=${HOME}/.config/combine @@ -124,6 +153,13 @@ case "$1" in combine-cert;; update) combine-update $2;; + wifi) + if [[ $# -eq 1 ]] ; then + combine-wifi-list-password + else + combine-wifi-set-password $2 + fi + ;; *) echo -e "Unrecognized command: \"$1\".\n" usage;; From 09b1ce68384e8ac02be22f00700f69c714a17f82 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 14:50:46 -0400 Subject: [PATCH 76/98] Fill in installation instructions --- installer/README.md | 149 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 140 insertions(+), 9 deletions(-) diff --git a/installer/README.md b/installer/README.md index 689378fcdd..df43e9c207 100644 --- a/installer/README.md +++ b/installer/README.md @@ -1,19 +1,150 @@ -# Installing The Combine +# How to Install _The Combine_ -## Running the script +This README describes how to install _The Combine_ Rapid Word Collection tool on a laptop or desktop PC. -1. Download the installation script from - [https://s3.amazonaws.com/software.thecombine.app/combine-installer.run](https://s3.amazonaws.com/software.thecombine.app/combine-installer.run) -2. Open a terminal window (Ctrl-Alt-T) and run the script: +## Contents + +1. [System Requirements](#system-requirements) +2. [Install _The Combine_](#install-the-combine) +3. [Running _The Combine_](#running-the-combine) +4. [Advanced Installation Options](#advanced-installation-options) + +### System Requirements + +_The Combine_ can be installed on a PC that meets the following requirements: + +- Debian-based Linux Operating system, such as _Ubuntu_ or _Wasta Linux_; +- 6 GB of memory; +- WiFi interface that supports creating a WiFi Hotspot; +- a wired-ethernet connection to the Internet +- User account that can run as `root` with `sudo`. + +### Install _The Combine_ + +1. Plug in the wired ethernet connection to the Internet. +2. Update all of the existing software packages through your OS's _Software Updater_ application or by running: ```bash - cd + sudo apt update && sudo apt upgrade -y + ``` + + This step is optional but will make the installation process go more smoothly. Restart the PC if requested. + +3. Download the installation script from + [https://s3.amazonaws.com/software.thecombine.app/combine-installer.run](https://s3.amazonaws.com/software.thecombine.app/combine-installer.run) +4. Open a terminal window (Ctrl-Alt-T) and run the script: + + ```console + cd [path where installer was downloaded] ./combine-installer.run ``` -3. Once installation is complete, you can use the `combinectl` command to start/stop _The Combine_. Type - `combinectl --help` to get a description of the possible commands: + Notes: + + - The installation script requires elevated privileges to run most of its tasks. You may be prompted for your + password in two ways: + + `[sudo] password for {your username}:` + + or + + `BECOME password:` + + - The first time you run the installation script, it will prompt you for an `AWS_ACCESS_KEY_ID` and an + `AWS_SECRET_ACCESS_KEY`. To get the values to enter here, send a request to the team at + [The Combine](https://software.sil.org/thecombine/#contact) + - When run with no options, ./combine-installer.run will install the current version of _The Combine_. + - If the previous installation did not run to completion, it will resume where the previous installation left off. + +_The Combine_ will not be running when installation is complete. + +## Running _The Combine_ + +### Start _The Combine_ + +To start _The Combine_, open a terminal window and run: + +```console +combinectl start +``` + +### Connecting to _The Combine_ -```bash +Once _The Combine_ has been started it will create a WiFi hotspot for users to access _The Combine_ using any WiFi +enabled device with a browser. It can also be accessed using the browser directly on the machine where _The Combine_ is +running. + +#### Connecting to the WiFi Hotspot + +The wireless network name will be `thecombine_ap`. You can connect your device to this network using the passphrase +`Combine2020`. + +If you would like to change the WiFi passphrase, see the options described in [combinectl Tool](#combinectl-tool). + +#### Connecting to the App + +Open a web browser and navigate to [local.thecombine.app](https://local.thecombine.app). + +If your browser tries to do a web search, add the `https://` to the beginning, that is, +[https://local.thecombine.app](https://local.thecombine.app) + +### Shutting Down _The Combine_ + +To shutdown _The Combine_, open a terminal window and run: + +```console +combinectl stop +``` + +### combinectl Tool + +Once installation is complete, you can use the `combinectl` command to manage the installation. The `combinectl` command +is entered in a terminal window as `combinectl COMMAND [parameters]` The possible commands are: + +| Command | Parameters | Description | +| ------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| help | N/A | Print a usage message. | +| start | N/A | Start the combine services. | +| stop | N/A | Stop the combine services. | +| status | N/A | List the status for the combine services. | +| cert | N/A | Print the expiration date for the web certificate. | +| update | release-number | Update the version of The Combine to the "release-number" specified. You can see the number of the latest release at [The Combine on GitHub](https://github.com/sillsdev/TheCombine/releases). Note that not all releases can be updated this way. If The Combine does not run properly, download and run the updated install package. | +| wifi | [wifi-passphrase] | If no wifi-passphrase is provieded, the current wifi passphrase is printed. If a new passphase is provided, the wifi passphrase is updated to the new phrase. If your passphrase has spaces or special characters, it is best to enclose your pass phrase in quotation marks (""). | + +If the command is omitted or unrecognized, the help message is printed. + +### Maintaining _The Combine's_ Web Interface + +_The Combine_ requires a web site certificate to be able to provide a secure connection between _The Combine_ and the +web browsers used to enter and cleanup the data. Having a secure connection prevents the browsers from asking the users +to override their security settings. + +_The Combine_ refreshes its certificate when it is connected to the Internet via a wired Ethernet connection. A +certificate will be valid for a time between 60 and 90 days. You can use `combinectl` to view when your current +certificate will expire, for example: + +```console ``` + +## Advanced Installation Options + +To run `combine-installer.run` with options, the option list must be started with `--`. + +`combine-installer.run` supports the following options: + +| option | description | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| clean | Remove the previously saved environment (AWS Access Key, admin user info) before performing the installation. | +| restart | Run the installation from the beginning; do not resume a previous installation. | +| uninstall | Remove software installed by this script. | +| update | Update _The Combine_ to the version number provided. This skips installing the support software that was installed previously. | +| version-number | Specify a version to install instead of the current version. A version number will have the form `vn.n.n` where `n` represents an integer value, for example, `v1.20.0`. | + +### Examples + +| Command | Effect | +| ------------------------------------------ | ------------------------------------------------------------ | +| `./combine-installer.run -- v1.16.0` | Install version `v1.16.0` of _The Combine_. | +| `./combine-installer.run -- update v2.1.0` | Update an existing Combine installation to version `v2.1.0` | +| `./combine-installer.run -- restart` | Restart the current installation process from the beginning. | From 84f8944501ee47c1a3135a4d63155e74364defd4 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 14:51:55 -0400 Subject: [PATCH 77/98] Pass Combine version to installer --- installer/make-combine-installer.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/installer/make-combine-installer.sh b/installer/make-combine-installer.sh index d5c7938338..bc1447f931 100755 --- a/installer/make-combine-installer.sh +++ b/installer/make-combine-installer.sh @@ -1,3 +1,9 @@ #! /usr/bin/env bash -makeself --tar-quietly ../deploy ./combine-installer.run "Combine Installer" scripts/install-combine +if [[ $# -gt 0 ]] ; then + COMBINE_VERSION=$1 +fi +if [ -z "${COMBINE_VERSION}" ] ; then + read -p "Enter Combine version to install: " COMBINE_VERSION +fi +makeself --tar-quietly ../deploy ./combine-installer.run "Combine Installer" scripts/install-combine.sh ${COMBINE_VERSION} From b01f674d8d87cabe1fcbf593e5bb48718122f4f2 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 14:52:24 -0400 Subject: [PATCH 78/98] Add ability to print/set WiFi Password --- .../support_tools/templates/combinectl.sh | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/deploy/ansible/roles/support_tools/templates/combinectl.sh b/deploy/ansible/roles/support_tools/templates/combinectl.sh index 2fe3ac9bbf..3f1da1ece3 100755 --- a/deploy/ansible/roles/support_tools/templates/combinectl.sh +++ b/deploy/ansible/roles/support_tools/templates/combinectl.sh @@ -3,7 +3,7 @@ usage () { cat << .EOM Usage: - $0 COMMAND [parameters] + combinectl COMMAND [parameters] Commands: help: Print this usage message. @@ -22,27 +22,32 @@ usage () { wifi [wifi-passphrase]: If no parameters are provieded, display the wifi passphrase. If a new passphase is provided, the - wifi passphrase is updated to the new phrase. If - The Combine is running, it needs to be restarted. - Notes: - In general, it is best to enclose your pass phrase - in quotation marks ("). - Use - combinectl wifi "" - to clear the required passphrase. + wifi passphrase is updated to the new phrase. + If your passphrase has spaces or special characters, + it is best to enclose your pass phrase in quotation marks (""). If the command is omitted or unrecognized, this usage message is printed. .EOM } +get-wifi-if () { + IFS=$'\n' WIFI_DEVICES=( $(nmcli d | grep "^wl") ) + if [[ {{ '${#WIFI_DEVICES[@]}' }} -gt 0 ]] ; then + IFS=' ' read -r -a IFNAME <<< "${WIFI_DEVICES[0]}" + echo "${IFNAME[0]}" + else + echo "" + fi +} + save-wifi-connection () { # get the name of the WiFi Connection WIFI_CONN=`nmcli d show "$WIFI_IF" | grep "^GENERAL.CONNECTION" | sed "s|^GENERAL.CONNECTION: *||"` # save it so we can restore it later echo "$WIFI_CONN" > ${COMBINE_CONFIG}/wifi_connection.txt if [ "$WIFI_CONN" != "--" ] ; then - nmcli c down "$WIFI_CONN" + sudo nmcli c down "$WIFI_CONN" fi } @@ -50,8 +55,8 @@ restore-wifi-connection () { if [ -f "${COMBINE_CONFIG}/wifi_connection.txt" ] ; then WIFI_CONN=`cat ${COMBINE_CONFIG}/wifi_connection.txt` if [ "$WIFI_CONN" != "--" ] ; then - echo "Restoring connection $WIFI_CONN" - nmcli c up "$WIFI_CONN" + echo "Restoring connection ${WIFI_CONN}" + sudo nmcli c up "${WIFI_CONN}" fi fi } @@ -119,18 +124,20 @@ combine-wifi-list-password () { } combine-wifi-set-password () { - if [[ ${#1} -ge 8 ]] ; then + # Check that the passphrase is at least 8 characters long + if [[ {{ '${#1}' }} -ge 8 ]] ; then sudo sed -i "s/PASSPHRASE=.*/PASSPHRASE=$1/" ${WIFI_CONFIG} - combine-wifi-list-password - elif [[ -z $1 ]] ; then - sudo sed -i "s/PASSPHRASE=.*/PASSPHRASE=/" ${WIFI_CONFIG} + if systemctl is-active --quiet create_ap ; then + sudo systemctl restart create_ap + sudo systemctl restart systemd-resolved + fi combine-wifi-list-password else echo "Wifi password must be at least 8 characters long." fi } -WIFI_IF={{ wifi_interfaces[0] }} +WIFI_IF=$(get-wifi-if) WIFI_CONFIG=/etc/create_ap/create_ap.conf export KUBECONFIG=${HOME}/.kube/config COMBINE_CONFIG=${HOME}/.config/combine From 9678248f5d2f6a0d5c1c2ba9dc6da580bef4f761 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 14:52:50 -0400 Subject: [PATCH 79/98] Convert README.md to README.pdf --- .gitignore | 1 + installer/make-readme-pdf.sh | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100755 installer/make-readme-pdf.sh diff --git a/.gitignore b/.gitignore index c047b19fe4..add9aefeb1 100644 --- a/.gitignore +++ b/.gitignore @@ -84,6 +84,7 @@ database/semantic_domains/* # Combine installer installer/combine-installer.run installer/makeself-* +installer/README.pdf # Kubernetes Configuration files **/site_files/ diff --git a/installer/make-readme-pdf.sh b/installer/make-readme-pdf.sh new file mode 100755 index 0000000000..fcc91ae388 --- /dev/null +++ b/installer/make-readme-pdf.sh @@ -0,0 +1,7 @@ +#! /usr/bin/env bash + +# Required packages: +# - pandoc +# - weasyprint + +pandoc --pdf-engine=weasyprint README.md -o README.pdf From d48f17f230b59b069468e0b2f7341f08af23c1c1 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 14:53:35 -0400 Subject: [PATCH 80/98] Add 'sudo' to connection delete --- deploy/scripts/uninstall-combine | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/scripts/uninstall-combine b/deploy/scripts/uninstall-combine index 15324e5d9e..aa27e2f99d 100755 --- a/deploy/scripts/uninstall-combine +++ b/deploy/scripts/uninstall-combine @@ -46,7 +46,7 @@ fi # Remove network configurations if nmcli c show dummy-vip >/dev/null 2>&1 ; then - nmcli c delete dummy-vip + sudo nmcli c delete dummy-vip fi # delete create_ap files From aada4b6303b3d0cd3befab9a7551c2f6659aa4ff Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 14:54:14 -0400 Subject: [PATCH 81/98] Add Desktop configuration for The Combine charts --- .../scripts/setup_files/combine_config.yaml | 3 +- .../scripts/setup_files/profiles/desktop.yaml | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 deploy/scripts/setup_files/profiles/desktop.yaml diff --git a/deploy/scripts/setup_files/combine_config.yaml b/deploy/scripts/setup_files/combine_config.yaml index 5adfff5e3a..76de8d18ab 100644 --- a/deploy/scripts/setup_files/combine_config.yaml +++ b/deploy/scripts/setup_files/combine_config.yaml @@ -19,10 +19,9 @@ targets: global: serverName: thecombine.localhost desktop: - profile: nuc + profile: desktop env_vars_required: false override: - # override values for 'thecombine' chart thecombine: global: serverName: local.thecombine.app diff --git a/deploy/scripts/setup_files/profiles/desktop.yaml b/deploy/scripts/setup_files/profiles/desktop.yaml new file mode 100644 index 0000000000..7a30eaab80 --- /dev/null +++ b/deploy/scripts/setup_files/profiles/desktop.yaml @@ -0,0 +1,35 @@ +--- +################################################ +# Profile specific configuration items +# +# Profile: nuc +################################################ + +charts: + thecombine: + # Disable AWS Login - only run released images from + # public.ecr.aws/thecombine + aws-login: + enabled: false + global: + awsS3Location: local.thecombine.app + combineSmtpUsername: "" + imagePullPolicy: IfNotPresent + pullSecretName: None + frontend: + configOffline: true + configEmailEnabled: false + maintenance: + localLangList: + - "ar" + - "en" + - "es" + - "fr" + - "pt" + - "zh" + + cert-proxy-client: + enabled: true + schedule: "*/5 * * * *" + certManager: + enabled: false From 517801d2a414f646322d65af97622dbca856e657 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 15:00:36 -0400 Subject: [PATCH 82/98] Updates to install script - Remove setting of variables for admin account - No more default version - must be passed in as an argument or environment variable. Yhe installation script will pass it in via the command line. --- .../{install-combine => install-combine.sh} | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) rename deploy/scripts/{install-combine => install-combine.sh} (94%) diff --git a/deploy/scripts/install-combine b/deploy/scripts/install-combine.sh similarity index 94% rename from deploy/scripts/install-combine rename to deploy/scripts/install-combine.sh index 0b1ec1a987..ef32528360 100755 --- a/deploy/scripts/install-combine +++ b/deploy/scripts/install-combine.sh @@ -22,19 +22,11 @@ set-combine-env () { for your normal word collection work. The default username is admin. .EOM - read -p "Enter name for the site admin account: " COMBINE_ADMIN_USERNAME - if [ -z "${COMBINE_ADMIN_USERNAME}" ] ; then - COMBINE_ADMIN_USERNAME=admin - fi - COMBINE_ADMIN_PASSWORD=$(get-password "Enter a password for the ${COMBINE_ADMIN_USERNAME} account:") - echo -e "\n" read -p "Enter AWS_ACCESS_KEY_ID: " AWS_ACCESS_KEY_ID read -p "Enter AWS_SECRET_ACCESS_KEY: " AWS_SECRET_ACCESS_KEY # write collected values and static values to config file cat <<.EOF > ${CONFIG_DIR}/env export COMBINE_JWT_SECRET_KEY="${COMBINE_JWT_SECRET_KEY}" - export COMBINE_ADMIN_PASSWORD="${COMBINE_ADMIN_PASSWORD}" - export COMBINE_ADMIN_USERNAME="${COMBINE_ADMIN_USERNAME}" export AWS_DEFAULT_REGION="us-east-1" export AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" export AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" @@ -110,7 +102,7 @@ copy-install-scripts () { "scripts/setup_combine.py"\ "scripts/setup_files/cluster_config.yaml"\ "scripts/setup_files/combine_config.yaml"\ - "scripts/setup_files/profiles/nuc.yaml"\ + "scripts/setup_files/profiles/desktop.yaml"\ "scripts/utils.py") for script_file in "${script_files[@]}" ; do # create the destination directory if necessary @@ -208,7 +200,6 @@ next-state () { # Setup initial variables INSTALL_DIR=`pwd` COMBINE_DIR=${HOME}/thecombine -COMBINE_VERSION="${COMBINE_VERSION:-v1.2.0}" # Create directory for configuration files CONFIG_DIR=${HOME}/.config/combine mkdir -p ${CONFIG_DIR} @@ -255,6 +246,12 @@ while (( "$#" )) ; do shift done +# Check that we have a COMBINE_VERSION +if [ -z "${COMBINE_VERSION}" ] ; then + echo "Combine version is not specified." + exit 1 +fi + # Step through the installation stages while [ "$STATE" != "Done" ] ; do case $STATE in From e15b069c7d513534ed1d8e2b7598723fa77e16b2 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 15:22:29 -0400 Subject: [PATCH 83/98] Update project readme --- README.md | 28 ++++++++++++++++++++++++++++ installer/make-readme-pdf.sh | 7 ------- 2 files changed, 28 insertions(+), 7 deletions(-) delete mode 100755 installer/make-readme-pdf.sh diff --git a/README.md b/README.md index 21994cb538..1641fdc4da 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,16 @@ A rapid word collection tool. See the [User Guide](https://sillsdev.github.io/Th `dotnet tool update --global dotnet-reportgenerator-globaltool --version 5.0.4` 11. [dotnet-project-licenses](https://github.com/tomchavakis/nuget-license) `dotnet tool update --global dotnet-project-licenses` +12. Tools for generating the self installer [Linux Only]: + + - [makeself](https://makeself.io/) - a tool to make self-extracting archives in Unix + - [pandoc](https://pandoc.org/installing.html#linux) - a tool to convert Markdown documents to PDF. In addition to + `pandoc`, the `weasyprint` PDF engine is required. These may be installed on Debian-based distributions by + running: + + ```console + sudo apt install -y pandoc weasyprint + ``` ### Prepare the Environment @@ -505,6 +515,24 @@ of development setup errors. Run from within a Python virtual environment. python scripts/cleanup_local_repo.py ``` +### Generate Installer Script for The Combine + +_Linux Only_ + +To generate the installer script, run the following commands starting in the project top level directory: + +```console +cd installer +./make-combine-installer.sh +``` + +To update the PDF copy of the README.md that accompanies the installer, run the following from the `installer` +directory: + +```console +pandoc --pdf-engine=weasyprint README.md -o README.pdf +``` + ## Setup Local Kubernetes Cluster This section describes how to create a local Kubernetes cluster using either _Rancher Desktop_ or _Docker Desktop_. diff --git a/installer/make-readme-pdf.sh b/installer/make-readme-pdf.sh deleted file mode 100755 index fcc91ae388..0000000000 --- a/installer/make-readme-pdf.sh +++ /dev/null @@ -1,7 +0,0 @@ -#! /usr/bin/env bash - -# Required packages: -# - pandoc -# - weasyprint - -pandoc --pdf-engine=weasyprint README.md -o README.pdf From c5e683842f11c4d61c571f992160272e1e8a8c01 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 18 Mar 2024 15:23:26 -0400 Subject: [PATCH 84/98] Address markdown lint issue --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 1641fdc4da..cd0634d7e9 100644 --- a/README.md +++ b/README.md @@ -515,9 +515,7 @@ of development setup errors. Run from within a Python virtual environment. python scripts/cleanup_local_repo.py ``` -### Generate Installer Script for The Combine - -_Linux Only_ +### Generate Installer Script for The Combine (_Linux Only_) To generate the installer script, run the following commands starting in the project top level directory: From 9403b26d1034e55950b2349b75dbf1f9fe7aa11a Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 19 Mar 2024 11:23:06 -0400 Subject: [PATCH 85/98] move combinectl.sh from templates to files - there are no templated features --- .../roles/support_tools/{templates => files}/combinectl.sh | 4 ++-- deploy/ansible/roles/support_tools/tasks/main.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename deploy/ansible/roles/support_tools/{templates => files}/combinectl.sh (98%) diff --git a/deploy/ansible/roles/support_tools/templates/combinectl.sh b/deploy/ansible/roles/support_tools/files/combinectl.sh similarity index 98% rename from deploy/ansible/roles/support_tools/templates/combinectl.sh rename to deploy/ansible/roles/support_tools/files/combinectl.sh index 3f1da1ece3..5838eda9a5 100755 --- a/deploy/ansible/roles/support_tools/templates/combinectl.sh +++ b/deploy/ansible/roles/support_tools/files/combinectl.sh @@ -33,7 +33,7 @@ usage () { get-wifi-if () { IFS=$'\n' WIFI_DEVICES=( $(nmcli d | grep "^wl") ) - if [[ {{ '${#WIFI_DEVICES[@]}' }} -gt 0 ]] ; then + if [[ ${#WIFI_DEVICES[@]} -gt 0 ]] ; then IFS=' ' read -r -a IFNAME <<< "${WIFI_DEVICES[0]}" echo "${IFNAME[0]}" else @@ -125,7 +125,7 @@ combine-wifi-list-password () { combine-wifi-set-password () { # Check that the passphrase is at least 8 characters long - if [[ {{ '${#1}' }} -ge 8 ]] ; then + if [[ ${#1} -ge 8 ]] ; then sudo sed -i "s/PASSPHRASE=.*/PASSPHRASE=$1/" ${WIFI_CONFIG} if systemctl is-active --quiet create_ap ; then sudo systemctl restart create_ap diff --git a/deploy/ansible/roles/support_tools/tasks/main.yml b/deploy/ansible/roles/support_tools/tasks/main.yml index eedd85ce43..28c4a0aaa9 100644 --- a/deploy/ansible/roles/support_tools/tasks/main.yml +++ b/deploy/ansible/roles/support_tools/tasks/main.yml @@ -31,7 +31,7 @@ {{ ansible_facts.interfaces }} - name: Install combinectl tool - template: + copy: src: combinectl.sh dest: /usr/local/bin/combinectl owner: root From a266d3b8315833b2f2a2377a1c3f066eacfcc823 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 19 Mar 2024 11:25:59 -0400 Subject: [PATCH 86/98] Remove interactive part of make-combine-installer.sh --- README.md | 7 ++++--- installer/make-combine-installer.sh | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cd0634d7e9..426c0acfa9 100644 --- a/README.md +++ b/README.md @@ -521,11 +521,12 @@ To generate the installer script, run the following commands starting in the pro ```console cd installer -./make-combine-installer.sh +./make-combine-installer.sh combine-release-number ``` -To update the PDF copy of the README.md that accompanies the installer, run the following from the `installer` -directory: +where `combine-release-number` is the Combine release to be installed, e.g. `v1.2.0`. + +To update the PDF copy of the installer README.md file, run the following from the `installer` directory: ```console pandoc --pdf-engine=weasyprint README.md -o README.pdf diff --git a/installer/make-combine-installer.sh b/installer/make-combine-installer.sh index bc1447f931..81ad3fdfdd 100755 --- a/installer/make-combine-installer.sh +++ b/installer/make-combine-installer.sh @@ -4,6 +4,7 @@ if [[ $# -gt 0 ]] ; then COMBINE_VERSION=$1 fi if [ -z "${COMBINE_VERSION}" ] ; then - read -p "Enter Combine version to install: " COMBINE_VERSION + echo "COMBINE_VERSION is not set." + exit 1 fi makeself --tar-quietly ../deploy ./combine-installer.run "Combine Installer" scripts/install-combine.sh ${COMBINE_VERSION} From be324df06e0cb911d4775e5bdd5cc3637e9cb009 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 19 Mar 2024 11:52:09 -0400 Subject: [PATCH 87/98] Add instructions to make script executable --- installer/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/installer/README.md b/installer/README.md index df43e9c207..9700f6e162 100644 --- a/installer/README.md +++ b/installer/README.md @@ -32,7 +32,14 @@ _The Combine_ can be installed on a PC that meets the following requirements: 3. Download the installation script from [https://s3.amazonaws.com/software.thecombine.app/combine-installer.run](https://s3.amazonaws.com/software.thecombine.app/combine-installer.run) -4. Open a terminal window (Ctrl-Alt-T) and run the script: +4. Open a terminal window (Ctrl-Alt-T) and make the script executable: + + ```console + cd [path where installer was downloaded] + chmod +x combine-installer.run + ``` + +5. Run the script: ```console cd [path where installer was downloaded] From acadac47c0cf5c0e159179d1725607b481c93989 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 19 Mar 2024 14:15:20 -0400 Subject: [PATCH 88/98] set SSID to thecombine_ap for desktop installations --- deploy/ansible/host_vars/localhost/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index faabde0d7f..18a9cd416e 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -50,7 +50,7 @@ eth_optional: yes ################################################ has_wifi: yes ap_domain: thecombine.app -ap_ssid: "{{ansible_hostname}}_ap" +ap_ssid: "thecombine_ap" ap_passphrase: "Combine2020" ap_gateway: "10.10.10.1" ap_hostname: "local" From 45ba3a562a48036d4744278f9afe2cd9873bbec5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 19 Mar 2024 14:15:36 -0400 Subject: [PATCH 89/98] Add comments --- .../roles/support_tools/files/combinectl.sh | 46 +++++++++++++------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/deploy/ansible/roles/support_tools/files/combinectl.sh b/deploy/ansible/roles/support_tools/files/combinectl.sh index 5838eda9a5..c6ee73f1ae 100755 --- a/deploy/ansible/roles/support_tools/files/combinectl.sh +++ b/deploy/ansible/roles/support_tools/files/combinectl.sh @@ -31,6 +31,9 @@ usage () { .EOM } +# Get the name of the first wifi interface. In general, +# this script assumes that there is a single WiFi interface +# installed. get-wifi-if () { IFS=$'\n' WIFI_DEVICES=( $(nmcli d | grep "^wl") ) if [[ ${#WIFI_DEVICES[@]} -gt 0 ]] ; then @@ -41,6 +44,18 @@ get-wifi-if () { fi } +# Restart a WiFi connection that was saved previously +restore-wifi-connection () { + if [ -f "${COMBINE_CONFIG}/wifi_connection.txt" ] ; then + WIFI_CONN=`cat ${COMBINE_CONFIG}/wifi_connection.txt` + if [ "$WIFI_CONN" != "--" ] ; then + echo "Restoring connection ${WIFI_CONN}" + sudo nmcli c up "${WIFI_CONN}" + fi + fi +} + +# Save the current WiFi connection and then shut it down save-wifi-connection () { # get the name of the WiFi Connection WIFI_CONN=`nmcli d show "$WIFI_IF" | grep "^GENERAL.CONNECTION" | sed "s|^GENERAL.CONNECTION: *||"` @@ -51,16 +66,14 @@ save-wifi-connection () { fi } -restore-wifi-connection () { - if [ -f "${COMBINE_CONFIG}/wifi_connection.txt" ] ; then - WIFI_CONN=`cat ${COMBINE_CONFIG}/wifi_connection.txt` - if [ "$WIFI_CONN" != "--" ] ; then - echo "Restoring connection ${WIFI_CONN}" - sudo nmcli c up "${WIFI_CONN}" - fi - fi +# Print the expiration date of the TLS Certificate +combine-cert () { + SECRET_NAME=`kubectl -n thecombine get secrets --field-selector type=kubernetes.io/tls -o name` + CERT_DATA=`kubectl -n thecombine get $SECRET_NAME -o "jsonpath={.data['tls\.crt']}"` + echo $CERT_DATA | base64 -d | openssl x509 -enddate -noout| sed -e "s/^notAfter=/Web certificate expires at /" } +# Start The Combine services combine-start () { echo "Starting The Combine." if ! systemctl is-active --quiet create_ap ; then @@ -73,6 +86,8 @@ combine-start () { fi } +# Stop The Combine services and restore the WiFI +# connection if needed. combine-stop () { echo "Stopping The Combine." if systemctl is-active --quiet k3s ; then @@ -85,6 +100,9 @@ combine-stop () { fi } +# Print the status of The Combine services. If the combine is +# "up" then also print that status of the deployments in +# "thecombine" namespace. combine-status () { if systemctl is-active --quiet create_ap ; then echo "WiFi hotspot is Running." @@ -99,12 +117,9 @@ combine-status () { fi } -combine-cert () { - SECRET_NAME=`kubectl -n thecombine get secrets --field-selector type=kubernetes.io/tls -o name` - CERT_DATA=`kubectl -n thecombine get $SECRET_NAME -o "jsonpath={.data['tls\.crt']}"` - echo $CERT_DATA | base64 -d | openssl x509 -enddate -noout| sed -e "s/^notAfter=/Web certificate expires at /" -} - +# Update the image used in each of the deployments in The Combine. This +# is akin to our current update process for Production and QA servers. It +# does *not* update any configuration files or secrets. combine-update () { echo "Updating The Combine to $1" IMAGE_TAG=$1 @@ -118,11 +133,13 @@ combine-update () { kubectl -n thecombine set image deployment/maintenance maintenance="public.ecr.aws/thecombine/combine_maint:$IMAGE_TAG" } +# Print the current password for the WiFi Access point combine-wifi-list-password () { WIFI_PASSWD=`grep PASSPHRASE ${WIFI_CONFIG} | sed "s/PASSPHRASE=//g"` echo "WiFi Password is \"${WIFI_PASSWD}\"" } +# Set the password for the WiFi Access point combine-wifi-set-password () { # Check that the passphrase is at least 8 characters long if [[ ${#1} -ge 8 ]] ; then @@ -137,6 +154,7 @@ combine-wifi-set-password () { fi } +# Main script entrypoint WIFI_IF=$(get-wifi-if) WIFI_CONFIG=/etc/create_ap/create_ap.conf export KUBECONFIG=${HOME}/.kube/config From 003f2cd888f5e343e4ab8916c12e457ac092a84e Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 19 Mar 2024 14:51:15 -0400 Subject: [PATCH 90/98] Remove dead code; add comments to script --- deploy/scripts/install-combine.sh | 42 ++++++++++++++----------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/deploy/scripts/install-combine.sh b/deploy/scripts/install-combine.sh index ef32528360..f7b6c21c49 100755 --- a/deploy/scripts/install-combine.sh +++ b/deploy/scripts/install-combine.sh @@ -1,15 +1,8 @@ #! /usr/bin/env bash -get-password () { - PASS1="foo" - PASS2="bar" - while [ "$PASS1" != "$PASS2" ] ; do - read -s -p "$1 " PASS1 - read -s -p $'\n'"Confirm password: " PASS2 - done - echo "$PASS1" -} - +# Set the environment variables that are required by The Combine. +# In addition, the values are stored in a file so that they do not +# need to be re-entered on subsequent installations. set-combine-env () { if [ ! -f "${CONFIG_DIR}/env" ] ; then # Generate JWT Secret Key @@ -37,6 +30,8 @@ set-combine-env () { source ${CONFIG_DIR}/env } +# Create the virtual environment needed by the Python installation +# scripts create-python-venv () { cd $INSTALL_DIR # Install required packages @@ -50,8 +45,9 @@ create-python-venv () { python -m piptools sync requirements.txt } +# Install Kubernetes engine and other supporting +# software install-kubernetes () { - ##### # Let the user know what to expect cat << .EOM @@ -68,6 +64,9 @@ install-kubernetes () { ansible-playbook playbook_desktop_setup.yaml -K -e k8s_user=`whoami` } +# Set the KUBECONFIG environment variable so that the cluster can +# be reached by the installation scripts. It also starts the k3s +# service if it is not already running. set-k3s-env () { ##### # Setup kubectl configuration file @@ -84,6 +83,7 @@ set-k3s-env () { fi } +# Copy the installation scripts to a combine directory. copy-install-scripts () { # Copy the Python virtual environment cp -r ${INSTALL_DIR}/venv ${COMBINE_DIR} @@ -112,6 +112,8 @@ copy-install-scripts () { done } +# Install the public charts used by The Combine, specifically, cert-manager +# and nginx-ingress-controller install-required-charts () { set-k3s-env ##### @@ -128,6 +130,7 @@ install-required-charts () { deactivate } +# Install The Combine install-the-combine () { ##### # Setup The Combine @@ -140,17 +143,7 @@ install-the-combine () { deactivate } -#! /usr/bin/env bash - -get-deployment-status () { - deployment=$1 - results=$2 - - # echo "Results: ${results}" >&2 - status=$(echo ${results} | grep "${deployment}" | sed "s/^.*\([0-9]\)\/1.*/\1/") - echo ${status} -} - +# Wait until all the combine deployments are "Running" wait-for-combine () { # Wait for all combine deployments to be up while true ; do @@ -159,7 +152,7 @@ wait-for-combine () { # set it to false combine_up=true for deployment in frontend backend database maintenance ; do - deployment_status=$(get-deployment-status "${deployment}" "${combine_status}") + deployment_status=$(echo ${combine_status} | grep "${deployment}" | sed "s/^.*\([0-9]\)\/1.*/\1/") if [ "$deployment_status" == "0" ] ; then combine_up=false break @@ -173,6 +166,7 @@ wait-for-combine () { done } +# Create directory for the combine scripts create-dest-directory () { if [ -d ${COMBINE_DIR} ] ; then echo "The installation directory already exists. ($COMBINE_DIR)" @@ -187,6 +181,8 @@ create-dest-directory () { fi } +# Set the next value for STATE and record it in +# the STATE_FILE next-state () { STATE=$1 if [[ "${STATE}" == "Done" && -f "${STATE_FILE}" ]] ; then From b14c3aabe51b96951cda30406f00e89e7f878ffa Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Tue, 19 Mar 2024 15:07:35 -0400 Subject: [PATCH 91/98] Remove copy of scripts to secondary directory for running --- deploy/scripts/install-combine.sh | 55 +++---------------------------- 1 file changed, 4 insertions(+), 51 deletions(-) diff --git a/deploy/scripts/install-combine.sh b/deploy/scripts/install-combine.sh index f7b6c21c49..5c9d3e7fa7 100755 --- a/deploy/scripts/install-combine.sh +++ b/deploy/scripts/install-combine.sh @@ -83,35 +83,6 @@ set-k3s-env () { fi } -# Copy the installation scripts to a combine directory. -copy-install-scripts () { - # Copy the Python virtual environment - cp -r ${INSTALL_DIR}/venv ${COMBINE_DIR} - # Update the Python virtual environment to use its new location - find ${COMBINE_DIR}/venv/bin -type f -exec sed -i "s|${INSTALL_DIR}|${COMBINE_DIR}|g" {} \; - # Copy the Helm charts - cp -r ${INSTALL_DIR}/helm ${COMBINE_DIR} - # Copy the Python scripts - only copy the scripts required for installation/updating - # The Combine - script_files=("scripts/app_release.py"\ - "scripts/aws_env.py"\ - "scripts/combine_charts.py"\ - "scripts/enum_types.py"\ - "scripts/kube_env.py"\ - "scripts/setup_cluster.py"\ - "scripts/setup_combine.py"\ - "scripts/setup_files/cluster_config.yaml"\ - "scripts/setup_files/combine_config.yaml"\ - "scripts/setup_files/profiles/desktop.yaml"\ - "scripts/utils.py") - for script_file in "${script_files[@]}" ; do - # create the destination directory if necessary - mkdir -p `dirname ${COMBINE_DIR}/$script_file` - # copy the script file - cp ${INSTALL_DIR}/${script_file} ${COMBINE_DIR}/${script_file} - done -} - # Install the public charts used by The Combine, specifically, cert-manager # and nginx-ingress-controller install-required-charts () { @@ -123,9 +94,9 @@ install-required-charts () { ##### # Setup required cluster services - cd ${COMBINE_DIR} + cd ${INSTALL_DIR} . venv/bin/activate - cd ${COMBINE_DIR}/scripts + cd ${INSTALL_DIR}/scripts ./setup_cluster.py deactivate } @@ -134,9 +105,9 @@ install-required-charts () { install-the-combine () { ##### # Setup The Combine - cd ${COMBINE_DIR} + cd ${INSTALL_DIR} . venv/bin/activate - cd ${COMBINE_DIR}/scripts + cd ${INSTALL_DIR}/scripts set-combine-env set-k3s-env ./setup_combine.py --tag ${COMBINE_VERSION} --repo public.ecr.aws/thecombine --target desktop @@ -166,21 +137,6 @@ wait-for-combine () { done } -# Create directory for the combine scripts -create-dest-directory () { - if [ -d ${COMBINE_DIR} ] ; then - echo "The installation directory already exists. ($COMBINE_DIR)" - read -p "Overwrite? (Y/n)" CONTINUE - if [[ -z $CONTINUE || "$CONTINUE" =~ ^[Yy] ]] ; then - rm -rf $COMBINE_DIR/* - else - exit 1 - fi - else - mkdir -p ${COMBINE_DIR} - fi -} - # Set the next value for STATE and record it in # the STATE_FILE next-state () { @@ -195,7 +151,6 @@ next-state () { ##### # Setup initial variables INSTALL_DIR=`pwd` -COMBINE_DIR=${HOME}/thecombine # Create directory for configuration files CONFIG_DIR=${HOME}/.config/combine mkdir -p ${CONFIG_DIR} @@ -252,10 +207,8 @@ fi while [ "$STATE" != "Done" ] ; do case $STATE in Pre-reqs) - create-dest-directory create-python-venv install-kubernetes - copy-install-scripts next-state "Restart" ;; Restart) From 272c1961e6e59161760277c0c8d12f297e05951e Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Wed, 20 Mar 2024 10:29:36 -0400 Subject: [PATCH 92/98] Add note for Linux versiont that have been tested --- installer/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/installer/README.md b/installer/README.md index 9700f6e162..d56e38c252 100644 --- a/installer/README.md +++ b/installer/README.md @@ -13,12 +13,15 @@ This README describes how to install _The Combine_ Rapid Word Collection tool on _The Combine_ can be installed on a PC that meets the following requirements: -- Debian-based Linux Operating system, such as _Ubuntu_ or _Wasta Linux_; +- Debian-based Linux Operating system - 6 GB of memory; - WiFi interface that supports creating a WiFi Hotspot; - a wired-ethernet connection to the Internet - User account that can run as `root` with `sudo`. +The installation script has been tested on _Ubuntu 22.04_ and _Wasta +Linux 22.04_. + ### Install _The Combine_ 1. Plug in the wired ethernet connection to the Internet. From 82337d8848a629fc66dca9fabaca4192b85146ac Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Thu, 21 Mar 2024 10:19:59 -0400 Subject: [PATCH 93/98] Update from review --- README.md | 18 ++++++++++-------- deploy/ansible/host_vars/localhost/main.yml | 2 +- deploy/ansible/playbook_desktop_setup.yaml | 7 +++---- deploy/ansible/playbook_nuc_setup.yaml | 8 ++++---- .../roles/container_engine/tasks/main.yml | 11 ++++------- .../roles/package_install/defaults/main.yml | 5 ----- .../roles/package_install/tasks/main.yml | 15 --------------- deploy/ansible/roles/wifi_ap/defaults/main.yml | 4 +++- deploy/ansible/roles/wifi_ap/tasks/main.yml | 9 ++++----- deploy/ansible/vars/packages.yml | 8 -------- deploy/scripts/setup_files/combine_config.yaml | 1 + installer/README.md | 7 +++---- 12 files changed, 33 insertions(+), 62 deletions(-) delete mode 100644 deploy/ansible/roles/package_install/defaults/main.yml delete mode 100644 deploy/ansible/roles/package_install/tasks/main.yml delete mode 100644 deploy/ansible/vars/packages.yml diff --git a/README.md b/README.md index 426c0acfa9..f0bd6facbf 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ A rapid word collection tool. See the [User Guide](https://sillsdev.github.io/Th 6. [Inspect Database](#inspect-database) 7. [Add or Update Dictionary Files](#add-or-update-dictionary-files) 8. [Cleanup Local Repository](#cleanup-local-repository) + 9. [Generate Installer Script for The Combine](#generate-installer-script-for-the-combine-linux-only) 3. [Setup Local Kubernetes Cluster](#setup-local-kubernetes-cluster) 1. [Install Rancher Desktop](#install-rancher-desktop) 2. [Install Docker Desktop](#install-docker-desktop) @@ -127,16 +128,17 @@ A rapid word collection tool. See the [User Guide](https://sillsdev.github.io/Th `dotnet tool update --global dotnet-reportgenerator-globaltool --version 5.0.4` 11. [dotnet-project-licenses](https://github.com/tomchavakis/nuget-license) `dotnet tool update --global dotnet-project-licenses` -12. Tools for generating the self installer [Linux Only]: +12. Tools for generating the self installer [Linux only]: - [makeself](https://makeself.io/) - a tool to make self-extracting archives in Unix - - [pandoc](https://pandoc.org/installing.html#linux) - a tool to convert Markdown documents to PDF. In addition to - `pandoc`, the `weasyprint` PDF engine is required. These may be installed on Debian-based distributions by - running: + - [pandoc](https://pandoc.org/installing.html#linux) - a tool to convert Markdown documents to PDF. + - `weasyprint` a PDF engine for `pandoc`. - ```console - sudo apt install -y pandoc weasyprint - ``` + These can be installed on Debian-based distributions by running: + + ```console + sudo apt install -y makeself pandoc weasyprint + ``` ### Prepare the Environment @@ -515,7 +517,7 @@ of development setup errors. Run from within a Python virtual environment. python scripts/cleanup_local_repo.py ``` -### Generate Installer Script for The Combine (_Linux Only_) +### Generate Installer Script for The Combine (_Linux only_) To generate the installer script, run the following commands starting in the project top level directory: diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index 18a9cd416e..77bcbe80d9 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -54,7 +54,7 @@ ap_ssid: "thecombine_ap" ap_passphrase: "Combine2020" ap_gateway: "10.10.10.1" ap_hostname: "local" - +test_wifi: false ################################################ # hardware monitoring settings ################################################ diff --git a/deploy/ansible/playbook_desktop_setup.yaml b/deploy/ansible/playbook_desktop_setup.yaml index 6ddd67480f..365b25fbbc 100644 --- a/deploy/ansible/playbook_desktop_setup.yaml +++ b/deploy/ansible/playbook_desktop_setup.yaml @@ -1,10 +1,10 @@ --- ############################################################## -# Playbook: playbook_kube_install.yml +# Playbook: playbook_desktop_install.yml # -# playbook_kube_install.yml installs the packages and +# playbook_desktop_install.yml installs the packages and # configuration files that are required to run TheCombine -# as Docker containers managed by a Kubernetes cluster. +# as containers managed by a Kubernetes cluster on localhost. # ############################################################## @@ -15,7 +15,6 @@ vars_files: - "vars/config_common.yml" - - "vars/packages.yml" tasks: - name: Update packages diff --git a/deploy/ansible/playbook_nuc_setup.yaml b/deploy/ansible/playbook_nuc_setup.yaml index a55d4c8c1d..4a42566ed9 100644 --- a/deploy/ansible/playbook_nuc_setup.yaml +++ b/deploy/ansible/playbook_nuc_setup.yaml @@ -1,10 +1,11 @@ --- ############################################################## -# Playbook: playbook_kube_install.yml +# Playbook: playbook_nuc_install.yml # -# playbook_kube_install.yml installs the packages and +# playbook_nuc_install.yml installs the packages and # configuration files that are required to run TheCombine -# as Docker containers managed by a Kubernetes cluster. +# as Docker containers managed by a Kubernetes cluster on +# a target PC, such as an Intel NUC. # ############################################################## @@ -15,7 +16,6 @@ vars_files: - "vars/config_common.yml" - - "vars/packages.yml" tasks: - name: Update packages diff --git a/deploy/ansible/roles/container_engine/tasks/main.yml b/deploy/ansible/roles/container_engine/tasks/main.yml index e7da448d08..3f19a7bf00 100644 --- a/deploy/ansible/roles/container_engine/tasks/main.yml +++ b/deploy/ansible/roles/container_engine/tasks/main.yml @@ -1,16 +1,13 @@ --- ############################################################## -# Role: docker_install +# Role: container_engine # -# Install the Docker Engine, Docker Compose and all their -# pre-requisite packages. +# Install the container engine and pre-requisite packages. # -# The Docker Engine is installed by adding the repo from +# The container engine is installed by adding the repo from # docker.com to our apt sources and installing the relevant -# package. +# packages. # -# Docker Compose is installed by downloading the ZIP package -# from GitHub and extracting it to /usr/local/bin ############################################################## - name: Update apt cache. apt: diff --git a/deploy/ansible/roles/package_install/defaults/main.yml b/deploy/ansible/roles/package_install/defaults/main.yml deleted file mode 100644 index 11a2fee572..0000000000 --- a/deploy/ansible/roles/package_install/defaults/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -required_packages: - - apt-transport-https - - aptitude - - software-properties-common diff --git a/deploy/ansible/roles/package_install/tasks/main.yml b/deploy/ansible/roles/package_install/tasks/main.yml deleted file mode 100644 index f0bc1a54e9..0000000000 --- a/deploy/ansible/roles/package_install/tasks/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -################################################### -# Role to update/upgrade all current packages and -# install packages listed in "required_packages" -################################################### - -- name: Upgrade all current packages - apt: - update_cache: "yes" - upgrade: "yes" - -- name: install required packages dependencies - apt: - name: "{{ required_packages }}" - state: present diff --git a/deploy/ansible/roles/wifi_ap/defaults/main.yml b/deploy/ansible/roles/wifi_ap/defaults/main.yml index c12bdb031f..e9a410ea31 100644 --- a/deploy/ansible/roles/wifi_ap/defaults/main.yml +++ b/deploy/ansible/roles/wifi_ap/defaults/main.yml @@ -2,9 +2,11 @@ ap_ssid: "{{ ansible_hostname }}_ap" ap_passphrase: "Set a new passphrase in your config file." ap_gateway: "10.10.10.1" -ap_domain: example.com +ap_domain: thecombine.app ap_hostname: "{{ ansible_hostname }}" wifi_if_name: "{{ ansible_interfaces | join(' ') | regex_replace('^.*\\b(wl[a-z0-9]+).*$', '\\1') }}" ap_hosts_config: /etc/create_ap/create_ap.hosts create_ap_config: /etc/create_ap/create_ap.conf + +test_wifi: true diff --git a/deploy/ansible/roles/wifi_ap/tasks/main.yml b/deploy/ansible/roles/wifi_ap/tasks/main.yml index 01299580d5..74d8c089a9 100644 --- a/deploy/ansible/roles/wifi_ap/tasks/main.yml +++ b/deploy/ansible/roles/wifi_ap/tasks/main.yml @@ -5,8 +5,7 @@ tags: - install - meta: flush_handlers -# - name: Test WiFi Access point -# include_tasks: -# file: test.yml -# tags: -# - test +- name: Test WiFi Access point + include_tasks: + file: test.yml + when: test_wifi diff --git a/deploy/ansible/vars/packages.yml b/deploy/ansible/vars/packages.yml deleted file mode 100644 index 926764a778..0000000000 --- a/deploy/ansible/vars/packages.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -# Packages required for targets -required_packages: - - python3 - - python3-pip - - apt-transport-https - - aptitude - - software-properties-common diff --git a/deploy/scripts/setup_files/combine_config.yaml b/deploy/scripts/setup_files/combine_config.yaml index 76de8d18ab..3ce315b835 100644 --- a/deploy/scripts/setup_files/combine_config.yaml +++ b/deploy/scripts/setup_files/combine_config.yaml @@ -22,6 +22,7 @@ targets: profile: desktop env_vars_required: false override: + # override values for 'thecombine' chart thecombine: global: serverName: local.thecombine.app diff --git a/installer/README.md b/installer/README.md index d56e38c252..845eaf9f3a 100644 --- a/installer/README.md +++ b/installer/README.md @@ -9,7 +9,7 @@ This README describes how to install _The Combine_ Rapid Word Collection tool on 3. [Running _The Combine_](#running-the-combine) 4. [Advanced Installation Options](#advanced-installation-options) -### System Requirements +## System Requirements _The Combine_ can be installed on a PC that meets the following requirements: @@ -19,10 +19,9 @@ _The Combine_ can be installed on a PC that meets the following requirements: - a wired-ethernet connection to the Internet - User account that can run as `root` with `sudo`. -The installation script has been tested on _Ubuntu 22.04_ and _Wasta -Linux 22.04_. +The installation script has been tested on _Ubuntu 22.04_ and _Wasta Linux 22.04_. -### Install _The Combine_ +## Install _The Combine_ 1. Plug in the wired ethernet connection to the Internet. 2. Update all of the existing software packages through your OS's _Software Updater_ application or by running: From 6a2f5d4bfb95d5243cfaa4ef67b6ffce3318b40e Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 22 Mar 2024 11:05:37 -0400 Subject: [PATCH 94/98] Updates from review --- README.md | 4 ++-- deploy/ansible/playbook_desktop_setup.yaml | 4 ++-- deploy/ansible/playbook_nuc_setup.yaml | 4 ++-- deploy/ansible/roles/support_tools/files/combinectl.sh | 2 +- deploy/ansible/roles/support_tools/files/display-eth-addr.sh | 1 - .../roles/support_tools/templates/display-eth.timer.j2 | 2 +- deploy/ansible/roles/wifi_ap/tasks/install.yml | 2 +- 7 files changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f0bd6facbf..f834298763 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ A rapid word collection tool. See the [User Guide](https://sillsdev.github.io/Th `dotnet tool update --global dotnet-reportgenerator-globaltool --version 5.0.4` 11. [dotnet-project-licenses](https://github.com/tomchavakis/nuget-license) `dotnet tool update --global dotnet-project-licenses` -12. Tools for generating the self installer [Linux only]: +12. Tools for generating the self installer (Linux only): - [makeself](https://makeself.io/) - a tool to make self-extracting archives in Unix - [pandoc](https://pandoc.org/installing.html#linux) - a tool to convert Markdown documents to PDF. @@ -517,7 +517,7 @@ of development setup errors. Run from within a Python virtual environment. python scripts/cleanup_local_repo.py ``` -### Generate Installer Script for The Combine (_Linux only_) +### Generate Installer Script for The Combine (Linux only) To generate the installer script, run the following commands starting in the project top level directory: diff --git a/deploy/ansible/playbook_desktop_setup.yaml b/deploy/ansible/playbook_desktop_setup.yaml index 365b25fbbc..caedfb6a3d 100644 --- a/deploy/ansible/playbook_desktop_setup.yaml +++ b/deploy/ansible/playbook_desktop_setup.yaml @@ -1,8 +1,8 @@ --- ############################################################## -# Playbook: playbook_desktop_install.yml +# Playbook: playbook_desktop_setup.yml # -# playbook_desktop_install.yml installs the packages and +# playbook_desktop_setup.yml installs the packages and # configuration files that are required to run TheCombine # as containers managed by a Kubernetes cluster on localhost. # diff --git a/deploy/ansible/playbook_nuc_setup.yaml b/deploy/ansible/playbook_nuc_setup.yaml index 4a42566ed9..a2bd3ce5c6 100644 --- a/deploy/ansible/playbook_nuc_setup.yaml +++ b/deploy/ansible/playbook_nuc_setup.yaml @@ -1,8 +1,8 @@ --- ############################################################## -# Playbook: playbook_nuc_install.yml +# Playbook: playbook_nuc_setup.yml # -# playbook_nuc_install.yml installs the packages and +# playbook_nuc_setup.yml installs the packages and # configuration files that are required to run TheCombine # as Docker containers managed by a Kubernetes cluster on # a target PC, such as an Intel NUC. diff --git a/deploy/ansible/roles/support_tools/files/combinectl.sh b/deploy/ansible/roles/support_tools/files/combinectl.sh index c6ee73f1ae..e0d667720c 100755 --- a/deploy/ansible/roles/support_tools/files/combinectl.sh +++ b/deploy/ansible/roles/support_tools/files/combinectl.sh @@ -20,7 +20,7 @@ usage () { The Combine does not run properly, download and run the updated install package. wifi [wifi-passphrase]: - If no parameters are provieded, display the wifi + If no parameters are provided, display the wifi passphrase. If a new passphase is provided, the wifi passphrase is updated to the new phrase. If your passphrase has spaces or special characters, diff --git a/deploy/ansible/roles/support_tools/files/display-eth-addr.sh b/deploy/ansible/roles/support_tools/files/display-eth-addr.sh index cd4ead22f5..0f5d2165a0 100755 --- a/deploy/ansible/roles/support_tools/files/display-eth-addr.sh +++ b/deploy/ansible/roles/support_tools/files/display-eth-addr.sh @@ -15,7 +15,6 @@ if [ -e "$TTY_DEV" ] ; then if [[ $ETH_IP == "" && $ETH_STATUS == "" ]] ; then # set red background echo -en \\xfe\\xd0\\xff\\x1f\\x1f > ${TTY_DEV} - # 1234567890123456 echo " NO ETHERNET" > ${TTY_DEV} echo -n " CONNECTED" > ${TTY_DEV} else diff --git a/deploy/ansible/roles/support_tools/templates/display-eth.timer.j2 b/deploy/ansible/roles/support_tools/templates/display-eth.timer.j2 index 75ca026a2a..cf1e79103e 100644 --- a/deploy/ansible/roles/support_tools/templates/display-eth.timer.j2 +++ b/deploy/ansible/roles/support_tools/templates/display-eth.timer.j2 @@ -1,5 +1,5 @@ [Unit] -Description=Display Ethernet Address on support tool display +Description=Timer to trigger display-eth.service [Timer] OnUnitActiveSec={{ eth_update_period }} diff --git a/deploy/ansible/roles/wifi_ap/tasks/install.yml b/deploy/ansible/roles/wifi_ap/tasks/install.yml index 74acb744ac..2ac3d87e7f 100644 --- a/deploy/ansible/roles/wifi_ap/tasks/install.yml +++ b/deploy/ansible/roles/wifi_ap/tasks/install.yml @@ -64,7 +64,7 @@ - name: Redirect traffic for The Combine to the AP gateway lineinfile: path: /etc/hosts - regexp: ^{{ ap_gateway }} + regexp: ^{{ ap_gateway.replace(".", "\\.") }} state: present line: "{{ ap_gateway }} {{ ap_hostname }}.{{ ap_domain }} {{ ap_hostname }} rancher.{{ ap_domain }}" From 9d4683897129cfd93e9351ab9555ae1b81f67297 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 22 Mar 2024 14:17:24 -0400 Subject: [PATCH 95/98] Fix patterns for updating /etc/hosts --- deploy/ansible/roles/wifi_ap/tasks/install.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/deploy/ansible/roles/wifi_ap/tasks/install.yml b/deploy/ansible/roles/wifi_ap/tasks/install.yml index 2ac3d87e7f..1db948b4c7 100644 --- a/deploy/ansible/roles/wifi_ap/tasks/install.yml +++ b/deploy/ansible/roles/wifi_ap/tasks/install.yml @@ -54,9 +54,9 @@ - name: Update localhost name lineinfile: path: /etc/hosts - regexp: ^127\.0\.1\.1 + regexp: ^127\.0\.0\.1 state: present - line: 127.0.0.1 {{ ansible_hostname }} + line: 127.0.0.1 localhost {{ ansible_hostname }} owner: root group: root mode: "0644" @@ -64,9 +64,9 @@ - name: Redirect traffic for The Combine to the AP gateway lineinfile: path: /etc/hosts - regexp: ^{{ ap_gateway.replace(".", "\\.") }} + regexp: ^{{ ap_gateway.replace(".", "\.") }} state: present - line: "{{ ap_gateway }} {{ ap_hostname }}.{{ ap_domain }} {{ ap_hostname }} rancher.{{ ap_domain }}" + line: "{{ ap_gateway }} {{ ap_hostname }}.{{ ap_domain }} {{ ap_hostname }}" - name: Install hosts lists for access point template: From 91d6278ace8445a909b8ee0c5a4371cb37b1691d Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Fri, 22 Mar 2024 14:37:58 -0400 Subject: [PATCH 96/98] Turn off install_ip_viewer for localhost --- deploy/ansible/host_vars/localhost/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/ansible/host_vars/localhost/main.yml b/deploy/ansible/host_vars/localhost/main.yml index 77bcbe80d9..7df72dd2a2 100644 --- a/deploy/ansible/host_vars/localhost/main.yml +++ b/deploy/ansible/host_vars/localhost/main.yml @@ -26,7 +26,7 @@ install_helm: yes ################################################ # Support Tool Settings ################################################ -install_ip_viewer: yes +install_ip_viewer: no install_combinectl: yes ####################################### From 3bb5473f187fa9fee1629d8f303263a6f56594b5 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Sun, 24 Mar 2024 14:26:56 -0400 Subject: [PATCH 97/98] Update from review --- .../roles/support_tools/files/combinectl.sh | 11 +++++-- .../support_tools/files/display-eth-addr.sh | 32 ++++++++++--------- installer/README.md | 9 +++--- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/deploy/ansible/roles/support_tools/files/combinectl.sh b/deploy/ansible/roles/support_tools/files/combinectl.sh index e0d667720c..d8887dbd0d 100755 --- a/deploy/ansible/roles/support_tools/files/combinectl.sh +++ b/deploy/ansible/roles/support_tools/files/combinectl.sh @@ -46,8 +46,8 @@ get-wifi-if () { # Restart a WiFi connection that was saved previously restore-wifi-connection () { - if [ -f "${COMBINE_CONFIG}/wifi_connection.txt" ] ; then - WIFI_CONN=`cat ${COMBINE_CONFIG}/wifi_connection.txt` + if [ -f "${CACHED_WIFI_CONN}" ] ; then + WIFI_CONN=`cat ${CACHED_WIFI_CONN}` if [ "$WIFI_CONN" != "--" ] ; then echo "Restoring connection ${WIFI_CONN}" sudo nmcli c up "${WIFI_CONN}" @@ -60,7 +60,7 @@ save-wifi-connection () { # get the name of the WiFi Connection WIFI_CONN=`nmcli d show "$WIFI_IF" | grep "^GENERAL.CONNECTION" | sed "s|^GENERAL.CONNECTION: *||"` # save it so we can restore it later - echo "$WIFI_CONN" > ${COMBINE_CONFIG}/wifi_connection.txt + echo "$WIFI_CONN" > ${CACHED_WIFI_CONN} if [ "$WIFI_CONN" != "--" ] ; then sudo nmcli c down "$WIFI_CONN" fi @@ -159,7 +159,12 @@ WIFI_IF=$(get-wifi-if) WIFI_CONFIG=/etc/create_ap/create_ap.conf export KUBECONFIG=${HOME}/.kube/config COMBINE_CONFIG=${HOME}/.config/combine +CACHED_WIFI_CONN=${COMBINE_CONFIG}/wifi-connection.txt +# Make sure config directory exists +mkdir -p "${COMBINE_CONFIG}" + +# Print usage is command is missing if [[ $# -eq 0 ]] ; then usage exit 0 diff --git a/deploy/ansible/roles/support_tools/files/display-eth-addr.sh b/deploy/ansible/roles/support_tools/files/display-eth-addr.sh index 0f5d2165a0..653b92a741 100755 --- a/deploy/ansible/roles/support_tools/files/display-eth-addr.sh +++ b/deploy/ansible/roles/support_tools/files/display-eth-addr.sh @@ -1,28 +1,30 @@ #! /usr/bin/env bash TTY_DEV="${1:-/dev/ttyACM0}" +CLEAR_SCREEN="\\xfe\\x58" +TO_ORIGIN="\\xfe\\x48" +SET_BACKGROUND="\\xfe\\xd0" +RED="\\xff\\x1f\\x1f" +GREEN="\\x3f\\xff\\x7f" if [ -e "$TTY_DEV" ] ; then - ETH_ADD_STR=`ip -4 -br address | grep "^en"` - ETH_IP=`echo ${ETH_ADD_STR} | sed -E -e 's%^[0-9a-z]+\s+[A-Z]+\s+([0-9\.]+)/.*%\1%'` - ETH_STATUS=`echo ${ETH_ADD_STR} | sed -E -e 's%^[0-9a-z]+\s+([A-Z]+)\s+[0-9\.]+/.*%\1%'` - - # Print results - # Clear screen - echo -en \\xfe\\x58 > ${TTY_DEV} + echo -en "${CLEAR_SCREEN}"> ${TTY_DEV} # Move cursor to origin - echo -en \\xfe\\x48 > ${TTY_DEV} - if [[ $ETH_IP == "" && $ETH_STATUS == "" ]] ; then - # set red background - echo -en \\xfe\\xd0\\xff\\x1f\\x1f > ${TTY_DEV} - echo " NO ETHERNET" > ${TTY_DEV} - echo -n " CONNECTED" > ${TTY_DEV} - else + echo -en "${TO_ORIGIN}" > ${TTY_DEV} + ETH_ADD_STR=`ip -4 -br address | grep "^en"` + if [ -n "${ETH_ADD_STR}" ] ; then + ETH_IP=`echo ${ETH_ADD_STR} | sed -E -e 's%^[0-9a-z]+\s+[A-Z]+\s+([0-9\.]+)/.*%\1%'` + ETH_STATUS=`echo ${ETH_ADD_STR} | sed -E -e 's%^[0-9a-z]+\s+([A-Z]+)\s+[0-9\.]+/.*%\1%'` # set green background - echo -en \\xfe\\xd0\\x3f\\xff\\x7f > ${TTY_DEV} + echo -en "${SET_BACKGROUND}${GREEN}" > ${TTY_DEV} # Print IP address echo "IP: ${ETH_IP} " > ${TTY_DEV} # Print I/F Status echo -n "Status: ${ETH_STATUS} " > ${TTY_DEV} + else + # set red background + echo -en "${SET_BACKGROUND}${RED}" > ${TTY_DEV} + echo " NO ETHERNET" > ${TTY_DEV} + echo -n " CONNECTED" > ${TTY_DEV} fi fi diff --git a/installer/README.md b/installer/README.md index 845eaf9f3a..06ab5c9cf9 100644 --- a/installer/README.md +++ b/installer/README.md @@ -24,7 +24,8 @@ The installation script has been tested on _Ubuntu 22.04_ and _Wasta Linux 22.04 ## Install _The Combine_ 1. Plug in the wired ethernet connection to the Internet. -2. Update all of the existing software packages through your OS's _Software Updater_ application or by running: +2. Make sure WiFi is "on"; it does not need to be connected to a network. +3. Update all of the existing software packages through your OS's _Software Updater_ application or by running: ```bash sudo apt update && sudo apt upgrade -y @@ -32,16 +33,16 @@ The installation script has been tested on _Ubuntu 22.04_ and _Wasta Linux 22.04 This step is optional but will make the installation process go more smoothly. Restart the PC if requested. -3. Download the installation script from +4. Download the installation script from [https://s3.amazonaws.com/software.thecombine.app/combine-installer.run](https://s3.amazonaws.com/software.thecombine.app/combine-installer.run) -4. Open a terminal window (Ctrl-Alt-T) and make the script executable: +5. Open a terminal window (Ctrl-Alt-T) and make the script executable: ```console cd [path where installer was downloaded] chmod +x combine-installer.run ``` -5. Run the script: +6. Run the script: ```console cd [path where installer was downloaded] From 5dd7afb4fe3528bde82b61835c04002ba3aaceb2 Mon Sep 17 00:00:00 2001 From: Jim Grady Date: Mon, 25 Mar 2024 10:49:22 -0400 Subject: [PATCH 98/98] Update comment from review --- deploy/ansible/roles/support_tools/files/combinectl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/ansible/roles/support_tools/files/combinectl.sh b/deploy/ansible/roles/support_tools/files/combinectl.sh index d8887dbd0d..b1bb7eae34 100755 --- a/deploy/ansible/roles/support_tools/files/combinectl.sh +++ b/deploy/ansible/roles/support_tools/files/combinectl.sh @@ -164,7 +164,7 @@ CACHED_WIFI_CONN=${COMBINE_CONFIG}/wifi-connection.txt # Make sure config directory exists mkdir -p "${COMBINE_CONFIG}" -# Print usage is command is missing +# Print usage if command is missing if [[ $# -eq 0 ]] ; then usage exit 0