Repository: PennLINC/CuBIDS (language: python)

Issue:
Stop building Docker image
@mattcieslak and I were chatting in SCRUM, and we were thinking it might be easiest to stop building a Docker image for CuBIDS. If we treat CuBIDS as a standard Python library, then we just need to ensure that it checks for git, git-annex, and datalad when users want to use version control. If those checks aren't already in CuBIDS, we should be able to adapt something from BABS.

If the Docker image is a crucial element in anyone's CuBIDS workflow, please let us know.


Discussion / hints:

Fix patch:
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 5753e9fec..bde4a4bb3 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,274 +1,37 @@
 version: 2.1
 jobs:
-
-  build:
-    environment:
-      TZ: "/usr/share/zoneinfo/America/New_York"
-      SCRATCH: "/scratch"
-    docker:
-      - image: docker:18.06.1-ce-git
-    working_directory: /tmp/src/CuBIDS
-    steps:
-      - checkout
-      - run:
-          name: Install parallel gzip and python3
-          command: |
-            apk add --no-cache pigz python3 tar
-      - restore_cache:
-          keys:
-            - docker-v1-{{ .Branch }}-{{ .Revision }}
-            - docker-v1-{{ .Branch }}-
-            - docker-v1-master-
-            - docker-v1-
-      - setup_remote_docker:
-          version: 19.03.13
-      - run:
-          name: Load Docker image layer cache
-          no_output_timeout: 30m
-          command: |
-            docker info
-            set +o pipefail
-            if [ -f /tmp/cache/docker.tar.gz ]; then
-              pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
-              docker images
-            fi
-      - run:
-          name: Build Docker image
-          no_output_timeout: 3h
-          command: |
-            # Build docker image
-            e=1 && for i in {1..5}; do
-              docker build \
-                --cache-from=pennlinc/bond \
-                --rm=false \
-                -t pennlinc/bond:latest \
-                --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
-                --build-arg VCS_REF=`git rev-parse --short HEAD` . \
-              && e=0 && break || sleep 15
-            done && [ "$e" -eq "0" ]
-
-      - run:
-          name: Docker save
-          no_output_timeout: 40m
-          command: |
-            mkdir -p /tmp/cache
-            docker save pennlinc/bond:latest \
-            | pigz -3 > /tmp/cache/docker.tar.gz
-
-      - save_cache:
-         key: docker-v1-{{ .Branch }}-{{ .Revision }}-{{ epoch }}
-         paths:
-           - /tmp/cache/docker.tar.gz
-
-  setup_conda:
-    machine:
-      image: ubuntu-2004:202201-02
-    steps:
-      - run:
-           name: install miniconda
-           command: |
-             cd /tmp
-             export MINICONDA=/tmp/miniconda
-             export PATH="$MINICONDA/bin:$PATH"
-             wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh
-             bash miniconda.sh -b -f -p $MINICONDA
-             conda config --set always_yes yes
-             conda update conda
-             conda info -a
-             conda create -n cubids python=3.8
-             source activate cubids
-             conda install -c conda-forge -y datalad
-             conda install pip
-             conda install pytest
-             # Add nodejs and the validator
-             #  conda install nodejs
-             #  npm install -g yarn && \
-             #  npm install -g bids-validator
-
-      - persist_to_workspace:
-          root: /tmp
-          paths:
-            - miniconda
-
-
-  get_singularity:
-    machine:
-      image: ubuntu-2004:202201-02
-    steps:
-      - restore_cache:
-          keys:
-            - singularity-v3-{{ .Branch }}-{{ .Revision }}
-            - singularity-v3-{{ .Branch }}-
-            - singularity-v3-master-
-            - singularity-v3-
-
-      - run:
-          name: Download Singularity
-          command: |
-            if [ ! -f /home/circleci/singularity.tar.gz ]
-            then
-              sudo apt-get update && sudo apt-get -y install build-essential \
-                libssl-dev \
-                uuid-dev \
-                libgpgme11-dev \
-                squashfs-tools \
-                libseccomp-dev \
-                pkg-config \
-                wget
-              export GOPATH=$HOME/go
-              mkdir -p $GOPATH
-              export VERSION=3.7.3
-              wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz
-              tar -xzf singularity-${VERSION}.tar.gz
-              cd ./singularity
-              ./mconfig && \
-                make -j2 -C ./builddir
-              cd $HOME
-              tar cfz singularity.tar.gz project/singularity/
-              tar cfz go.tar.gz go/
-            fi
-
-      - save_cache:
-         key: singularity-v3-{{ .Branch }}-{{ .Revision }}-{{ epoch }}
-         paths:
-            - /home/circleci/singularity.tar.gz
-            - /home/circleci/go.tar.gz
-
-  install_and_test_singularity:
+  set_up_conda:
     machine:
       image: ubuntu-2004:202201-02
     working_directory: /home/circleci/src/CuBIDS
     steps:
       - checkout:
           path: /home/circleci/src/CuBIDS
-
-      - attach_workspace:
-          at: /tmp
-
-      - restore_cache:
-          keys:
-            - docker-v1-{{ .Branch }}-{{ .Revision }}
-
-      - restore_cache:
-          keys:
-            - singularity-v3-{{ .Branch }}-{{ .Revision }}
-            - singularity-v3-{{ .Branch }}-
-            - singularity-v3-master-
-            - singularity-v3-
-      - run:
-          name: Load Docker image layer cache
-          no_output_timeout: 30m
-          command: |
-            docker info
-            set +o pipefail
-            if [ -f /tmp/cache/docker.tar.gz ]; then
-              sudo apt update && sudo apt -y install pigz
-              pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
-              docker images
-            fi
-
       - run:
-          name: Install CuBIDS
+          name: install miniconda
           command: |
-            export PATH=/tmp/miniconda/bin:$PATH
+            export MINICONDA=/tmp/miniconda
+            export PATH="$MINICONDA/bin:$PATH"
+            wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh
+            bash /tmp/miniconda.sh -b -f -p $MINICONDA
+            conda config --set always_yes yes
+            conda update conda
+            conda info -a
+            conda create -n cubids python=3.9 pip
             source activate cubids
             conda install -c conda-forge -y datalad
-            conda install pip
+
             # Add nodejs and the validator
-            sudo apt update
-            sudo apt install nodejs npm
-            npm install -g yarn 
+            conda install nodejs
+            npm install -g yarn && \
             npm install -g bids-validator
-            pip install pytest
-            pip install .
-
-      - run:
-          name: Install Singularity
-          command: |
-              export GOPATH=$HOME/go
-              cd /home/circleci
-              tar xfz go.tar.gz
-              tar xfz singularity.tar.gz
-              cd project/singularity/builddir
-              sudo make install
-
-      - run:
-          name: Build singularity image
-          no_output_timeout: 30m
-          command: |
-              singularity build \
-                /home/circleci/cubids-latest.sif \
-                docker-daemon://pennlinc/bond:latest
-
-      - run:
-          name: Test cubids-validate
-          command: |
-            git config --global user.email "circleci@citesting.com"
-            git config --global user.name "CircleCI Test"
-            export PATH=/tmp/miniconda/bin:$PATH
-            source activate cubids
-            mkdir -p /tmp/bids /tmp/validate_testing
-            cp -r /home/circleci/src/CuBIDS/cubids/testdata/complete /tmp/bids/singularity
-            cubids-validate \
-              /tmp/bids/singularity \
-              /tmp/validate_testing/singularity \
-              --container /home/circleci/cubids-latest.sif
-
-      - run:
-          name: Test cubids-group
-          command: |
-            git config --global user.email "circleci@citesting.com"
-            git config --global user.name "CircleCI Test"
-            export PATH=/tmp/miniconda/bin:$PATH
-            source activate cubids
-            mkdir -p /tmp/bids /tmp/group_testing
-            cp -r /home/circleci/src/CuBIDS/cubids/testdata/complete /tmp/bids/group
-            cubids-group \
-              /tmp/bids/group \
-              /tmp/group_testing/group \
-              --container /home/circleci/cubids-latest.sif
-
-      - run:
-          name: Test cubids-save
-          command: |
-            git config --global user.email "circleci@citesting.com"
-            git config --global user.name "CircleCI Test"
-            export PATH=/tmp/miniconda/bin:$PATH
-            source activate cubids
-            mkdir -p /tmp/bids
-            cp -r /home/circleci/src/CuBIDS/cubids/testdata/complete /tmp/bids/singularity
-            cubids-datalad-save \
-              /tmp/bids/singularity \
-              -m 'test save' \
-              --container /home/circleci/cubids-latest.sif
-
-      - run:
-          name: Test cubids-remove-metadata-fields
-          command: |
-            git config --global user.email "circleci@citesting.com"
-            git config --global user.name "CircleCI Test"
-            export PATH=/tmp/miniconda/bin:$PATH
-            source activate cubids
-            mkdir -p /tmp/bids
-            cp -r /home/circleci/src/CuBIDS/cubids/testdata/complete /tmp/bids/metatest
-
-            # Get the original metadata fields
-            cubids-print-metadata-fields \
-              /tmp/bids/metatest \
-              --container /home/circleci/cubids-latest.sif > /tmp/origmd.txt
-
-            # Remove some fields
-            cubids-remove-metadata-fields \
-              /tmp/bids/metatest \
-              --container /home/circleci/cubids-latest.sif \
-              --fields DeviceSerialNumber AcquisitionTime \
-                       InstitutionAddress InstitutionName \
-                       StationName NotARealField > /tmp/removedmd.txt
 
-            [ $(diff /tmp/origmd.txt /tmp/removedmd.txt | wc -l) -gt 0 ] && exit 0
-            exit 1
+      - persist_to_workspace:
+          root: /tmp
+          paths:
+            - miniconda
 
-  install_and_test:
+  run_pytests:
     machine:
       image: ubuntu-2004:202201-02
     working_directory: /home/circleci/src/CuBIDS
@@ -279,141 +42,31 @@ jobs:
       - attach_workspace:
           at: /tmp
 
-      - restore_cache:
-          keys:
-            - docker-v1-{{ .Branch }}-{{ .Revision }}
-
-      - run:
-          name: Load Docker image layer cache
-          no_output_timeout: 30m
-          command: |
-            docker info
-            set +o pipefail
-            if [ -f /tmp/cache/docker.tar.gz ]; then
-              sudo apt update && sudo apt -y install pigz
-              pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
-              docker images
-            fi
-
       - run:
           name: Test CuBIDS
           command: |
             export PATH=/tmp/miniconda/bin:$PATH
             source activate cubids
-            pip install .
-            pip install pytest
+
+            # Install CuBIDS
+            pip install -e .[tests]
+
+            # Reinstall bids-validator
             sudo apt update
             sudo apt install nodejs npm
             npm install -g yarn && \
             npm install -g bids-validator
-            py.test -sv tests
-
-      - run:
-          name: Test Docker validate
-          command: |
-            git config --global user.email "circleci@citesting.com"
-            git config --global user.name "CircleCI Test"
-            export PATH=/tmp/miniconda/bin:$PATH
-            source activate cubids
-            mkdir -p /tmp/bids /tmp/validate_testing
-            cp -r /home/circleci/src/CuBIDS/cubids/testdata/complete /tmp/bids/docker-validate
-            cubids-validate \
-              /tmp/bids/docker-validate \
-              /tmp/validate_testing/docker \
-              --container pennlinc/bond:latest
-
-      - run:
-          name: Test Docker group
-          command: |
-            git config --global user.email "circleci@citesting.com"
-            git config --global user.name "CircleCI Test"
-            export PATH=/tmp/miniconda/bin:$PATH
-            source activate cubids
-            mkdir -p /tmp/bids /tmp/group_testing
-            cp -r /home/circleci/src/CuBIDS/cubids/testdata/complete /tmp/bids/docker-group
-            cubids-group \
-              /tmp/bids/docker-group \
-              /tmp/group_testing/docker \
-              --container pennlinc/bond:latest
-
-      - run:
-          name: Test Docker save
-          command: |
-            git config --global user.email "circleci@citesting.com"
-            git config --global user.name "CircleCI Test"
-            export PATH=/tmp/miniconda/bin:$PATH
-            source activate cubids
-            mkdir -p /tmp/bids
-            cp -r /home/circleci/src/CuBIDS/cubids/testdata/complete /tmp/bids/docker-save
-            cubids-datalad-save \
-              /tmp/bids/docker-save \
-              -m 'test docker save!' \
-              --container pennlinc/bond:latest
-      - run:
-          name: Test cubids-remove-metadata-fields
-          command: |
-            export PATH=/tmp/miniconda/bin:$PATH
-            source activate cubids
-            mkdir -p /tmp/bids
-            cp -r /home/circleci/src/CuBIDS/cubids/testdata/complete /tmp/bids/metatest
-
-            # Get the original metadata fields
-            cubids-print-metadata-fields \
-              /tmp/bids/metatest \
-              --container pennlinc/bond:latest > /tmp/origmd.txt
 
-            # Remove some fields
-            cubids-remove-metadata-fields \
-              /tmp/bids/metatest \
-              --container pennlinc/bond:latest \
-              --fields DeviceSerialNumber AcquisitionTime \
-                       InstitutionAddress InstitutionName \
-                       StationName NotARealField > /tmp/removedmd.txt
+            # Run tests
+            pytest cubids
 
-            [ $(diff /tmp/origmd.txt /tmp/removedmd.txt | wc -l) -gt 0 ] && exit 0
-            exit 1
-
-
-  build_docs:
+  deployable:
     docker:
-      - image: circleci/python:3.7.4
-    working_directory: /tmp/src/CuBIDS
+      - image: busybox:latest
     steps:
-      - checkout
-      - run:
-          name: Check whether build should be skipped
-          command: |
-            if [[ "$( git log --format=oneline -n 1 $CIRCLE_SHA1 | grep -i -E '\[skip[ _]?docs\]' )" != "" ]]; then
-              echo "Skipping doc building job"
-              circleci step halt
-            fi
-
-      - run:
-          name: Check Python version and upgrade pip
-          command: |
-            python --version
-            sudo python -m pip install -U pip
-            sudo pip install flake8
-
-      - run:
-          name: Lint code with flake8
-          command: |
-            flake8 cubids
-
-      - run:
-          name: Install CuBIDS.
-          command: sudo python -m pip install ".[doc]" --no-cache-dir --progress-bar off
-
-      - run:
-          name: Build documentation
-          no_output_timeout: 45m
-          command: |
-            pip install sphinx-rtd-theme
-            make SPHINXOPTS="-W" -C docs html
-      - store_artifacts:
-          path: /tmp/src/CuBIDS/docs/_build/html
+      - run: echo Deploying!
 
-  deploy_docker:
+  deploy_pypi:
     machine:
       image: circleci/classic:201711-01
     working_directory: /tmp/src/CuBIDS
@@ -421,242 +74,46 @@ jobs:
       - checkout:
           path: /home/circleci/src/CuBIDS
       - run:
-          name: Check whether build should be skipped
-          command: |
-            cd /home/circleci/src/CuBIDS
-            if [[ "$( git log --format='format:%s' -n 1 $CIRCLE_SHA1 | grep -i -E '^docs?(\(\w+\))?:' )" != "" ]]; then
-              echo "Only docs build"
-              circleci step halt
-            fi
-      - restore_cache:
-          keys:
-            - docker-v1-{{ .Branch }}-{{ .Revision }}
-      - run:
-          name: Load Docker image layer cache
-          no_output_timeout: 30m
+          name: Generate distribution archives
           command: |
-            docker info
-            set +o pipefail
-            if [ -f /tmp/cache/docker.tar.gz ]; then
-              sudo apt update && sudo apt -y install pigz
-              pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
-              docker images
-            fi
+            python3 -m pip install --upgrade build
+            python3 -m build
       - run:
-          name: Deploy to Docker Hub
-          no_output_timeout: 40m
+          name: Upload packages to PyPI
           command: |
-            if [[ -n "$DOCKER_PASS" ]]; then
-              docker login -u $DOCKER_USER -p $DOCKER_PASS
-              docker tag pennlinc/bond pennlinc/bond:unstable
-              docker push pennlinc/bond:unstable
-              if [[ -n "$CIRCLE_TAG" ]]; then
-                docker push pennlinc/bond:latest
-                docker tag pennlinc/bond pennlinc/bond:$CIRCLE_TAG
-                docker push pennlinc/bond:$CIRCLE_TAG
-              fi
-            fi
-
-#   test_deploy_pypi:
-#     docker:
-#       - image: circleci/python:3.7.4
-#     working_directory: /tmp/src/CuBIDS
-#     steps:
-#       - checkout
-#       - run:
-#           name: Build CuBIDS
-#           command: |
-#             pip install --user twine  # For use in checking distributions
-#             THISVERSION=$( python3 get_version.py )
-#             THISVERSION=${THISVERSION%.dirty*}
-#             THISVERSION=${CIRCLE_TAG:-$THISVERSION}
-#             virtualenv --python=python build
-#             source build/bin/activate
-#             pip install --upgrade "pip>=19.1" numpy
-#             echo "${CIRCLE_TAG:-$THISVERSION}" > CuBIDS/VERSION
-#             python setup.py sdist
-#             pip wheel --no-deps -w dist/ .
-#       - store_artifacts:
-#           path: /tmp/src/CuBIDS/dist
-#       - run:
-#           name: Check sdist distribution
-#           command: |
-#             THISVERSION=$( python get_version.py )
-#             THISVERSION=${THISVERSION%.dirty*}
-#             THISVERSION=${CIRCLE_TAG:-$THISVERSION}
-#             twine check dist/CuBIDS*.tar.gz
-#             virtualenv --python=python sdist
-#             source sdist/bin/activate
-#             pip install --progress-bar off --upgrade "pip>=19.1" numpy
-#             pip install dist/CuBIDS*.tar.gz
-#             which CuBIDS | grep sdist\\/bin
-#             INSTALLED_VERSION=$(CuBIDS --version)
-#             INSTALLED_VERSION=${INSTALLED_VERSION%$'\r'}
-#             INSTALLED_VERSION=${INSTALLED_VERSION#*"CuBIDS v"}
-#             echo "VERSION: \"$THISVERSION\""
-#             echo "INSTALLED: \"$INSTALLED_VERSION\""
-#             test "$INSTALLED_VERSION" = "$THISVERSION"
-#       - run:
-#           name: Check wheel distribution
-#           command: |
-#             THISVERSION=$( python get_version.py )
-#             THISVERSION=${THISVERSION%.dirty*}
-#             THISVERSION=${CIRCLE_TAG:-$THISVERSION}
-#             twine check dist/CuBIDS*.whl
-#             virtualenv --python=python wheel
-#             source wheel/bin/activate
-#             pip install dist/CuBIDS*.whl
-#             which CuBIDS | grep wheel\\/bin
-#             INSTALLED_VERSION=$(CuBIDS --version)
-#             INSTALLED_VERSION=${INSTALLED_VERSION%$'\r'}
-#             INSTALLED_VERSION=${INSTALLED_VERSION#*"CuBIDS v"}
-#             echo "VERSION: \"$THISVERSION\""
-#             echo "INSTALLED: \"$INSTALLED_VERSION\""
-#             test "$INSTALLED_VERSION" = "$THISVERSION"
-#       - run:
-#           name: Build CuBIDS-container
-#           command: |
-#             THISVERSION=$( python get_version.py )
-#             THISVERSION=${THISVERSION%.dirty*}
-#             cd wrapper
-#             virtualenv --python=python build
-#             source build/bin/activate
-#             pip install --upgrade "pip>=19.1"
-#             sed -i -E "s/(__version__ = )'[A-Za-z0-9.-]+'/\1'${CIRCLE_TAG:-$THISVERSION}'/" qsiprep_docker.py
-#             python setup.py sdist
-#             pip wheel --no-deps -w dist/ .
-#       - store_artifacts:
-#           path: /tmp/src/CuBIDS/wrapper/dist
-
-#   deploy_pypi:
-#     docker:
-#       - image: circleci/python:3.7.4
-#     working_directory: /tmp/src/CuBIDS
-#     steps:
-#       - checkout
-#       - run:
-#           name: Build CuBIDS
-#           command: |
-#             THISVERSION=$( python get_version.py )
-#             virtualenv --python=python build
-#             source build/bin/activate
-#             pip install --upgrade "pip>=19.1" numpy
-#             echo "${CIRCLE_TAG:-$THISVERSION}" > CuBIDS/VERSION
-#             python setup.py sdist
-#             pip wheel --no-deps -w dist/ .
-#       - run:
-#           name: Build CuBIDS-container
-#           command: |
-#             THISVERSION=$( python get_version.py )
-#             cd wrapper
-#             virtualenv --python=python build
-#             source build/bin/activate
-#             pip install --upgrade "pip>=19.1"
-#             sed -i -E "s/(__version__ = )'[A-Za-z0-9.-]+'/\1'${CIRCLE_TAG:-$THISVERSION}'/" qsiprep_docker.py
-#             python setup.py sdist
-#             pip wheel --no-deps -w dist/ .
-#       - run:
-#           name: Upload packages to PyPI
-#           command: |
-#             pip install --user twine
-#             pip install --user --upgrade importlib-metadata
-#             twine upload dist/CuBIDS*gz wrapper/dist/CuBIDS*
-
-  deployable:
-    docker:
-      - image: busybox:latest
-    steps:
-      - run: echo Deploying!
-
+            python3 -m pip install --upgrade twine
+            python3 -m twine upload dist/*
 
 workflows:
   version: 2
   build_test_deploy:
     jobs:
-      - build:
+      - set_up_conda:
           filters:
             tags:
               only: /.*/
 
-      - setup_conda:
-          filters:
-            branches:
-              ignore:
-                - /tests?\/.*/
-                - /docker\/.*/
-            tags:
-              only: /.*/
-
-      - install_and_test:
+      - run_pytests:
           requires:
-            - build
-            - setup_conda
+            - set_up_conda
           filters:
-            branches:
-              ignore:
-                - /tests?\/.*/
-                - /docker\/.*/
-            tags:
-              only: /.*/
-
-      - get_singularity:
-          requires:
-            - build
-          filters:
-            branches:
-              ignore:
-                - /tests?\/.*/
-                - /docker\/.*/
-            tags:
-              only: /.*/
-
-      - install_and_test_singularity:
-          requires:
-            - build
-            - setup_conda
-            - get_singularity
-          filters:
-            branches:
-              ignore:
-                - /tests?\/.*/
-                - /docker\/.*/
-            tags:
-              only: /.*/
-
-      - build_docs:
-          filters:
-            branches:
-              ignore:
-                - /tests?\/.*/
-                - /docker\/.*/
             tags:
               only: /.*/
 
       - deployable:
           requires:
-            - build_docs
-            - install_and_test
-            - install_and_test_singularity
+            - run_pytests
           filters:
             branches:
-              only: master
+              only: main
             tags:
               only: /.*/
 
-      - deploy_docker:
+      - deploy_pypi:
           requires:
             - deployable
           filters:
             branches:
-              only: master
+              only: main
             tags:
               only: /.*/
-
-#       - deploy_pypi:
-#           requires:
-#             - deployable
-#           filters:
-#             branches:
-#               ignore: /.*/
-#             tags:
-#               only: /.*/
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index a02f531ce..42b2b94a0 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -7,7 +7,6 @@ on:
 jobs:
   lint:
     runs-on: ubuntu-latest
-
     steps:
     - name: Set up environment
       uses: actions/checkout@v3
@@ -16,11 +15,12 @@ jobs:
     - name: Set up Python
       uses: actions/setup-python@v4
       with:
-        python-version: '3.7'
+        python-version: '3.9'
     - name: Install dependencies
       run: |
         pip install flake8 flake8-absolute-import flake8-black flake8-docstrings \
         flake8-isort flake8-pyproject flake8-unused-arguments \
-        flake8-use-fstring pep8-naming
+        flake8-use-fstring pep8-naming \
+        codespell tomli
     - name: Run linters
       run: python -m flake8 cubids
diff --git a/.gitignore b/.gitignore
index 974b70a2b..95f82a103 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+cubids/_version.py
 *.DS_Store
 
 # Byte-compiled / optimized / DLL files
diff --git a/.readthedocs.yml b/.readthedocs.yml
index 959cf717c..953696218 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -1,5 +1,13 @@
 version: 2
 
+build:
+  os: ubuntu-22.04
+  tools:
+    python: "3.8"
+
+sphinx:
+  configuration: docs/conf.py
+
 python:
   install:
     - method: pip
diff --git a/.readthedocs/environment.yaml b/.readthedocs/environment.yaml
deleted file mode 100644
index 674e4b858..000000000
--- a/.readthedocs/environment.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-channels:
-  - defaults
-dependencies:
-  - python=3.7
-  - pip>=20.1  # pip is needed as dependency
diff --git a/AUTHORS.rst b/AUTHORS.rst
index 17d9bf381..81d4937b1 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -12,6 +12,6 @@ Contributors
 
 * Tinashe Tapera <tinashe.tapera at pennmedicine dot upenn .edu>
 
-Principle Investigator 
------------------------
+Principal Investigator
+----------------------
 * Theodore Satterthwaite <theodore.satterthwaite at pennmedicine dot upenn .edu>
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 000000000..ea4c13cae
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,107 @@
+# This CITATION.cff file was generated with cffinit.
+# Visit https://bit.ly/cffinit to generate yours today!
+
+cff-version: 1.2.0
+title: >-
+  Curation of BIDS (CuBIDS)
+message: If you use this software, please cite it using the metadata from this file, as well as the NeuroImage paper (doi:10.1016/j.neuroimage.2022.119609).
+type: software
+authors:
+  - given-names: Sydney
+    family-names: Covitz
+    affiliation: University of Pennsylvania
+    orcid: 'https://orcid.org/0000-0002-7430-4125'
+  - given-names: Tinashe M.
+    family-names: Tapera
+  - given-names: Azeez
+    family-names: Adebimpe
+    affiliation: University of Pennsylvania
+    orcid: 'https://orcid.org/0000-0001-9049-0135'
+  - given-names: Aaron F.
+    family-names: Alexander-Bloch
+    affiliation: University of Pennsylvania
+  - given-names: Maxwell
+    family-names: Bertolero
+    orcid: 'https://orcid.org/0000-0002-2691-3698'
+    affiliation: University of Pennsylvania
+  - given-names: Eric
+    family-names: Feczko
+  - given-names: Alexandre R.
+    family-names: Franco
+  - given-names: Raquel E.
+    family-names: Gur
+  - given-names: Ruben C.
+    family-names: Gur
+  - given-names: Timothy
+    family-names: Hendrickson
+  - given-names: Audrey
+    family-names: Houghton
+  - given-names: Kahini
+    family-names: Mehta
+  - given-names: Kristin
+    family-names: Murtha
+    affiliation: University of Pennsylvania
+  - given-names: Anders J.
+    family-names: Perrone
+  - given-names: Tim
+    family-names: Robert-Fitzgerald
+  - given-names: Jenna M.
+    family-names: Schabdach
+  - given-names: Russell T.
+    family-names: Shinohara
+  - given-names: Jacob W.
+    family-names: Vogel
+  - given-names: Chenying
+    family-names: Zhao
+  - given-names: Damien A.
+    family-names: Fair
+  - given-names: Michael
+    family-names: Milham
+  - given-names: Matthew
+    family-names: Cieslak
+    email: matthew.cieslak@pennmedicine.upenn.edu
+    affiliation: University of Pennsylvania
+    orcid: 'https://orcid.org/0000-0002-1931-4734'
+  - given-names: Taylor
+    family-names: Salo
+    email: salot@pennmedicine.upenn.edu
+    affiliation: University of Pennsylvania
+    orcid: 'https://orcid.org/0000-0001-9813-3167'
+  - given-names: Theodore
+    family-names: Satterthwaite
+    affiliation: University of Pennsylvania
+    orcid: 'https://orcid.org/0000-0001-7072-9399'
+identifiers:
+  - type: doi
+    value: 10.5281/zenodo.6514881
+    description: The Zenodo DOI
+  - type: doi
+    value: 10.1016/j.neuroimage.2022.119609
+    description: The NeuroImage journal article
+repository-code: 'https://github.com/PennLINC/CuBIDS'
+url: 'https://cubids.readthedocs.io'
+abstract: >-
+  The Brain Imaging Data Structure (BIDS) is a specification accompanied by a software
+  ecosystem that was designed to create reproducible and automated workflows for processing
+  neuroimaging data.
+  BIDS Apps flexibly build workflows based on the metadata detected in a dataset.
+  However, even BIDS valid metadata can include incorrect values or omissions that result in
+  inconsistent processing across sessions.
+  Additionally, in large-scale, heterogeneous neuroimaging datasets,
+  hidden variability in metadata is difficult to detect and classify.
+  To address these challenges, we created a Python-based software package titled
+  “Curation of BIDS” (CuBIDS), which provides an intuitive workflow that helps users validate
+  and manage the curation of their neuroimaging datasets.
+  CuBIDS includes a robust implementation of BIDS validation that scales to large samples and
+  incorporates DataLad- a version control software package for data- as an optional dependency
+  to ensure reproducibility and provenance tracking throughout the entire curation process.
+  CuBIDS provides tools to help users perform quality control on their images' metadata and
+  identify unique combinations of imaging parameters.
+  Users can then execute BIDS Apps on a subset of participants that represent the full range of
+  acquisition parameters that are present, accelerating pipeline testing on large datasets.
+keywords:
+  - BIDS
+  - Neuroimaging
+license: MIT
+version: 1.0.2
+date-released: '2023-09-07'
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 5fb0cd860..000000000
--- a/Dockerfile
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM ubuntu:bionic-20200921 
-
-# setup installation 
-RUN apt-get update && \
-    apt-get install -y --no-install-recommends \
-    curl ca-certificates && \
-    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# Installing Neurodebian and nodejs packages
-COPY neurodebian.gpg /usr/local/etc/neurodebian.gpg
-RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && \
-    curl -sSL "http://neuro.debian.net/lists/$( lsb_release -c | cut -f2 ).us-ca.full" >> /etc/apt/sources.list.d/neurodebian.sources.list && \
-    apt-key add /usr/local/etc/neurodebian.gpg && \
-    (apt-key adv --refresh-keys --keyserver hkp://ha.pool.sks-keyservers.net 0xA5D32F012649A5A9 || true)
-
-# get dependencies
-RUN apt-get update && \
-    apt-get install -y --no-install-recommends \
-    datalad nodejs python3 python3-pip python3-setuptools && \
-    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# get the validator 
-RUN npm install -g yarn && \
-    npm install -g bids-validator
-
-COPY . /src/CuBIDS
-RUN pip3 install --no-cache-dir "/src/CuBIDS"
-
-ENTRYPOINT [ "/bin/bash"]
diff --git a/cubids/cli.py b/cubids/cli.py
index 7e82f1cd9..5a693d203 100644
--- a/cubids/cli.py
+++ b/cubids/cli.py
@@ -763,32 +763,26 @@ def cubids_copy_exemplars():
         "bids_dir",
         type=Path,
         action="store",
-        help=(
-            "path to the root of a BIDS dataset. "
-            "It should contain sub-X directories and "
-            "dataset_description.json."
-        ),
+        help="path to the root of a BIDS dataset. "
+        "It should contain sub-X directories and "
+        "dataset_description.json.",
     )
     parser.add_argument(
         "exemplars_dir",
         type=Path,
         action="store",
-        help=(
-            "absolute path to the root of a BIDS dataset "
-            "containing one subject from each Acquisition Group. "
-            "It should contain sub-X directories and "
-            "dataset_description.json."
-        ),
+        help="absolute path to the root of a BIDS dataset "
+        "containing one subject from each Acquisition Group. "
+        "It should contain sub-X directories and "
+        "dataset_description.json.",
     )
     parser.add_argument(
         "exemplars_tsv",
         type=Path,
         action="store",
-        help=(
-            "absolute path to the .tsv file that lists one "
-            "subject from each Acqusition Group "
-            "(*_AcqGrouping.tsv from the cubids-group output)"
-        ),
+        help="absolute path to the .tsv file that lists one "
+        "subject from each Acquisition Group "
+        "(*_AcqGrouping.tsv from the cubids-group output)",
     )
     parser.add_argument(
         "--use-datalad", action="store_true", help="check exemplar dataset into DataLad"
@@ -797,11 +791,9 @@ def cubids_copy_exemplars():
         "--min-group-size",
         action="store",
         default=1,
-        help=(
-            "minimum number of subjects an Acquisition Group "
-            "must have in order to be included in the exemplar "
-            "dataset "
-        ),
+        help="minimum number of subjects an Acquisition Group "
+        "must have in order to be included in the exemplar "
+        "dataset ",
         required=False,
     )
     # parser.add_argument('--include-groups',
diff --git a/cubids/cubids.py b/cubids/cubids.py
index 09400eb5d..6fdba68b7 100644
--- a/cubids/cubids.py
+++ b/cubids/cubids.py
@@ -219,7 +219,7 @@ def apply_tsv_changes(self, summary_tsv, files_tsv, new_prefix, raise_on_error=T
         """Apply changes documented in the edited summary tsv and generate the new tsv files.
 
         This function looks at the RenameKeyGroup and MergeInto
-        columns and modifies the bids datset according to the
+        columns and modifies the bids dataset according to the
         specified changs.
 
         Parameters
@@ -825,7 +825,7 @@ def get_param_groups_from_key_group(self, key_group):
         if ret == "erroneous sidecar found":
             return "erroneous sidecar found"
 
-        # add modality to the retun tuple
+        # add modality to the return tuple
         l_ret = list(ret)
         l_ret.append(modality)
         tup_ret = tuple(l_ret)
diff --git a/cubids/metadata_merge.py b/cubids/metadata_merge.py
index 439eb2224..b542e691c 100644
--- a/cubids/metadata_merge.py
+++ b/cubids/metadata_merge.py
@@ -15,7 +15,7 @@
 def check_merging_operations(action_tsv, raise_on_error=False):
     """Check that the merges in an action tsv are possible.
 
-    To be mergable the
+    To be mergeable the
     """
     actions = pd.read_table(action_tsv)
     ok_merges = []
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 750219495..000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,4997 +0,0 @@
-{
-  "name": "CuBIDS",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "dependencies": {
-        "pip": "^0.0.1"
-      }
-    },
-    "node_modules/@aws-crypto/crc32": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz",
-      "integrity": "sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==",
-      "dependencies": {
-        "@aws-crypto/util": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "tslib": "^1.11.1"
-      }
-    },
-    "node_modules/@aws-crypto/crc32/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-    },
-    "node_modules/@aws-crypto/crc32c": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz",
-      "integrity": "sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==",
-      "dependencies": {
-        "@aws-crypto/util": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "tslib": "^1.11.1"
-      }
-    },
-    "node_modules/@aws-crypto/crc32c/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-    },
-    "node_modules/@aws-crypto/ie11-detection": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz",
-      "integrity": "sha512-pkVXf/dq6PITJ0jzYZ69VhL8VFOFoPZLZqtU/12SGnzYuJOOGNfF41q9GxdI1yqC8R13Rq3jOLKDFpUJFT5eTA==",
-      "dependencies": {
-        "tslib": "^1.11.1"
-      }
-    },
-    "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-    },
-    "node_modules/@aws-crypto/sha1-browser": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz",
-      "integrity": "sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==",
-      "dependencies": {
-        "@aws-crypto/ie11-detection": "^2.0.0",
-        "@aws-crypto/supports-web-crypto": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "@aws-sdk/util-locate-window": "^3.0.0",
-        "@aws-sdk/util-utf8-browser": "^3.0.0",
-        "tslib": "^1.11.1"
-      }
-    },
-    "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-    },
-    "node_modules/@aws-crypto/sha256-browser": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
-      "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
-      "dependencies": {
-        "@aws-crypto/ie11-detection": "^2.0.0",
-        "@aws-crypto/sha256-js": "^2.0.0",
-        "@aws-crypto/supports-web-crypto": "^2.0.0",
-        "@aws-crypto/util": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "@aws-sdk/util-locate-window": "^3.0.0",
-        "@aws-sdk/util-utf8-browser": "^3.0.0",
-        "tslib": "^1.11.1"
-      }
-    },
-    "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-    },
-    "node_modules/@aws-crypto/sha256-js": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
-      "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
-      "dependencies": {
-        "@aws-crypto/util": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "tslib": "^1.11.1"
-      }
-    },
-    "node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-    },
-    "node_modules/@aws-crypto/supports-web-crypto": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz",
-      "integrity": "sha512-Ge7WQ3E0OC7FHYprsZV3h0QIcpdyJLvIeg+uTuHqRYm8D6qCFJoiC+edSzSyFiHtZf+NOQDJ1q46qxjtzIY2nA==",
-      "dependencies": {
-        "tslib": "^1.11.1"
-      }
-    },
-    "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-    },
-    "node_modules/@aws-crypto/util": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.1.tgz",
-      "integrity": "sha512-JJmFFwvbm08lULw4Nm5QOLg8+lAQeC8aCXK5xrtxntYzYXCGfHwUJ4Is3770Q7HmICsXthGQ+ZsDL7C2uH3yBQ==",
-      "dependencies": {
-        "@aws-sdk/types": "^3.1.0",
-        "@aws-sdk/util-utf8-browser": "^3.0.0",
-        "tslib": "^1.11.1"
-      }
-    },
-    "node_modules/@aws-crypto/util/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-    },
-    "node_modules/@aws-sdk/abort-controller": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.55.0.tgz",
-      "integrity": "sha512-rCcTxJDEFnmvo/PgbhCRv24/Uv03lEGfRslKZq7SjaMcOubflS/ZXYaMEgsjYHgAT0zlpSsyCIkJXmhFaM7H7w==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/chunked-blob-reader": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.55.0.tgz",
-      "integrity": "sha512-o/xjMCq81opAjSBjt7YdHJwIJcGVG5XIV9+C2KXcY5QwVimkOKPybWTv0mXPvSwSilSx+EhpLNhkcJuXdzhw4w==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/chunked-blob-reader-native": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.58.0.tgz",
-      "integrity": "sha512-+D3xnPD5985iphgAqgUerBDs371a2WzzoEVi7eHJUMMsP/gEnSTdSH0HNxsqhYv6CW4EdKtvDAQdAwA1VtCf2A==",
-      "dependencies": {
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/client-s3": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.74.0.tgz",
-      "integrity": "sha512-+KzVZ4fewPdMN41+1lI0WLGtjPat0G6tg5d0NM/cPUDonH+a/o1thzyibtjgq+fy68JvW9YGBc5ejevotQp/Ow==",
-      "dependencies": {
-        "@aws-crypto/sha1-browser": "2.0.0",
-        "@aws-crypto/sha256-browser": "2.0.0",
-        "@aws-crypto/sha256-js": "2.0.0",
-        "@aws-sdk/client-sts": "3.74.0",
-        "@aws-sdk/config-resolver": "3.58.0",
-        "@aws-sdk/credential-provider-node": "3.74.0",
-        "@aws-sdk/eventstream-serde-browser": "3.72.0",
-        "@aws-sdk/eventstream-serde-config-resolver": "3.55.0",
-        "@aws-sdk/eventstream-serde-node": "3.72.0",
-        "@aws-sdk/fetch-http-handler": "3.58.0",
-        "@aws-sdk/hash-blob-browser": "3.58.0",
-        "@aws-sdk/hash-node": "3.55.0",
-        "@aws-sdk/hash-stream-node": "3.58.0",
-        "@aws-sdk/invalid-dependency": "3.55.0",
-        "@aws-sdk/md5-js": "3.58.0",
-        "@aws-sdk/middleware-bucket-endpoint": "3.58.0",
-        "@aws-sdk/middleware-content-length": "3.58.0",
-        "@aws-sdk/middleware-expect-continue": "3.58.0",
-        "@aws-sdk/middleware-flexible-checksums": "3.72.0",
-        "@aws-sdk/middleware-host-header": "3.58.0",
-        "@aws-sdk/middleware-location-constraint": "3.55.0",
-        "@aws-sdk/middleware-logger": "3.55.0",
-        "@aws-sdk/middleware-retry": "3.58.0",
-        "@aws-sdk/middleware-sdk-s3": "3.66.0",
-        "@aws-sdk/middleware-serde": "3.55.0",
-        "@aws-sdk/middleware-signing": "3.58.0",
-        "@aws-sdk/middleware-ssec": "3.55.0",
-        "@aws-sdk/middleware-stack": "3.55.0",
-        "@aws-sdk/middleware-user-agent": "3.58.0",
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/node-http-handler": "3.74.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/signature-v4-multi-region": "3.66.0",
-        "@aws-sdk/smithy-client": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/url-parser": "3.55.0",
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "@aws-sdk/util-base64-node": "3.55.0",
-        "@aws-sdk/util-body-length-browser": "3.55.0",
-        "@aws-sdk/util-body-length-node": "3.55.0",
-        "@aws-sdk/util-defaults-mode-browser": "3.72.0",
-        "@aws-sdk/util-defaults-mode-node": "3.72.0",
-        "@aws-sdk/util-stream-browser": "3.55.0",
-        "@aws-sdk/util-stream-node": "3.55.0",
-        "@aws-sdk/util-user-agent-browser": "3.58.0",
-        "@aws-sdk/util-user-agent-node": "3.58.0",
-        "@aws-sdk/util-utf8-browser": "3.55.0",
-        "@aws-sdk/util-utf8-node": "3.55.0",
-        "@aws-sdk/util-waiter": "3.55.0",
-        "@aws-sdk/xml-builder": "3.55.0",
-        "entities": "2.2.0",
-        "fast-xml-parser": "3.19.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/client-sso": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.74.0.tgz",
-      "integrity": "sha512-tDDxCeiYy6M5LuJluJB9YgWVUuQ4Rzx95bevd6QiSfVaUkQH/PdJt3pULdrCGzwxztCf8PrrypB6WqOIZ9jxHQ==",
-      "dependencies": {
-        "@aws-crypto/sha256-browser": "2.0.0",
-        "@aws-crypto/sha256-js": "2.0.0",
-        "@aws-sdk/config-resolver": "3.58.0",
-        "@aws-sdk/fetch-http-handler": "3.58.0",
-        "@aws-sdk/hash-node": "3.55.0",
-        "@aws-sdk/invalid-dependency": "3.55.0",
-        "@aws-sdk/middleware-content-length": "3.58.0",
-        "@aws-sdk/middleware-host-header": "3.58.0",
-        "@aws-sdk/middleware-logger": "3.55.0",
-        "@aws-sdk/middleware-retry": "3.58.0",
-        "@aws-sdk/middleware-serde": "3.55.0",
-        "@aws-sdk/middleware-stack": "3.55.0",
-        "@aws-sdk/middleware-user-agent": "3.58.0",
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/node-http-handler": "3.74.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/smithy-client": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/url-parser": "3.55.0",
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "@aws-sdk/util-base64-node": "3.55.0",
-        "@aws-sdk/util-body-length-browser": "3.55.0",
-        "@aws-sdk/util-body-length-node": "3.55.0",
-        "@aws-sdk/util-defaults-mode-browser": "3.72.0",
-        "@aws-sdk/util-defaults-mode-node": "3.72.0",
-        "@aws-sdk/util-user-agent-browser": "3.58.0",
-        "@aws-sdk/util-user-agent-node": "3.58.0",
-        "@aws-sdk/util-utf8-browser": "3.55.0",
-        "@aws-sdk/util-utf8-node": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/client-sts": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.74.0.tgz",
-      "integrity": "sha512-DLK5TLxU2Q2b2dw/mhfkeyUPTDmGVAp93lxzKmeDPAfFyMvvW+ODQaiSAYsOPRyr+ebJYmfgDIEgFB7ucprWOg==",
-      "dependencies": {
-        "@aws-crypto/sha256-browser": "2.0.0",
-        "@aws-crypto/sha256-js": "2.0.0",
-        "@aws-sdk/config-resolver": "3.58.0",
-        "@aws-sdk/credential-provider-node": "3.74.0",
-        "@aws-sdk/fetch-http-handler": "3.58.0",
-        "@aws-sdk/hash-node": "3.55.0",
-        "@aws-sdk/invalid-dependency": "3.55.0",
-        "@aws-sdk/middleware-content-length": "3.58.0",
-        "@aws-sdk/middleware-host-header": "3.58.0",
-        "@aws-sdk/middleware-logger": "3.55.0",
-        "@aws-sdk/middleware-retry": "3.58.0",
-        "@aws-sdk/middleware-sdk-sts": "3.58.0",
-        "@aws-sdk/middleware-serde": "3.55.0",
-        "@aws-sdk/middleware-signing": "3.58.0",
-        "@aws-sdk/middleware-stack": "3.55.0",
-        "@aws-sdk/middleware-user-agent": "3.58.0",
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/node-http-handler": "3.74.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/smithy-client": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/url-parser": "3.55.0",
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "@aws-sdk/util-base64-node": "3.55.0",
-        "@aws-sdk/util-body-length-browser": "3.55.0",
-        "@aws-sdk/util-body-length-node": "3.55.0",
-        "@aws-sdk/util-defaults-mode-browser": "3.72.0",
-        "@aws-sdk/util-defaults-mode-node": "3.72.0",
-        "@aws-sdk/util-user-agent-browser": "3.58.0",
-        "@aws-sdk/util-user-agent-node": "3.58.0",
-        "@aws-sdk/util-utf8-browser": "3.55.0",
-        "@aws-sdk/util-utf8-node": "3.55.0",
-        "entities": "2.2.0",
-        "fast-xml-parser": "3.19.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/config-resolver": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.58.0.tgz",
-      "integrity": "sha512-NXEwYw0JrXcvenu42QpNMQXK+6pgZ+6bDGfCgOfCC0FmyI+w/CuF36lApwm7InHvHazOaDlwArXm2pfntErKoA==",
-      "dependencies": {
-        "@aws-sdk/signature-v4": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-config-provider": "3.55.0",
-        "@aws-sdk/util-middleware": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/credential-provider-env": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.55.0.tgz",
-      "integrity": "sha512-4AIIXEdvinLlWNFtrUbUgoB7dkuV04RTcTruVWI4Ub4WSsuSCa72ZU1vqyvcEAOgGGLBmcSaGTWByjiD2sGcGA==",
-      "dependencies": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/credential-provider-imds": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.58.0.tgz",
-      "integrity": "sha512-CdtnTQ9zqLx1FbXdbgjijLbMcIWOyQM03TFaLSCjI3FNbUwyt3T7StBU9tj/LtbypHhSdXyQBpzUtXTOMWCEhg==",
-      "dependencies": {
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/url-parser": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/credential-provider-ini": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.74.0.tgz",
-      "integrity": "sha512-knnHAEjGfVO/09O7cLrtHwJeg/5p+6Y0xqGGGcmi5fyF8zEXmXuf6UJQIxBXE1r22ADpQ5/E8WfCJ3IzVLH1UQ==",
-      "dependencies": {
-        "@aws-sdk/credential-provider-env": "3.55.0",
-        "@aws-sdk/credential-provider-imds": "3.58.0",
-        "@aws-sdk/credential-provider-sso": "3.74.0",
-        "@aws-sdk/credential-provider-web-identity": "3.55.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/credential-provider-node": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.74.0.tgz",
-      "integrity": "sha512-GGd1kMN8fgtOTSq1CAk2So5AeW+Wi83iEZVL4gHmUiiwdZejtAcjtgA7uLx0YwULNMcvc4qrGewNlXkO2F7U7w==",
-      "dependencies": {
-        "@aws-sdk/credential-provider-env": "3.55.0",
-        "@aws-sdk/credential-provider-imds": "3.58.0",
-        "@aws-sdk/credential-provider-ini": "3.74.0",
-        "@aws-sdk/credential-provider-process": "3.58.0",
-        "@aws-sdk/credential-provider-sso": "3.74.0",
-        "@aws-sdk/credential-provider-web-identity": "3.55.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/credential-provider-process": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.58.0.tgz",
-      "integrity": "sha512-npgFqPUjMhUamf1FvJjBYUdpbWx8XWkKCwJsX73I7IYQAvAi2atCOkdtKq+4rds0VWAYu6vzlaI1tXgFxjOPNQ==",
-      "dependencies": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/credential-provider-sso": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.74.0.tgz",
-      "integrity": "sha512-EpwLqm9rqJ/l5/R2kq48LscSW8xSThraRT4res0w9kOMiOMIiphWX/glNE37FCFrQBwBDIGZ8T5RhftRgXRBag==",
-      "dependencies": {
-        "@aws-sdk/client-sso": "3.74.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/credential-provider-web-identity": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.55.0.tgz",
-      "integrity": "sha512-aKnXfZNGohTuF9rCGYLg4JEIOvWIZ/sb66XMq7bOUrx13KRPDwL/eUQL8quS5jGRLpjXVNvrS17AFf65GbdUBg==",
-      "dependencies": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/eventstream-marshaller": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.58.0.tgz",
-      "integrity": "sha512-vTdVFLIHGZTx/Anp9GpkTXVuvwSCNOecTutU5Py4i6fATgefWiSutc5Xc/FLujBSc0EhAXDGZIcTMpZC7jUpeg==",
-      "dependencies": {
-        "@aws-crypto/crc32": "2.0.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-hex-encoding": "3.58.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/eventstream-serde-browser": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.72.0.tgz",
-      "integrity": "sha512-UhMZ4P60mZu7G+craAdkRgR4/n3lWAgrNp1upgN2W8RLEQwhqY3qHiUdn/kp6qvontwHnxZkXNB+5Zm5pcP8bQ==",
-      "dependencies": {
-        "@aws-sdk/eventstream-marshaller": "3.58.0",
-        "@aws-sdk/eventstream-serde-universal": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/eventstream-serde-config-resolver": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.55.0.tgz",
-      "integrity": "sha512-NTJHLq1sbXyXAaJucKvcdN3Svr/fM2TjHEC3l8P/torFjIsX1+Ykpi8tZt8KsX8RjoUTTfKylh41AjJq0K9X4Q==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/eventstream-serde-node": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.72.0.tgz",
-      "integrity": "sha512-woemBkQ3O7mTiT3kdJH72s3lQLhr2B7hxRhYeaa1xQf1UjLJkKXL5PEOOrcylmxLdF6rYLsFs8Y/Hr4FZfqAqA==",
-      "dependencies": {
-        "@aws-sdk/eventstream-marshaller": "3.58.0",
-        "@aws-sdk/eventstream-serde-universal": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/eventstream-serde-universal": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.72.0.tgz",
-      "integrity": "sha512-iIaDC/2xgK+2kLiOPJv8wMDCCtI2JB8bkeac6cQOfn4hZGQdP6fvRGFWD2R8//VR52H68N2vrhCXHvtjnF4iFg==",
-      "dependencies": {
-        "@aws-sdk/eventstream-marshaller": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/fetch-http-handler": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.58.0.tgz",
-      "integrity": "sha512-timF3FjPV5Bd+Kgph83LIKVlPCFObVYzious1a6doeLAT6YFwZpRrWbfP/HzS+DCoYiwUsH69oVJ91BoV66oyA==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/querystring-builder": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/hash-blob-browser": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.58.0.tgz",
-      "integrity": "sha512-fdp12BqypRxwvevbJSl/sUhXJRi4Ghv6JKEXAHI1klkR6xY1GRORO5SHWltVY/xl373ERMol5o/n+ra/7jcx/g==",
-      "dependencies": {
-        "@aws-sdk/chunked-blob-reader": "3.55.0",
-        "@aws-sdk/chunked-blob-reader-native": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/hash-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.55.0.tgz",
-      "integrity": "sha512-2UdYwY/++AlzWEAFaK9wOed2QSxbzV527vmqKjReLHpPKPrSIlooUxlTH3LU6Y6WVDAzDRtLK43KUVXTLgGK1A==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-buffer-from": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/hash-stream-node": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.58.0.tgz",
-      "integrity": "sha512-y7HEeC3OiuXCRqsHnKDn5yef8UAbnegD9r+OM9bdD+3e6FLAL8Rq7hQTOpwIAiPXuD7HKx8h98s9JLvkwTOBkg==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/invalid-dependency": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.55.0.tgz",
-      "integrity": "sha512-delH0lV+78fdD/8MXIt9kTLS6IwHvdhqq9dw/ow5VjTUw+xBwUlfPfZplaai+3hKTKWh6a2WZCeDasNItBv9aA==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/is-array-buffer": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.55.0.tgz",
-      "integrity": "sha512-NbiPHVYuPxdqdFd6FxzzN3H1BQn/iWA3ri3Ry7AyLeP/tGs1yzEWMwf8BN8TSMALI0GXT6Sh0GDWy3Ok5xB6DA==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/md5-js": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.58.0.tgz",
-      "integrity": "sha512-V5f4Re+CLn3aDF1nrmDqdUtcqBHCyxxD2s2Ot+hZ2JFit+OtJggo1cI03ldTrQpG79rwHG+bHqL2VvNQP7Aj9A==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-utf8-browser": "3.55.0",
-        "@aws-sdk/util-utf8-node": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-bucket-endpoint": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.58.0.tgz",
-      "integrity": "sha512-zocLfFzj+NQjXLGZKPJBAYWWldAKBJkGzGVpTfrYx9bxxHTA70Gu+3sx+Xe+iOu8dtQT0OAnIX0wGudOPnTGNg==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-arn-parser": "3.55.0",
-        "@aws-sdk/util-config-provider": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-content-length": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.58.0.tgz",
-      "integrity": "sha512-h/BypPkhjv2CpCUbXA8Fa2s7V2GPiz9l11XhYK+sKSuQvQ7Lbq6VhaKaLqfeD3gLVZHgJZSLGl2btdHV1qHNNA==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-expect-continue": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.58.0.tgz",
-      "integrity": "sha512-nx6X6qLPwvbJrGoPxXSu4tsOek2eRnnjk78hhRUDfxFewpHJQLSPlyNKkXAo+C3syVALe6RJRmUYu5bShY6FfA==",
-      "dependencies": {
-        "@aws-sdk/middleware-header-default": "3.58.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-flexible-checksums": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.72.0.tgz",
-      "integrity": "sha512-lrwTmpygp6bxGRi6kbMq+EtTW5nsts+B7Wj7MA8PBIQsKU06T2tYxjDBYOyHB1MiVhltlq+vebBvacT64KsbFA==",
-      "dependencies": {
-        "@aws-crypto/crc32": "2.0.0",
-        "@aws-crypto/crc32c": "2.0.0",
-        "@aws-sdk/is-array-buffer": "3.55.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-header-default": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.58.0.tgz",
-      "integrity": "sha512-7F+CdLLauMmNbwFGYrE2pKsgTKY8G2PgazHmaE9s3FySEFcGPWmiEAG8sVImfZooj8gxGFQMLr97nanWjhSq2Q==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-host-header": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.58.0.tgz",
-      "integrity": "sha512-q/UKGcanm9e6DBRNN6UKhVqLvpRRdZWbmmPCeDNr4HqhCmgT6i1OvWdhAMOnT++hvCX8DpTsIXzNSlY6zWAxBg==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-location-constraint": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.55.0.tgz",
-      "integrity": "sha512-OvCKwBFbl8Gbfk0HGX00pkdORJN8BPuH/O5l3+mOBWuwILPuckRP5WGnL+1HT/gu4hHS6h1lpxUrPxUOoeKIAg==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-logger": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.55.0.tgz",
-      "integrity": "sha512-PtRbVrxEzDmeV9prBIP4/9or7R5Dj66mjbFSvNRGZ0n+UBfBFfVRfNrhQPNzQpfV9A3KVl9YyWCVXDSW+/rk9Q==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-retry": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.58.0.tgz",
-      "integrity": "sha512-sfSq+t0Yy47DQwrWGpA8iOx9sd26l4l1JDVTwHNi7+OKD4ClRPVCEdw3bTbbyYz/PV4f9AEfAZ6jwtSff4wkGw==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/service-error-classification": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-middleware": "3.55.0",
-        "tslib": "^2.3.1",
-        "uuid": "^8.3.2"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-sdk-s3": {
-      "version": "3.66.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.66.0.tgz",
-      "integrity": "sha512-4ACAdKAZkIjEK99UwoaKTrTGhS7qGqyLmjiGHlzR0ggMUUVmlep7EtcluImFtT6pi+ANVLDzuZGa+95MwGY/Qg==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-arn-parser": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-sdk-sts": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.58.0.tgz",
-      "integrity": "sha512-HUz7MhcsSDDTGygOwL61l4voc0pZco06J3z06JjTX19D5XxcQ7hSCtkHHHz0oMb9M1himVSiEon2tjhjsnB99g==",
-      "dependencies": {
-        "@aws-sdk/middleware-signing": "3.58.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/signature-v4": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-serde": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.55.0.tgz",
-      "integrity": "sha512-NkEbTDrSZcC2NhuvfjXHKJEl0xgI2B5tMAwi/rMOq/TEnARwVUL9qAy+5lgeiPCqebiNllWatARrFgAaYf0VeA==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-signing": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.58.0.tgz",
-      "integrity": "sha512-4FXubHB66GbhyZUlo6YPQoWpYfED15GNbEmHbJLSONzrVzZR3IkViSPLasDngVm1a050JqKuqNkFYGJBP4No/Q==",
-      "dependencies": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/signature-v4": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-ssec": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.55.0.tgz",
-      "integrity": "sha512-HTdA23hksOphQe0TmYORsa/kMNnKRGbdh0VJcsDGHQScJXzJ+C//THwfcoklff0XZfC+vGh93PECBWqixMELZw==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-stack": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.55.0.tgz",
-      "integrity": "sha512-ouD+wFz8W2R0ZQ8HrbhgN8tg1jyINEg9lPEEXY79w1Q5sf94LJ90XKAMVk02rw3dJalUWjLHf0OQe1/qxZfHyA==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/middleware-user-agent": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.58.0.tgz",
-      "integrity": "sha512-1c69bIWM63JwXijXvb9IWwcwQ/gViKMZ1lhxv52NvdG5VSxWXXsFJ2jETEXZoAypwT97Hmf3xo9SYuaHcKoq+g==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/node-config-provider": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.58.0.tgz",
-      "integrity": "sha512-AMcPqPhKxo/3/yOMS9PsKlI0GWp2/8eD6gSlhzdBpznPCKplyqXOSnSX7wS814Cyh373hFSjCaOrCOA9/EYtDg==",
-      "dependencies": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/node-http-handler": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.74.0.tgz",
-      "integrity": "sha512-tykxW9jlj/+e+sHS3NkUSHYKHzkD5cO7mggQv1BnoD6lOB+hjqJTsqyvJ29z4GYeFefSwZR4bObLkTxMETwLBg==",
-      "dependencies": {
-        "@aws-sdk/abort-controller": "3.55.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/querystring-builder": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/property-provider": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.55.0.tgz",
-      "integrity": "sha512-o7cKFJSHq5WOhwPsspYrzNto35oKKZvESZuWDtLxaZKSI6l7zpA366BI4kDG6Tc9i2+teV553MbxyZ9eya5A8g==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/protocol-http": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.58.0.tgz",
-      "integrity": "sha512-0yFFRPbR+CCa9eOQBBQ2qtrIDLYqSMN0y7G4iqVM8wQdIw7n3QK1PsTI3RNPGJ3Oi2krFTw5uUKqQQZPZEBuVQ==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/querystring-builder": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.55.0.tgz",
-      "integrity": "sha512-/ZAXNipt9nRR8k+eowwukE/YjXnQ49p5w/MkaQxsBk3IuIf7MAcgVg8glHr0igH84GfUQ7ZVP8v+G2S3tKUG+Q==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-uri-escape": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/querystring-parser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.55.0.tgz",
-      "integrity": "sha512-e+2FLgo+eDx7oh7ap5HngN9XSVMxredAVztLHxCcSN0lFHHHzMa8b2SpXbaowUxQHh7ziymSqvOrPYFQ71Filg==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/service-error-classification": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.55.0.tgz",
-      "integrity": "sha512-HdjnDyarsa1Avq1MJurkLyEe9c3eRa76dPmK4TmRGgwJ+tInEzGHL0rBW7V8xBK+PDF+fJQ71hvm8jPYmzvBwQ==",
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/shared-ini-file-loader": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.58.0.tgz",
-      "integrity": "sha512-ARDKQerIzgNs/MFNdCEuK2lgRJ1lneAaJw0p9O1LkJUvcSibvkSATwny7vwJMueOf+ae1Pf+8+54OMNIt0nTkQ==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/signature-v4": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.58.0.tgz",
-      "integrity": "sha512-flEo8p3XkzWoBDqnIUQre4jLuT5aLnmfQNI8c2uSjyJ3OBxpJ0iS1cDu3E++d1/pN6Q8o0KOmr2ypHeiyBOujw==",
-      "dependencies": {
-        "@aws-sdk/is-array-buffer": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-hex-encoding": "3.58.0",
-        "@aws-sdk/util-middleware": "3.55.0",
-        "@aws-sdk/util-uri-escape": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/signature-v4-multi-region": {
-      "version": "3.66.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.66.0.tgz",
-      "integrity": "sha512-Akvc8G9Del2+umg0R/5Gc/PWgQwbxxTXdnm6YTHtDzvyPPiYWBs6au6WqJQqcqk07gcQV67MLVqFFhnFuLlcVg==",
-      "dependencies": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/signature-v4": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-arn-parser": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "peerDependencies": {
-        "@aws-sdk/signature-v4-crt": "^3.66.0"
-      },
-      "peerDependenciesMeta": {
-        "@aws-sdk/signature-v4-crt": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@aws-sdk/smithy-client": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.72.0.tgz",
-      "integrity": "sha512-eQ2pEzxtS1Vz1XyNKzG4Z+mtfwRzcAs4FUQP0wrrYVJMsIdI0X4vvro8gYGoBbQtOz65uY3XqQdLuXX/SabTQg==",
-      "dependencies": {
-        "@aws-sdk/middleware-stack": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/types": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.55.0.tgz",
-      "integrity": "sha512-wrDZjuy1CVAYxDCbm3bWQIKMGfNs7XXmG0eG4858Ixgqmq2avsIn5TORy8ynBxcXn9aekV/+tGEQ7BBSYzIVNQ==",
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/url-parser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.55.0.tgz",
-      "integrity": "sha512-qrTwN5xIgTLreqLnZ+x3cAudjNKfxi6srW1H/px2mk4lb2U9B4fpGjZ6VU+XV8U2kR+YlT8J6Jo5iwuVGfC91A==",
-      "dependencies": {
-        "@aws-sdk/querystring-parser": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/util-arn-parser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.55.0.tgz",
-      "integrity": "sha512-76KJxp4MRWufHYWys7DFl64znr5yeJ3AIQNAPCKKw1sP0hzO7p6Kx0PaJnw9x+CPSzOrT4NbuApL6/srYhKDGg==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-base64-browser": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz",
-      "integrity": "sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/util-base64-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.55.0.tgz",
-      "integrity": "sha512-UQ/ZuNoAc8CFMpSiRYmevaTsuRKzLwulZTnM8LNlIt9Wx1tpNvqp80cfvVj7yySKROtEi20wq29h31dZf1eYNQ==",
-      "dependencies": {
-        "@aws-sdk/util-buffer-from": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-body-length-browser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.55.0.tgz",
-      "integrity": "sha512-Ei2OCzXQw5N6ZkTMZbamUzc1z+z1R1Ja5tMEagz5BxuX4vWdBObT+uGlSzL8yvTbjoPjnxWA2aXyEqaUP3JS8Q==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/util-body-length-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.55.0.tgz",
-      "integrity": "sha512-lU1d4I+9wJwydduXs0SxSfd+mHKjxeyd39VwOv6i2KSwWkPbji9UQqpflKLKw+r45jL7+xU/zfeTUg5Tt/3Gew==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-buffer-from": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.55.0.tgz",
-      "integrity": "sha512-uVzKG1UgvnV7XX2FPTylBujYMKBPBaq/qFBxfl0LVNfrty7YjpfieQxAe6yRLD+T0Kir/WDQwGvYC+tOYG3IGA==",
-      "dependencies": {
-        "@aws-sdk/is-array-buffer": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-config-provider": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.55.0.tgz",
-      "integrity": "sha512-30dzofQQfx6tp1jVZkZ0DGRsT0wwC15nEysKRiAcjncM64A0Cm6sra77d0os3vbKiKoPCI/lMsFr4o3533+qvQ==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-defaults-mode-browser": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.72.0.tgz",
-      "integrity": "sha512-xeoh4jdq+tpZWDwGeXeoAQI+rZaCBEicjumBcqfzkRFE3DyaeyPHn3hiKGSR13R+P6Uf86aqaRNmWAeZZjeE0w==",
-      "dependencies": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "bowser": "^2.11.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-defaults-mode-node": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.72.0.tgz",
-      "integrity": "sha512-Qf4BZmjWTaWaWbIhra/il8zUAdYY6G4JIcg9WMzQgnh1L/iXpCZddInfB2zT4j5rSAuBf5Ov2T6zvtw3/KOh6Q==",
-      "dependencies": {
-        "@aws-sdk/config-resolver": "3.58.0",
-        "@aws-sdk/credential-provider-imds": "3.58.0",
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-hex-encoding": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz",
-      "integrity": "sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-locate-window": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.55.0.tgz",
-      "integrity": "sha512-0sPmK2JaJE2BbTcnvybzob/VrFKCXKfN4CUKcvn0yGg/me7Bz+vtzQRB3Xp+YSx+7OtWxzv63wsvHoAnXvgxgg==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-middleware": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.55.0.tgz",
-      "integrity": "sha512-82fW2XV+rUalv8lkd4VlhpPp6xnXO5n9sckMp1N+TrQ+p8eqxqT0+o8n1/6s9Qsnkw64Y3m6+EfCdc8/uFOY2g==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-stream-browser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.55.0.tgz",
-      "integrity": "sha512-3f/zQsAqexJpKssCL0adTjG8WO+NPQ63E3TingyKpnCnHQPEnqPdya5I5OLGzZ0WR0iUWRtpuW0MtuDabyLDWw==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/util-stream-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.55.0.tgz",
-      "integrity": "sha512-brCK3iENvXEL7BK5eDAdkZ2VuBSvXj7DH9EQezxl4Ntrj1lvb+McOk9WoU/o7yzE7A/bzEJEoNQAPi+VPNbb/w==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-uri-escape": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz",
-      "integrity": "sha512-mmdDLUpFCN2nkfwlLdOM54lTD528GiGSPN1qb8XtGLgZsJUmg3uJSFIN2lPeSbEwJB3NFjVas/rnQC48i7mV8w==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-user-agent-browser": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.58.0.tgz",
-      "integrity": "sha512-aJpqCvT09giJRg5xFTBDBRAVF0k0yq3OEf6UTuiOVf5azlL2MGp6PJ/xkJp9Z06PuQQkwBJ/2nIQZemo02a5Sw==",
-      "dependencies": {
-        "@aws-sdk/types": "3.55.0",
-        "bowser": "^2.11.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/util-user-agent-node": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.58.0.tgz",
-      "integrity": "sha512-VlbY/nzWdN2pfLUHqKvnlGBQ6tEeV4jyK9ggAD2Szjj0bkYvaaKwpBKswQmuJpi5/J2v7Bo4ayBLnqDL7PgzLA==",
-      "dependencies": {
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-utf8-browser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.55.0.tgz",
-      "integrity": "sha512-ljzqJcyjfJpEVSIAxwtIS8xMRUly84BdjlBXyp6cu4G8TUufgjNS31LWdhyGhgmW5vYBNr+LTz0Kwf6J+ou7Ug==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@aws-sdk/util-utf8-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.55.0.tgz",
-      "integrity": "sha512-FsFm7GFaC7j0tlPEm/ri8bU2QCwFW5WKjxUg8lm1oWaxplCpKGUsmcfPJ4sw58GIoyoGu4QXBK60oCWosZYYdQ==",
-      "dependencies": {
-        "@aws-sdk/util-buffer-from": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/util-waiter": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.55.0.tgz",
-      "integrity": "sha512-Do34MKPFSC/+zVN6vY+FZ+0WN61hzga4nPoAC590AOjs8rW6/H6sDN6Gz1KAZbPnuQUZfvsIJjMxN7lblXHJkQ==",
-      "dependencies": {
-        "@aws-sdk/abort-controller": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/xml-builder": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.55.0.tgz",
-      "integrity": "sha512-BH+i5S2FLprmfSeIuGy3UbNtEoJPVjh8arl5+LV3i2KY/+TmrS4yT8JtztDlDxHF0cMtNLZNO0KEPtsACS6SOg==",
-      "dependencies": {
-        "tslib": "^2.3.1"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      }
-    },
-    "node_modules/@types/concat-stream": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
-      "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/form-data": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
-      "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/node": {
-      "version": "8.10.66",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
-      "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="
-    },
-    "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=="
-    },
-    "node_modules/@xmldom/xmldom": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz",
-      "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==",
-      "optional": true,
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/asap": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
-    },
-    "node_modules/astral-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-    },
-    "node_modules/bids-validator": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/bids-validator/-/bids-validator-1.9.3.tgz",
-      "integrity": "sha512-16fMo7WfD/8OL/qh9VkKfQ927clt/io+MAnG3W8tQ9SlB/By2VhumnuQwYHkWpjpfYbastoHwDMSvOqTNf34Yw==",
-      "dependencies": {
-        "@aws-sdk/client-s3": "^3.9.0",
-        "ajv": "^6.5.2",
-        "bytes": "^3.0.0",
-        "colors": "^1.4.0",
-        "cross-fetch": "^3.0.6",
-        "date-fns": "^2.7.0",
-        "events": "^3.3.0",
-        "exifreader": "^4.1.0",
-        "hed-validator": "^3.5.0",
-        "ignore": "^4.0.2",
-        "is-utf8": "^0.2.1",
-        "jshint": "^2.9.6",
-        "lodash": "^4.17.21",
-        "minimatch": "3.0.4",
-        "nifti-js": "^1.0.1",
-        "p-limit": "^2.1.0",
-        "pako": "^1.0.6",
-        "path": "^0.12.7",
-        "pluralize": "^8.0.0",
-        "semver": "^7.3.2",
-        "stream-browserify": "^3.0.0",
-        "table": "^5.2.3",
-        "xml2js": "^0.4.23",
-        "yaml": "^1.10.2",
-        "yargs": "^16.2.0"
-      },
-      "bin": {
-        "bids-validator": "bin/bids-validator"
-      },
-      "engines": {
-        "node": ">=12.12.0"
-      }
-    },
-    "node_modules/bowser": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
-      "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
-    },
-    "node_modules/bytes": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/camelcase": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
-    },
-    "node_modules/cli": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
-      "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
-      "dependencies": {
-        "exit": "0.1.2",
-        "glob": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=0.2.5"
-      }
-    },
-    "node_modules/cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
-      }
-    },
-    "node_modules/cliui/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cliui/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-    },
-    "node_modules/cliui/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cliui/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cliui/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/code-point-at": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-    },
-    "node_modules/colors": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
-      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
-      "engines": {
-        "node": ">=0.1.90"
-      }
-    },
-    "node_modules/combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dependencies": {
-        "delayed-stream": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "node_modules/concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "engines": [
-        "node >= 0.8"
-      ],
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "node_modules/concat-stream/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-    },
-    "node_modules/concat-stream/node_modules/readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/concat-stream/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "dependencies": {
-        "date-now": "^0.1.4"
-      }
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
-    },
-    "node_modules/cross-fetch": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
-      "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
-      "dependencies": {
-        "node-fetch": "2.6.7"
-      }
-    },
-    "node_modules/date-and-time": {
-      "version": "0.14.2",
-      "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz",
-      "integrity": "sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA=="
-    },
-    "node_modules/date-fns": {
-      "version": "2.28.0",
-      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
-      "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
-      "engines": {
-        "node": ">=0.11"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/date-fns"
-      }
-    },
-    "node_modules/date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
-    },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/dom-serializer": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
-      "dependencies": {
-        "domelementtype": "^2.0.1",
-        "entities": "^2.0.0"
-      }
-    },
-    "node_modules/dom-serializer/node_modules/domelementtype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ]
-    },
-    "node_modules/domelementtype": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
-    },
-    "node_modules/domhandler": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
-      "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
-      "dependencies": {
-        "domelementtype": "1"
-      }
-    },
-    "node_modules/domutils": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
-      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
-      "dependencies": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
-    },
-    "node_modules/entities": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/events": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "engines": {
-        "node": ">=0.8.x"
-      }
-    },
-    "node_modules/exifreader": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/exifreader/-/exifreader-4.5.0.tgz",
-      "integrity": "sha512-CUkDKjA+hNV6+bx5skPPdjeyPV28LZtqrd/7Sli1j2Y/QTZC7PQc+h2j5TeIo5zYbYhwzEN6chgeTdWLY33cUg==",
-      "hasInstallScript": true,
-      "optionalDependencies": {
-        "@xmldom/xmldom": "^0.7.5"
-      }
-    },
-    "node_modules/exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-    },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
-    },
-    "node_modules/fast-xml-parser": {
-      "version": "3.19.0",
-      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz",
-      "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==",
-      "bin": {
-        "xml2js": "cli.js"
-      },
-      "funding": {
-        "type": "paypal",
-        "url": "https://paypal.me/naturalintelligence"
-      }
-    },
-    "node_modules/form-data": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
-      "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 0.12"
-      }
-    },
-    "node_modules/freckle": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/freckle/-/freckle-0.0.2.tgz",
-      "integrity": "sha512-+x+LoiQ4IDln6qgVyXEHAvu2uD/mRqdezrbx8tpwGwvEWH2gCho4eoe3uKzV4PAzBUjtViSbYLkilMRFy69B5g==",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "dependencies": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
-      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
-      "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/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/hed-validator": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/hed-validator/-/hed-validator-3.6.0.tgz",
-      "integrity": "sha512-8gbHl/CSfi0qybPRjHKjiLvS1o3GG2p4RJrjsBtSQ3Yo8Or6ED+k5PwZGizoDBdhS1wbKGfH/C4mIYtol7iUVg==",
-      "dependencies": {
-        "date-and-time": "^0.14.2",
-        "date-fns": "^2.17.0",
-        "lodash": "^4.17.21",
-        "pluralize": "^8.0.0",
-        "semver": "^7.3.4",
-        "then-request": "^6.0.2",
-        "xml2js": "^0.4.23"
-      },
-      "engines": {
-        "node": ">=12.12.0"
-      }
-    },
-    "node_modules/htmlparser2": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
-      "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
-      "dependencies": {
-        "domelementtype": "1",
-        "domhandler": "2.3",
-        "domutils": "1.5",
-        "entities": "1.0",
-        "readable-stream": "1.1"
-      }
-    },
-    "node_modules/htmlparser2/node_modules/entities": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
-      "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7tsvyY="
-    },
-    "node_modules/http-basic": {
-      "version": "8.1.3",
-      "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
-      "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
-      "dependencies": {
-        "caseless": "^0.12.0",
-        "concat-stream": "^1.6.2",
-        "http-response-object": "^3.0.1",
-        "parse-cache-control": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/http-response-object": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
-      "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
-      "dependencies": {
-        "@types/node": "^10.0.3"
-      }
-    },
-    "node_modules/http-response-object/node_modules/@types/node": {
-      "version": "10.17.60",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
-      "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
-    },
-    "node_modules/ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "node_modules/invert-kv": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
-    },
-    "node_modules/isarray": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
-    },
-    "node_modules/jshint": {
-      "version": "2.13.4",
-      "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz",
-      "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==",
-      "dependencies": {
-        "cli": "~1.0.0",
-        "console-browserify": "1.1.x",
-        "exit": "0.1.x",
-        "htmlparser2": "3.8.x",
-        "lodash": "~4.17.21",
-        "minimatch": "~3.0.2",
-        "strip-json-comments": "1.0.x"
-      },
-      "bin": {
-        "jshint": "bin/jshint"
-      }
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
-    },
-    "node_modules/lcid": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
-      "optional": true,
-      "dependencies": {
-        "invert-kv": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "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/mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "dependencies": {
-        "mime-db": "1.52.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
-      "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
-    },
-    "node_modules/nifti-js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/nifti-js/-/nifti-js-1.0.1.tgz",
-      "integrity": "sha1-cDmi788bzyASUgrdhIXt2YtRSvo=",
-      "optionalDependencies": {
-        "yargs": "^3.29.0"
-      }
-    },
-    "node_modules/nifti-js/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nifti-js/node_modules/cliui": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
-      "optional": true,
-      "dependencies": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wrap-ansi": "^2.0.0"
-      }
-    },
-    "node_modules/nifti-js/node_modules/is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-      "optional": true,
-      "dependencies": {
-        "number-is-nan": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nifti-js/node_modules/string-width": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-      "optional": true,
-      "dependencies": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nifti-js/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "optional": true,
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nifti-js/node_modules/wrap-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-      "optional": true,
-      "dependencies": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/nifti-js/node_modules/y18n": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
-      "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
-      "optional": true
-    },
-    "node_modules/nifti-js/node_modules/yargs": {
-      "version": "3.32.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
-      "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
-      "optional": true,
-      "dependencies": {
-        "camelcase": "^2.0.1",
-        "cliui": "^3.0.3",
-        "decamelize": "^1.1.1",
-        "os-locale": "^1.4.0",
-        "string-width": "^1.0.1",
-        "window-size": "^0.1.4",
-        "y18n": "^3.2.0"
-      }
-    },
-    "node_modules/node-fetch": {
-      "version": "2.6.7",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
-      "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/optimist": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
-      "dependencies": {
-        "minimist": "~0.0.1",
-        "wordwrap": "~0.0.2"
-      }
-    },
-    "node_modules/os-locale": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
-      "optional": true,
-      "dependencies": {
-        "lcid": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
-    },
-    "node_modules/parse-cache-control": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
-      "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104="
-    },
-    "node_modules/path": {
-      "version": "0.12.7",
-      "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
-      "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
-      "dependencies": {
-        "process": "^0.11.1",
-        "util": "^0.10.3"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pip": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/pip/-/pip-0.0.1.tgz",
-      "integrity": "sha1-zwtVqB7Lv0f4UEXMtf6a+gWnJp4=",
-      "dependencies": {
-        "freckle": ">= 0.0.1",
-        "optimist": ">= 0.1.5"
-      },
-      "bin": {
-        "pip": "lib/cli.js"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/pluralize": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
-      "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "node_modules/promise": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
-      "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
-      "dependencies": {
-        "asap": "~2.0.6"
-      }
-    },
-    "node_modules/punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/qs": {
-      "version": "6.10.3",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
-      "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
-      "dependencies": {
-        "side-channel": "^1.0.4"
-      },
-      "engines": {
-        "node": ">=0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/readable-stream": {
-      "version": "1.1.14",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-      "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
-      }
-    },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "node_modules/sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
-    },
-    "node_modules/semver": {
-      "version": "7.3.7",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-      "dependencies": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/slice-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
-      "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/stream-browserify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
-      "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
-      "dependencies": {
-        "inherits": "~2.0.4",
-        "readable-stream": "^3.5.0"
-      }
-    },
-    "node_modules/stream-browserify/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/stream-browserify/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/stream-browserify/node_modules/string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-      "dependencies": {
-        "safe-buffer": "~5.2.0"
-      }
-    },
-    "node_modules/string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-    },
-    "node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/strip-json-comments": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
-      "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
-      "bin": {
-        "strip-json-comments": "cli.js"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/table": {
-      "version": "5.4.6",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
-      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
-      "dependencies": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/then-request": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
-      "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
-      "dependencies": {
-        "@types/concat-stream": "^1.6.0",
-        "@types/form-data": "0.0.33",
-        "@types/node": "^8.0.0",
-        "@types/qs": "^6.2.31",
-        "caseless": "~0.12.0",
-        "concat-stream": "^1.6.0",
-        "form-data": "^2.2.0",
-        "http-basic": "^8.1.1",
-        "http-response-object": "^3.0.1",
-        "promise": "^8.0.0",
-        "qs": "^6.4.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
-    },
-    "node_modules/tslib": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-    },
-    "node_modules/typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
-    },
-    "node_modules/uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "node_modules/util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
-      "dependencies": {
-        "inherits": "2.0.3"
-      }
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "node_modules/util/node_modules/inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-    },
-    "node_modules/uuid": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
-      "bin": {
-        "uuid": "dist/bin/uuid"
-      }
-    },
-    "node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
-    },
-    "node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
-    "node_modules/window-size": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
-      "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
-      "optional": true,
-      "bin": {
-        "window-size": "cli.js"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "node_modules/wordwrap": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-      "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-    },
-    "node_modules/wrap-ansi/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-    },
-    "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "node_modules/xml2js": {
-      "version": "0.4.23",
-      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
-      "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
-      "dependencies": {
-        "sax": ">=0.6.0",
-        "xmlbuilder": "~11.0.0"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/xmlbuilder": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
-    "node_modules/yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/yargs": {
-      "version": "16.2.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
-      "dependencies": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yargs-parser": {
-      "version": "20.2.9",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yargs/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-    },
-    "node_modules/yargs/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    }
-  },
-  "dependencies": {
-    "@aws-crypto/crc32": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz",
-      "integrity": "sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==",
-      "requires": {
-        "@aws-crypto/util": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "tslib": "^1.11.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "@aws-crypto/crc32c": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz",
-      "integrity": "sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==",
-      "requires": {
-        "@aws-crypto/util": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "tslib": "^1.11.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "@aws-crypto/ie11-detection": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz",
-      "integrity": "sha512-pkVXf/dq6PITJ0jzYZ69VhL8VFOFoPZLZqtU/12SGnzYuJOOGNfF41q9GxdI1yqC8R13Rq3jOLKDFpUJFT5eTA==",
-      "requires": {
-        "tslib": "^1.11.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "@aws-crypto/sha1-browser": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz",
-      "integrity": "sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==",
-      "requires": {
-        "@aws-crypto/ie11-detection": "^2.0.0",
-        "@aws-crypto/supports-web-crypto": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "@aws-sdk/util-locate-window": "^3.0.0",
-        "@aws-sdk/util-utf8-browser": "^3.0.0",
-        "tslib": "^1.11.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "@aws-crypto/sha256-browser": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
-      "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
-      "requires": {
-        "@aws-crypto/ie11-detection": "^2.0.0",
-        "@aws-crypto/sha256-js": "^2.0.0",
-        "@aws-crypto/supports-web-crypto": "^2.0.0",
-        "@aws-crypto/util": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "@aws-sdk/util-locate-window": "^3.0.0",
-        "@aws-sdk/util-utf8-browser": "^3.0.0",
-        "tslib": "^1.11.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "@aws-crypto/sha256-js": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
-      "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
-      "requires": {
-        "@aws-crypto/util": "^2.0.0",
-        "@aws-sdk/types": "^3.1.0",
-        "tslib": "^1.11.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "@aws-crypto/supports-web-crypto": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz",
-      "integrity": "sha512-Ge7WQ3E0OC7FHYprsZV3h0QIcpdyJLvIeg+uTuHqRYm8D6qCFJoiC+edSzSyFiHtZf+NOQDJ1q46qxjtzIY2nA==",
-      "requires": {
-        "tslib": "^1.11.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "@aws-crypto/util": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.1.tgz",
-      "integrity": "sha512-JJmFFwvbm08lULw4Nm5QOLg8+lAQeC8aCXK5xrtxntYzYXCGfHwUJ4Is3770Q7HmICsXthGQ+ZsDL7C2uH3yBQ==",
-      "requires": {
-        "@aws-sdk/types": "^3.1.0",
-        "@aws-sdk/util-utf8-browser": "^3.0.0",
-        "tslib": "^1.11.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "@aws-sdk/abort-controller": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.55.0.tgz",
-      "integrity": "sha512-rCcTxJDEFnmvo/PgbhCRv24/Uv03lEGfRslKZq7SjaMcOubflS/ZXYaMEgsjYHgAT0zlpSsyCIkJXmhFaM7H7w==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/chunked-blob-reader": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.55.0.tgz",
-      "integrity": "sha512-o/xjMCq81opAjSBjt7YdHJwIJcGVG5XIV9+C2KXcY5QwVimkOKPybWTv0mXPvSwSilSx+EhpLNhkcJuXdzhw4w==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/chunked-blob-reader-native": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.58.0.tgz",
-      "integrity": "sha512-+D3xnPD5985iphgAqgUerBDs371a2WzzoEVi7eHJUMMsP/gEnSTdSH0HNxsqhYv6CW4EdKtvDAQdAwA1VtCf2A==",
-      "requires": {
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/client-s3": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.74.0.tgz",
-      "integrity": "sha512-+KzVZ4fewPdMN41+1lI0WLGtjPat0G6tg5d0NM/cPUDonH+a/o1thzyibtjgq+fy68JvW9YGBc5ejevotQp/Ow==",
-      "requires": {
-        "@aws-crypto/sha1-browser": "2.0.0",
-        "@aws-crypto/sha256-browser": "2.0.0",
-        "@aws-crypto/sha256-js": "2.0.0",
-        "@aws-sdk/client-sts": "3.74.0",
-        "@aws-sdk/config-resolver": "3.58.0",
-        "@aws-sdk/credential-provider-node": "3.74.0",
-        "@aws-sdk/eventstream-serde-browser": "3.72.0",
-        "@aws-sdk/eventstream-serde-config-resolver": "3.55.0",
-        "@aws-sdk/eventstream-serde-node": "3.72.0",
-        "@aws-sdk/fetch-http-handler": "3.58.0",
-        "@aws-sdk/hash-blob-browser": "3.58.0",
-        "@aws-sdk/hash-node": "3.55.0",
-        "@aws-sdk/hash-stream-node": "3.58.0",
-        "@aws-sdk/invalid-dependency": "3.55.0",
-        "@aws-sdk/md5-js": "3.58.0",
-        "@aws-sdk/middleware-bucket-endpoint": "3.58.0",
-        "@aws-sdk/middleware-content-length": "3.58.0",
-        "@aws-sdk/middleware-expect-continue": "3.58.0",
-        "@aws-sdk/middleware-flexible-checksums": "3.72.0",
-        "@aws-sdk/middleware-host-header": "3.58.0",
-        "@aws-sdk/middleware-location-constraint": "3.55.0",
-        "@aws-sdk/middleware-logger": "3.55.0",
-        "@aws-sdk/middleware-retry": "3.58.0",
-        "@aws-sdk/middleware-sdk-s3": "3.66.0",
-        "@aws-sdk/middleware-serde": "3.55.0",
-        "@aws-sdk/middleware-signing": "3.58.0",
-        "@aws-sdk/middleware-ssec": "3.55.0",
-        "@aws-sdk/middleware-stack": "3.55.0",
-        "@aws-sdk/middleware-user-agent": "3.58.0",
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/node-http-handler": "3.74.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/signature-v4-multi-region": "3.66.0",
-        "@aws-sdk/smithy-client": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/url-parser": "3.55.0",
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "@aws-sdk/util-base64-node": "3.55.0",
-        "@aws-sdk/util-body-length-browser": "3.55.0",
-        "@aws-sdk/util-body-length-node": "3.55.0",
-        "@aws-sdk/util-defaults-mode-browser": "3.72.0",
-        "@aws-sdk/util-defaults-mode-node": "3.72.0",
-        "@aws-sdk/util-stream-browser": "3.55.0",
-        "@aws-sdk/util-stream-node": "3.55.0",
-        "@aws-sdk/util-user-agent-browser": "3.58.0",
-        "@aws-sdk/util-user-agent-node": "3.58.0",
-        "@aws-sdk/util-utf8-browser": "3.55.0",
-        "@aws-sdk/util-utf8-node": "3.55.0",
-        "@aws-sdk/util-waiter": "3.55.0",
-        "@aws-sdk/xml-builder": "3.55.0",
-        "entities": "2.2.0",
-        "fast-xml-parser": "3.19.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/client-sso": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.74.0.tgz",
-      "integrity": "sha512-tDDxCeiYy6M5LuJluJB9YgWVUuQ4Rzx95bevd6QiSfVaUkQH/PdJt3pULdrCGzwxztCf8PrrypB6WqOIZ9jxHQ==",
-      "requires": {
-        "@aws-crypto/sha256-browser": "2.0.0",
-        "@aws-crypto/sha256-js": "2.0.0",
-        "@aws-sdk/config-resolver": "3.58.0",
-        "@aws-sdk/fetch-http-handler": "3.58.0",
-        "@aws-sdk/hash-node": "3.55.0",
-        "@aws-sdk/invalid-dependency": "3.55.0",
-        "@aws-sdk/middleware-content-length": "3.58.0",
-        "@aws-sdk/middleware-host-header": "3.58.0",
-        "@aws-sdk/middleware-logger": "3.55.0",
-        "@aws-sdk/middleware-retry": "3.58.0",
-        "@aws-sdk/middleware-serde": "3.55.0",
-        "@aws-sdk/middleware-stack": "3.55.0",
-        "@aws-sdk/middleware-user-agent": "3.58.0",
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/node-http-handler": "3.74.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/smithy-client": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/url-parser": "3.55.0",
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "@aws-sdk/util-base64-node": "3.55.0",
-        "@aws-sdk/util-body-length-browser": "3.55.0",
-        "@aws-sdk/util-body-length-node": "3.55.0",
-        "@aws-sdk/util-defaults-mode-browser": "3.72.0",
-        "@aws-sdk/util-defaults-mode-node": "3.72.0",
-        "@aws-sdk/util-user-agent-browser": "3.58.0",
-        "@aws-sdk/util-user-agent-node": "3.58.0",
-        "@aws-sdk/util-utf8-browser": "3.55.0",
-        "@aws-sdk/util-utf8-node": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/client-sts": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.74.0.tgz",
-      "integrity": "sha512-DLK5TLxU2Q2b2dw/mhfkeyUPTDmGVAp93lxzKmeDPAfFyMvvW+ODQaiSAYsOPRyr+ebJYmfgDIEgFB7ucprWOg==",
-      "requires": {
-        "@aws-crypto/sha256-browser": "2.0.0",
-        "@aws-crypto/sha256-js": "2.0.0",
-        "@aws-sdk/config-resolver": "3.58.0",
-        "@aws-sdk/credential-provider-node": "3.74.0",
-        "@aws-sdk/fetch-http-handler": "3.58.0",
-        "@aws-sdk/hash-node": "3.55.0",
-        "@aws-sdk/invalid-dependency": "3.55.0",
-        "@aws-sdk/middleware-content-length": "3.58.0",
-        "@aws-sdk/middleware-host-header": "3.58.0",
-        "@aws-sdk/middleware-logger": "3.55.0",
-        "@aws-sdk/middleware-retry": "3.58.0",
-        "@aws-sdk/middleware-sdk-sts": "3.58.0",
-        "@aws-sdk/middleware-serde": "3.55.0",
-        "@aws-sdk/middleware-signing": "3.58.0",
-        "@aws-sdk/middleware-stack": "3.55.0",
-        "@aws-sdk/middleware-user-agent": "3.58.0",
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/node-http-handler": "3.74.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/smithy-client": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/url-parser": "3.55.0",
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "@aws-sdk/util-base64-node": "3.55.0",
-        "@aws-sdk/util-body-length-browser": "3.55.0",
-        "@aws-sdk/util-body-length-node": "3.55.0",
-        "@aws-sdk/util-defaults-mode-browser": "3.72.0",
-        "@aws-sdk/util-defaults-mode-node": "3.72.0",
-        "@aws-sdk/util-user-agent-browser": "3.58.0",
-        "@aws-sdk/util-user-agent-node": "3.58.0",
-        "@aws-sdk/util-utf8-browser": "3.55.0",
-        "@aws-sdk/util-utf8-node": "3.55.0",
-        "entities": "2.2.0",
-        "fast-xml-parser": "3.19.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/config-resolver": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.58.0.tgz",
-      "integrity": "sha512-NXEwYw0JrXcvenu42QpNMQXK+6pgZ+6bDGfCgOfCC0FmyI+w/CuF36lApwm7InHvHazOaDlwArXm2pfntErKoA==",
-      "requires": {
-        "@aws-sdk/signature-v4": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-config-provider": "3.55.0",
-        "@aws-sdk/util-middleware": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/credential-provider-env": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.55.0.tgz",
-      "integrity": "sha512-4AIIXEdvinLlWNFtrUbUgoB7dkuV04RTcTruVWI4Ub4WSsuSCa72ZU1vqyvcEAOgGGLBmcSaGTWByjiD2sGcGA==",
-      "requires": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/credential-provider-imds": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.58.0.tgz",
-      "integrity": "sha512-CdtnTQ9zqLx1FbXdbgjijLbMcIWOyQM03TFaLSCjI3FNbUwyt3T7StBU9tj/LtbypHhSdXyQBpzUtXTOMWCEhg==",
-      "requires": {
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/url-parser": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/credential-provider-ini": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.74.0.tgz",
-      "integrity": "sha512-knnHAEjGfVO/09O7cLrtHwJeg/5p+6Y0xqGGGcmi5fyF8zEXmXuf6UJQIxBXE1r22ADpQ5/E8WfCJ3IzVLH1UQ==",
-      "requires": {
-        "@aws-sdk/credential-provider-env": "3.55.0",
-        "@aws-sdk/credential-provider-imds": "3.58.0",
-        "@aws-sdk/credential-provider-sso": "3.74.0",
-        "@aws-sdk/credential-provider-web-identity": "3.55.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/credential-provider-node": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.74.0.tgz",
-      "integrity": "sha512-GGd1kMN8fgtOTSq1CAk2So5AeW+Wi83iEZVL4gHmUiiwdZejtAcjtgA7uLx0YwULNMcvc4qrGewNlXkO2F7U7w==",
-      "requires": {
-        "@aws-sdk/credential-provider-env": "3.55.0",
-        "@aws-sdk/credential-provider-imds": "3.58.0",
-        "@aws-sdk/credential-provider-ini": "3.74.0",
-        "@aws-sdk/credential-provider-process": "3.58.0",
-        "@aws-sdk/credential-provider-sso": "3.74.0",
-        "@aws-sdk/credential-provider-web-identity": "3.55.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/credential-provider-process": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.58.0.tgz",
-      "integrity": "sha512-npgFqPUjMhUamf1FvJjBYUdpbWx8XWkKCwJsX73I7IYQAvAi2atCOkdtKq+4rds0VWAYu6vzlaI1tXgFxjOPNQ==",
-      "requires": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/credential-provider-sso": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.74.0.tgz",
-      "integrity": "sha512-EpwLqm9rqJ/l5/R2kq48LscSW8xSThraRT4res0w9kOMiOMIiphWX/glNE37FCFrQBwBDIGZ8T5RhftRgXRBag==",
-      "requires": {
-        "@aws-sdk/client-sso": "3.74.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/credential-provider-web-identity": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.55.0.tgz",
-      "integrity": "sha512-aKnXfZNGohTuF9rCGYLg4JEIOvWIZ/sb66XMq7bOUrx13KRPDwL/eUQL8quS5jGRLpjXVNvrS17AFf65GbdUBg==",
-      "requires": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/eventstream-marshaller": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.58.0.tgz",
-      "integrity": "sha512-vTdVFLIHGZTx/Anp9GpkTXVuvwSCNOecTutU5Py4i6fATgefWiSutc5Xc/FLujBSc0EhAXDGZIcTMpZC7jUpeg==",
-      "requires": {
-        "@aws-crypto/crc32": "2.0.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-hex-encoding": "3.58.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/eventstream-serde-browser": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.72.0.tgz",
-      "integrity": "sha512-UhMZ4P60mZu7G+craAdkRgR4/n3lWAgrNp1upgN2W8RLEQwhqY3qHiUdn/kp6qvontwHnxZkXNB+5Zm5pcP8bQ==",
-      "requires": {
-        "@aws-sdk/eventstream-marshaller": "3.58.0",
-        "@aws-sdk/eventstream-serde-universal": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/eventstream-serde-config-resolver": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.55.0.tgz",
-      "integrity": "sha512-NTJHLq1sbXyXAaJucKvcdN3Svr/fM2TjHEC3l8P/torFjIsX1+Ykpi8tZt8KsX8RjoUTTfKylh41AjJq0K9X4Q==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/eventstream-serde-node": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.72.0.tgz",
-      "integrity": "sha512-woemBkQ3O7mTiT3kdJH72s3lQLhr2B7hxRhYeaa1xQf1UjLJkKXL5PEOOrcylmxLdF6rYLsFs8Y/Hr4FZfqAqA==",
-      "requires": {
-        "@aws-sdk/eventstream-marshaller": "3.58.0",
-        "@aws-sdk/eventstream-serde-universal": "3.72.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/eventstream-serde-universal": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.72.0.tgz",
-      "integrity": "sha512-iIaDC/2xgK+2kLiOPJv8wMDCCtI2JB8bkeac6cQOfn4hZGQdP6fvRGFWD2R8//VR52H68N2vrhCXHvtjnF4iFg==",
-      "requires": {
-        "@aws-sdk/eventstream-marshaller": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/fetch-http-handler": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.58.0.tgz",
-      "integrity": "sha512-timF3FjPV5Bd+Kgph83LIKVlPCFObVYzious1a6doeLAT6YFwZpRrWbfP/HzS+DCoYiwUsH69oVJ91BoV66oyA==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/querystring-builder": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-base64-browser": "3.58.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/hash-blob-browser": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.58.0.tgz",
-      "integrity": "sha512-fdp12BqypRxwvevbJSl/sUhXJRi4Ghv6JKEXAHI1klkR6xY1GRORO5SHWltVY/xl373ERMol5o/n+ra/7jcx/g==",
-      "requires": {
-        "@aws-sdk/chunked-blob-reader": "3.55.0",
-        "@aws-sdk/chunked-blob-reader-native": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/hash-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.55.0.tgz",
-      "integrity": "sha512-2UdYwY/++AlzWEAFaK9wOed2QSxbzV527vmqKjReLHpPKPrSIlooUxlTH3LU6Y6WVDAzDRtLK43KUVXTLgGK1A==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-buffer-from": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/hash-stream-node": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.58.0.tgz",
-      "integrity": "sha512-y7HEeC3OiuXCRqsHnKDn5yef8UAbnegD9r+OM9bdD+3e6FLAL8Rq7hQTOpwIAiPXuD7HKx8h98s9JLvkwTOBkg==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/invalid-dependency": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.55.0.tgz",
-      "integrity": "sha512-delH0lV+78fdD/8MXIt9kTLS6IwHvdhqq9dw/ow5VjTUw+xBwUlfPfZplaai+3hKTKWh6a2WZCeDasNItBv9aA==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/is-array-buffer": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.55.0.tgz",
-      "integrity": "sha512-NbiPHVYuPxdqdFd6FxzzN3H1BQn/iWA3ri3Ry7AyLeP/tGs1yzEWMwf8BN8TSMALI0GXT6Sh0GDWy3Ok5xB6DA==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/md5-js": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.58.0.tgz",
-      "integrity": "sha512-V5f4Re+CLn3aDF1nrmDqdUtcqBHCyxxD2s2Ot+hZ2JFit+OtJggo1cI03ldTrQpG79rwHG+bHqL2VvNQP7Aj9A==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-utf8-browser": "3.55.0",
-        "@aws-sdk/util-utf8-node": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-bucket-endpoint": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.58.0.tgz",
-      "integrity": "sha512-zocLfFzj+NQjXLGZKPJBAYWWldAKBJkGzGVpTfrYx9bxxHTA70Gu+3sx+Xe+iOu8dtQT0OAnIX0wGudOPnTGNg==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-arn-parser": "3.55.0",
-        "@aws-sdk/util-config-provider": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-content-length": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.58.0.tgz",
-      "integrity": "sha512-h/BypPkhjv2CpCUbXA8Fa2s7V2GPiz9l11XhYK+sKSuQvQ7Lbq6VhaKaLqfeD3gLVZHgJZSLGl2btdHV1qHNNA==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-expect-continue": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.58.0.tgz",
-      "integrity": "sha512-nx6X6qLPwvbJrGoPxXSu4tsOek2eRnnjk78hhRUDfxFewpHJQLSPlyNKkXAo+C3syVALe6RJRmUYu5bShY6FfA==",
-      "requires": {
-        "@aws-sdk/middleware-header-default": "3.58.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-flexible-checksums": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.72.0.tgz",
-      "integrity": "sha512-lrwTmpygp6bxGRi6kbMq+EtTW5nsts+B7Wj7MA8PBIQsKU06T2tYxjDBYOyHB1MiVhltlq+vebBvacT64KsbFA==",
-      "requires": {
-        "@aws-crypto/crc32": "2.0.0",
-        "@aws-crypto/crc32c": "2.0.0",
-        "@aws-sdk/is-array-buffer": "3.55.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-header-default": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.58.0.tgz",
-      "integrity": "sha512-7F+CdLLauMmNbwFGYrE2pKsgTKY8G2PgazHmaE9s3FySEFcGPWmiEAG8sVImfZooj8gxGFQMLr97nanWjhSq2Q==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-host-header": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.58.0.tgz",
-      "integrity": "sha512-q/UKGcanm9e6DBRNN6UKhVqLvpRRdZWbmmPCeDNr4HqhCmgT6i1OvWdhAMOnT++hvCX8DpTsIXzNSlY6zWAxBg==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-location-constraint": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.55.0.tgz",
-      "integrity": "sha512-OvCKwBFbl8Gbfk0HGX00pkdORJN8BPuH/O5l3+mOBWuwILPuckRP5WGnL+1HT/gu4hHS6h1lpxUrPxUOoeKIAg==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-logger": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.55.0.tgz",
-      "integrity": "sha512-PtRbVrxEzDmeV9prBIP4/9or7R5Dj66mjbFSvNRGZ0n+UBfBFfVRfNrhQPNzQpfV9A3KVl9YyWCVXDSW+/rk9Q==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-retry": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.58.0.tgz",
-      "integrity": "sha512-sfSq+t0Yy47DQwrWGpA8iOx9sd26l4l1JDVTwHNi7+OKD4ClRPVCEdw3bTbbyYz/PV4f9AEfAZ6jwtSff4wkGw==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/service-error-classification": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-middleware": "3.55.0",
-        "tslib": "^2.3.1",
-        "uuid": "^8.3.2"
-      }
-    },
-    "@aws-sdk/middleware-sdk-s3": {
-      "version": "3.66.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.66.0.tgz",
-      "integrity": "sha512-4ACAdKAZkIjEK99UwoaKTrTGhS7qGqyLmjiGHlzR0ggMUUVmlep7EtcluImFtT6pi+ANVLDzuZGa+95MwGY/Qg==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-arn-parser": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-sdk-sts": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.58.0.tgz",
-      "integrity": "sha512-HUz7MhcsSDDTGygOwL61l4voc0pZco06J3z06JjTX19D5XxcQ7hSCtkHHHz0oMb9M1himVSiEon2tjhjsnB99g==",
-      "requires": {
-        "@aws-sdk/middleware-signing": "3.58.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/signature-v4": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-serde": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.55.0.tgz",
-      "integrity": "sha512-NkEbTDrSZcC2NhuvfjXHKJEl0xgI2B5tMAwi/rMOq/TEnARwVUL9qAy+5lgeiPCqebiNllWatARrFgAaYf0VeA==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-signing": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.58.0.tgz",
-      "integrity": "sha512-4FXubHB66GbhyZUlo6YPQoWpYfED15GNbEmHbJLSONzrVzZR3IkViSPLasDngVm1a050JqKuqNkFYGJBP4No/Q==",
-      "requires": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/signature-v4": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-ssec": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.55.0.tgz",
-      "integrity": "sha512-HTdA23hksOphQe0TmYORsa/kMNnKRGbdh0VJcsDGHQScJXzJ+C//THwfcoklff0XZfC+vGh93PECBWqixMELZw==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-stack": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.55.0.tgz",
-      "integrity": "sha512-ouD+wFz8W2R0ZQ8HrbhgN8tg1jyINEg9lPEEXY79w1Q5sf94LJ90XKAMVk02rw3dJalUWjLHf0OQe1/qxZfHyA==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/middleware-user-agent": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.58.0.tgz",
-      "integrity": "sha512-1c69bIWM63JwXijXvb9IWwcwQ/gViKMZ1lhxv52NvdG5VSxWXXsFJ2jETEXZoAypwT97Hmf3xo9SYuaHcKoq+g==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/node-config-provider": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.58.0.tgz",
-      "integrity": "sha512-AMcPqPhKxo/3/yOMS9PsKlI0GWp2/8eD6gSlhzdBpznPCKplyqXOSnSX7wS814Cyh373hFSjCaOrCOA9/EYtDg==",
-      "requires": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/shared-ini-file-loader": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/node-http-handler": {
-      "version": "3.74.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.74.0.tgz",
-      "integrity": "sha512-tykxW9jlj/+e+sHS3NkUSHYKHzkD5cO7mggQv1BnoD6lOB+hjqJTsqyvJ29z4GYeFefSwZR4bObLkTxMETwLBg==",
-      "requires": {
-        "@aws-sdk/abort-controller": "3.55.0",
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/querystring-builder": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/property-provider": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.55.0.tgz",
-      "integrity": "sha512-o7cKFJSHq5WOhwPsspYrzNto35oKKZvESZuWDtLxaZKSI6l7zpA366BI4kDG6Tc9i2+teV553MbxyZ9eya5A8g==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/protocol-http": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.58.0.tgz",
-      "integrity": "sha512-0yFFRPbR+CCa9eOQBBQ2qtrIDLYqSMN0y7G4iqVM8wQdIw7n3QK1PsTI3RNPGJ3Oi2krFTw5uUKqQQZPZEBuVQ==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/querystring-builder": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.55.0.tgz",
-      "integrity": "sha512-/ZAXNipt9nRR8k+eowwukE/YjXnQ49p5w/MkaQxsBk3IuIf7MAcgVg8glHr0igH84GfUQ7ZVP8v+G2S3tKUG+Q==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-uri-escape": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/querystring-parser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.55.0.tgz",
-      "integrity": "sha512-e+2FLgo+eDx7oh7ap5HngN9XSVMxredAVztLHxCcSN0lFHHHzMa8b2SpXbaowUxQHh7ziymSqvOrPYFQ71Filg==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/service-error-classification": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.55.0.tgz",
-      "integrity": "sha512-HdjnDyarsa1Avq1MJurkLyEe9c3eRa76dPmK4TmRGgwJ+tInEzGHL0rBW7V8xBK+PDF+fJQ71hvm8jPYmzvBwQ=="
-    },
-    "@aws-sdk/shared-ini-file-loader": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.58.0.tgz",
-      "integrity": "sha512-ARDKQerIzgNs/MFNdCEuK2lgRJ1lneAaJw0p9O1LkJUvcSibvkSATwny7vwJMueOf+ae1Pf+8+54OMNIt0nTkQ==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/signature-v4": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.58.0.tgz",
-      "integrity": "sha512-flEo8p3XkzWoBDqnIUQre4jLuT5aLnmfQNI8c2uSjyJ3OBxpJ0iS1cDu3E++d1/pN6Q8o0KOmr2ypHeiyBOujw==",
-      "requires": {
-        "@aws-sdk/is-array-buffer": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-hex-encoding": "3.58.0",
-        "@aws-sdk/util-middleware": "3.55.0",
-        "@aws-sdk/util-uri-escape": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/signature-v4-multi-region": {
-      "version": "3.66.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.66.0.tgz",
-      "integrity": "sha512-Akvc8G9Del2+umg0R/5Gc/PWgQwbxxTXdnm6YTHtDzvyPPiYWBs6au6WqJQqcqk07gcQV67MLVqFFhnFuLlcVg==",
-      "requires": {
-        "@aws-sdk/protocol-http": "3.58.0",
-        "@aws-sdk/signature-v4": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "@aws-sdk/util-arn-parser": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/smithy-client": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.72.0.tgz",
-      "integrity": "sha512-eQ2pEzxtS1Vz1XyNKzG4Z+mtfwRzcAs4FUQP0wrrYVJMsIdI0X4vvro8gYGoBbQtOz65uY3XqQdLuXX/SabTQg==",
-      "requires": {
-        "@aws-sdk/middleware-stack": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/types": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.55.0.tgz",
-      "integrity": "sha512-wrDZjuy1CVAYxDCbm3bWQIKMGfNs7XXmG0eG4858Ixgqmq2avsIn5TORy8ynBxcXn9aekV/+tGEQ7BBSYzIVNQ=="
-    },
-    "@aws-sdk/url-parser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.55.0.tgz",
-      "integrity": "sha512-qrTwN5xIgTLreqLnZ+x3cAudjNKfxi6srW1H/px2mk4lb2U9B4fpGjZ6VU+XV8U2kR+YlT8J6Jo5iwuVGfC91A==",
-      "requires": {
-        "@aws-sdk/querystring-parser": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-arn-parser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.55.0.tgz",
-      "integrity": "sha512-76KJxp4MRWufHYWys7DFl64znr5yeJ3AIQNAPCKKw1sP0hzO7p6Kx0PaJnw9x+CPSzOrT4NbuApL6/srYhKDGg==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-base64-browser": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz",
-      "integrity": "sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-base64-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.55.0.tgz",
-      "integrity": "sha512-UQ/ZuNoAc8CFMpSiRYmevaTsuRKzLwulZTnM8LNlIt9Wx1tpNvqp80cfvVj7yySKROtEi20wq29h31dZf1eYNQ==",
-      "requires": {
-        "@aws-sdk/util-buffer-from": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-body-length-browser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.55.0.tgz",
-      "integrity": "sha512-Ei2OCzXQw5N6ZkTMZbamUzc1z+z1R1Ja5tMEagz5BxuX4vWdBObT+uGlSzL8yvTbjoPjnxWA2aXyEqaUP3JS8Q==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-body-length-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.55.0.tgz",
-      "integrity": "sha512-lU1d4I+9wJwydduXs0SxSfd+mHKjxeyd39VwOv6i2KSwWkPbji9UQqpflKLKw+r45jL7+xU/zfeTUg5Tt/3Gew==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-buffer-from": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.55.0.tgz",
-      "integrity": "sha512-uVzKG1UgvnV7XX2FPTylBujYMKBPBaq/qFBxfl0LVNfrty7YjpfieQxAe6yRLD+T0Kir/WDQwGvYC+tOYG3IGA==",
-      "requires": {
-        "@aws-sdk/is-array-buffer": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-config-provider": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.55.0.tgz",
-      "integrity": "sha512-30dzofQQfx6tp1jVZkZ0DGRsT0wwC15nEysKRiAcjncM64A0Cm6sra77d0os3vbKiKoPCI/lMsFr4o3533+qvQ==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-defaults-mode-browser": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.72.0.tgz",
-      "integrity": "sha512-xeoh4jdq+tpZWDwGeXeoAQI+rZaCBEicjumBcqfzkRFE3DyaeyPHn3hiKGSR13R+P6Uf86aqaRNmWAeZZjeE0w==",
-      "requires": {
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "bowser": "^2.11.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-defaults-mode-node": {
-      "version": "3.72.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.72.0.tgz",
-      "integrity": "sha512-Qf4BZmjWTaWaWbIhra/il8zUAdYY6G4JIcg9WMzQgnh1L/iXpCZddInfB2zT4j5rSAuBf5Ov2T6zvtw3/KOh6Q==",
-      "requires": {
-        "@aws-sdk/config-resolver": "3.58.0",
-        "@aws-sdk/credential-provider-imds": "3.58.0",
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/property-provider": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-hex-encoding": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz",
-      "integrity": "sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-locate-window": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.55.0.tgz",
-      "integrity": "sha512-0sPmK2JaJE2BbTcnvybzob/VrFKCXKfN4CUKcvn0yGg/me7Bz+vtzQRB3Xp+YSx+7OtWxzv63wsvHoAnXvgxgg==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-middleware": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.55.0.tgz",
-      "integrity": "sha512-82fW2XV+rUalv8lkd4VlhpPp6xnXO5n9sckMp1N+TrQ+p8eqxqT0+o8n1/6s9Qsnkw64Y3m6+EfCdc8/uFOY2g==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-stream-browser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.55.0.tgz",
-      "integrity": "sha512-3f/zQsAqexJpKssCL0adTjG8WO+NPQ63E3TingyKpnCnHQPEnqPdya5I5OLGzZ0WR0iUWRtpuW0MtuDabyLDWw==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-stream-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.55.0.tgz",
-      "integrity": "sha512-brCK3iENvXEL7BK5eDAdkZ2VuBSvXj7DH9EQezxl4Ntrj1lvb+McOk9WoU/o7yzE7A/bzEJEoNQAPi+VPNbb/w==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-uri-escape": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz",
-      "integrity": "sha512-mmdDLUpFCN2nkfwlLdOM54lTD528GiGSPN1qb8XtGLgZsJUmg3uJSFIN2lPeSbEwJB3NFjVas/rnQC48i7mV8w==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-user-agent-browser": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.58.0.tgz",
-      "integrity": "sha512-aJpqCvT09giJRg5xFTBDBRAVF0k0yq3OEf6UTuiOVf5azlL2MGp6PJ/xkJp9Z06PuQQkwBJ/2nIQZemo02a5Sw==",
-      "requires": {
-        "@aws-sdk/types": "3.55.0",
-        "bowser": "^2.11.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-user-agent-node": {
-      "version": "3.58.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.58.0.tgz",
-      "integrity": "sha512-VlbY/nzWdN2pfLUHqKvnlGBQ6tEeV4jyK9ggAD2Szjj0bkYvaaKwpBKswQmuJpi5/J2v7Bo4ayBLnqDL7PgzLA==",
-      "requires": {
-        "@aws-sdk/node-config-provider": "3.58.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-utf8-browser": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.55.0.tgz",
-      "integrity": "sha512-ljzqJcyjfJpEVSIAxwtIS8xMRUly84BdjlBXyp6cu4G8TUufgjNS31LWdhyGhgmW5vYBNr+LTz0Kwf6J+ou7Ug==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-utf8-node": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.55.0.tgz",
-      "integrity": "sha512-FsFm7GFaC7j0tlPEm/ri8bU2QCwFW5WKjxUg8lm1oWaxplCpKGUsmcfPJ4sw58GIoyoGu4QXBK60oCWosZYYdQ==",
-      "requires": {
-        "@aws-sdk/util-buffer-from": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/util-waiter": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.55.0.tgz",
-      "integrity": "sha512-Do34MKPFSC/+zVN6vY+FZ+0WN61hzga4nPoAC590AOjs8rW6/H6sDN6Gz1KAZbPnuQUZfvsIJjMxN7lblXHJkQ==",
-      "requires": {
-        "@aws-sdk/abort-controller": "3.55.0",
-        "@aws-sdk/types": "3.55.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "@aws-sdk/xml-builder": {
-      "version": "3.55.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.55.0.tgz",
-      "integrity": "sha512-BH+i5S2FLprmfSeIuGy3UbNtEoJPVjh8arl5+LV3i2KY/+TmrS4yT8JtztDlDxHF0cMtNLZNO0KEPtsACS6SOg==",
-      "requires": {
-        "tslib": "^2.3.1"
-      }
-    },
-    "@types/concat-stream": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
-      "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/form-data": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
-      "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=",
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/node": {
-      "version": "8.10.66",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
-      "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="
-    },
-    "@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=="
-    },
-    "@xmldom/xmldom": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz",
-      "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==",
-      "optional": true
-    },
-    "ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "requires": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "ansi-regex": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="
-    },
-    "ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "requires": {
-        "color-convert": "^1.9.0"
-      }
-    },
-    "asap": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
-    },
-    "astral-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-    },
-    "bids-validator": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/bids-validator/-/bids-validator-1.9.3.tgz",
-      "integrity": "sha512-16fMo7WfD/8OL/qh9VkKfQ927clt/io+MAnG3W8tQ9SlB/By2VhumnuQwYHkWpjpfYbastoHwDMSvOqTNf34Yw==",
-      "requires": {
-        "@aws-sdk/client-s3": "^3.9.0",
-        "ajv": "^6.5.2",
-        "bytes": "^3.0.0",
-        "colors": "^1.4.0",
-        "cross-fetch": "^3.0.6",
-        "date-fns": "^2.7.0",
-        "events": "^3.3.0",
-        "exifreader": "^4.1.0",
-        "hed-validator": "^3.5.0",
-        "ignore": "^4.0.2",
-        "is-utf8": "^0.2.1",
-        "jshint": "^2.9.6",
-        "lodash": "^4.17.21",
-        "minimatch": "3.0.4",
-        "nifti-js": "^1.0.1",
-        "p-limit": "^2.1.0",
-        "pako": "^1.0.6",
-        "path": "^0.12.7",
-        "pluralize": "^8.0.0",
-        "semver": "^7.3.2",
-        "stream-browserify": "^3.0.0",
-        "table": "^5.2.3",
-        "xml2js": "^0.4.23",
-        "yaml": "^1.10.2",
-        "yargs": "^16.2.0"
-      }
-    },
-    "bowser": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
-      "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
-    },
-    "bytes": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
-    },
-    "call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      }
-    },
-    "camelcase": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-      "optional": true
-    },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
-    },
-    "cli": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
-      "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
-      "requires": {
-        "exit": "0.1.2",
-        "glob": "^7.1.1"
-      }
-    },
-    "cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-      "requires": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
-        },
-        "string-width": {
-          "version": "4.2.3",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.1"
-          }
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        }
-      }
-    },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-      "optional": true
-    },
-    "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-    },
-    "colors": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
-      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
-    },
-    "combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "requires": {
-        "date-now": "^0.1.4"
-      }
-    },
-    "core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
-    },
-    "cross-fetch": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
-      "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
-      "requires": {
-        "node-fetch": "2.6.7"
-      }
-    },
-    "date-and-time": {
-      "version": "0.14.2",
-      "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz",
-      "integrity": "sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA=="
-    },
-    "date-fns": {
-      "version": "2.28.0",
-      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
-      "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw=="
-    },
-    "date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "optional": true
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
-    },
-    "dom-serializer": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
-      "requires": {
-        "domelementtype": "^2.0.1",
-        "entities": "^2.0.0"
-      },
-      "dependencies": {
-        "domelementtype": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-          "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
-        }
-      }
-    },
-    "domelementtype": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
-    },
-    "domhandler": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
-      "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
-      "requires": {
-        "domelementtype": "1"
-      }
-    },
-    "domutils": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
-      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
-      "requires": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
-    },
-    "entities": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
-    },
-    "escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
-    },
-    "events": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
-    },
-    "exifreader": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/exifreader/-/exifreader-4.5.0.tgz",
-      "integrity": "sha512-CUkDKjA+hNV6+bx5skPPdjeyPV28LZtqrd/7Sli1j2Y/QTZC7PQc+h2j5TeIo5zYbYhwzEN6chgeTdWLY33cUg==",
-      "requires": {
-        "@xmldom/xmldom": "^0.7.5"
-      }
-    },
-    "exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
-    },
-    "fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
-    },
-    "fast-xml-parser": {
-      "version": "3.19.0",
-      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz",
-      "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg=="
-    },
-    "form-data": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
-      "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "freckle": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/freckle/-/freckle-0.0.2.tgz",
-      "integrity": "sha512-+x+LoiQ4IDln6qgVyXEHAvu2uD/mRqdezrbx8tpwGwvEWH2gCho4eoe3uKzV4PAzBUjtViSbYLkilMRFy69B5g=="
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
-    },
-    "get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      }
-    },
-    "glob": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
-      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
-      "requires": {
-        "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"
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-symbols": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
-    },
-    "hed-validator": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/hed-validator/-/hed-validator-3.6.0.tgz",
-      "integrity": "sha512-8gbHl/CSfi0qybPRjHKjiLvS1o3GG2p4RJrjsBtSQ3Yo8Or6ED+k5PwZGizoDBdhS1wbKGfH/C4mIYtol7iUVg==",
-      "requires": {
-        "date-and-time": "^0.14.2",
-        "date-fns": "^2.17.0",
-        "lodash": "^4.17.21",
-        "pluralize": "^8.0.0",
-        "semver": "^7.3.4",
-        "then-request": "^6.0.2",
-        "xml2js": "^0.4.23"
-      }
-    },
-    "htmlparser2": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
-      "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
-      "requires": {
-        "domelementtype": "1",
-        "domhandler": "2.3",
-        "domutils": "1.5",
-        "entities": "1.0",
-        "readable-stream": "1.1"
-      },
-      "dependencies": {
-        "entities": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
-          "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7tsvyY="
-        }
-      }
-    },
-    "http-basic": {
-      "version": "8.1.3",
-      "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
-      "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
-      "requires": {
-        "caseless": "^0.12.0",
-        "concat-stream": "^1.6.2",
-        "http-response-object": "^3.0.1",
-        "parse-cache-control": "^1.0.1"
-      }
-    },
-    "http-response-object": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
-      "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
-      "requires": {
-        "@types/node": "^10.0.3"
-      },
-      "dependencies": {
-        "@types/node": {
-          "version": "10.17.60",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
-          "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
-        }
-      }
-    },
-    "ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "invert-kv": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
-      "optional": true
-    },
-    "is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
-    },
-    "isarray": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
-    },
-    "jshint": {
-      "version": "2.13.4",
-      "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.4.tgz",
-      "integrity": "sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==",
-      "requires": {
-        "cli": "~1.0.0",
-        "console-browserify": "1.1.x",
-        "exit": "0.1.x",
-        "htmlparser2": "3.8.x",
-        "lodash": "~4.17.21",
-        "minimatch": "~3.0.2",
-        "strip-json-comments": "1.0.x"
-      }
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
-    },
-    "lcid": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
-      "optional": true,
-      "requires": {
-        "invert-kv": "^1.0.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "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==",
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
-    },
-    "mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "requires": {
-        "mime-db": "1.52.0"
-      }
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
-      "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
-    },
-    "nifti-js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/nifti-js/-/nifti-js-1.0.1.tgz",
-      "integrity": "sha1-cDmi788bzyASUgrdhIXt2YtRSvo=",
-      "requires": {
-        "yargs": "^3.29.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-          "optional": true
-        },
-        "cliui": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wrap-ansi": "^2.0.0"
-          }
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "optional": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-          "optional": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "optional": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "wrap-ansi": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-          "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1"
-          }
-        },
-        "y18n": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
-          "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
-          "optional": true
-        },
-        "yargs": {
-          "version": "3.32.0",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
-          "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
-          "optional": true,
-          "requires": {
-            "camelcase": "^2.0.1",
-            "cliui": "^3.0.3",
-            "decamelize": "^1.1.1",
-            "os-locale": "^1.4.0",
-            "string-width": "^1.0.1",
-            "window-size": "^0.1.4",
-            "y18n": "^3.2.0"
-          }
-        }
-      }
-    },
-    "node-fetch": {
-      "version": "2.6.7",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-      "requires": {
-        "whatwg-url": "^5.0.0"
-      }
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "optional": true
-    },
-    "object-inspect": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
-      "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "optimist": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
-      "requires": {
-        "minimist": "~0.0.1",
-        "wordwrap": "~0.0.2"
-      }
-    },
-    "os-locale": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
-      "optional": true,
-      "requires": {
-        "lcid": "^1.0.0"
-      }
-    },
-    "p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "requires": {
-        "p-try": "^2.0.0"
-      }
-    },
-    "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
-    },
-    "pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
-    },
-    "parse-cache-control": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
-      "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104="
-    },
-    "path": {
-      "version": "0.12.7",
-      "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
-      "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
-      "requires": {
-        "process": "^0.11.1",
-        "util": "^0.10.3"
-      }
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-    },
-    "pip": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/pip/-/pip-0.0.1.tgz",
-      "integrity": "sha1-zwtVqB7Lv0f4UEXMtf6a+gWnJp4=",
-      "requires": {
-        "freckle": ">= 0.0.1",
-        "optimist": ">= 0.1.5"
-      }
-    },
-    "pluralize": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
-      "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "promise": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
-      "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
-      "requires": {
-        "asap": "~2.0.6"
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
-    },
-    "qs": {
-      "version": "6.10.3",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
-      "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
-      "requires": {
-        "side-channel": "^1.0.4"
-      }
-    },
-    "readable-stream": {
-      "version": "1.1.14",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-      "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
-    },
-    "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=="
-    },
-    "sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
-    },
-    "semver": {
-      "version": "7.3.7",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-      "requires": {
-        "lru-cache": "^6.0.0"
-      }
-    },
-    "side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-      "requires": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
-      }
-    },
-    "slice-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
-      "requires": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      }
-    },
-    "stream-browserify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
-      "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
-      "requires": {
-        "inherits": "~2.0.4",
-        "readable-stream": "^3.5.0"
-      },
-      "dependencies": {
-        "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==",
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        },
-        "string_decoder": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-          "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-          "requires": {
-            "safe-buffer": "~5.2.0"
-          }
-        }
-      }
-    },
-    "string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-    },
-    "string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "requires": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      }
-    },
-    "strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "requires": {
-        "ansi-regex": "^4.1.0"
-      }
-    },
-    "strip-json-comments": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
-      "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E="
-    },
-    "table": {
-      "version": "5.4.6",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
-      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
-      "requires": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      }
-    },
-    "then-request": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
-      "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
-      "requires": {
-        "@types/concat-stream": "^1.6.0",
-        "@types/form-data": "0.0.33",
-        "@types/node": "^8.0.0",
-        "@types/qs": "^6.2.31",
-        "caseless": "~0.12.0",
-        "concat-stream": "^1.6.0",
-        "form-data": "^2.2.0",
-        "http-basic": "^8.1.1",
-        "http-response-object": "^3.0.1",
-        "promise": "^8.0.0",
-        "qs": "^6.4.0"
-      }
-    },
-    "tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
-    },
-    "tslib": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
-    },
-    "uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
-      "requires": {
-        "inherits": "2.0.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-        }
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "uuid": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
-    },
-    "webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
-    },
-    "whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
-      "requires": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
-    "window-size": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
-      "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
-      "optional": true
-    },
-    "wordwrap": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-      "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
-    },
-    "wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
-        },
-        "string-width": {
-          "version": "4.2.3",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.1"
-          }
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        }
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "xml2js": {
-      "version": "0.4.23",
-      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
-      "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
-      "requires": {
-        "sax": ">=0.6.0",
-        "xmlbuilder": "~11.0.0"
-      }
-    },
-    "xmlbuilder": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
-    },
-    "y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
-    },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
-    "yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
-    },
-    "yargs": {
-      "version": "16.2.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
-      "requires": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
-        },
-        "string-width": {
-          "version": "4.2.3",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.1"
-          }
-        },
-        "strip-ansi": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-          "requires": {
-            "ansi-regex": "^5.0.1"
-          }
-        }
-      }
-    },
-    "yargs-parser": {
-      "version": "20.2.9",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
-    }
-  }
-}
diff --git a/package.json b/package.json
deleted file mode 100644
index f16c6d17d..000000000
--- a/package.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "dependencies": {
-    "pip": "^0.0.1"
-  }
-}
diff --git a/pyproject.toml b/pyproject.toml
index 83bada467..4378b5538 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,5 +1,116 @@
 [build-system]
-requires = ["setuptools >= 40.8.0", "wheel"]
+requires = ["hatchling", "hatch-vcs"]
+build-backend = "hatchling.build"
+
+[project]
+name = "cubids"
+description = "Curation of BIDS (CuBIDS): A sanity-preserving software package for processing BIDS datasets."
+authors = [{name = "Neuroinformatics Team of PennLINC"}]
+classifiers = [
+    "Development Status :: 4 - Beta",
+    "Intended Audience :: Developers",
+    "Intended Audience :: Science/Research",
+    "Natural Language :: English",
+    "Topic :: Scientific/Engineering :: Image Recognition",
+    "License :: OSI Approved :: MIT License",
+    "Programming Language :: Python :: 3.8",
+    "Programming Language :: Python :: 3.9",
+    "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
+]
+license = {file = "LICENSE"}
+requires-python = ">=3.8"
+dependencies = [
+    "pyyaml",
+    "pybids",
+    "pandas",
+    "tqdm",
+    "numpy",
+    "scikit-learn",
+    "datalad>=0.13.5,!=0.17.3,!=0.17.0,!=0.16.1",
+    "wrapt<2,>=1.10",
+    "Sphinx",
+    "jinja2 < 3.1",
+]
+dynamic = ["version"]
+
+[project.urls]
+Homepage = "https://github.com/PennLINC/cubids"
+Documentation = "https://www.cubids.readthedocs.io"
+Paper = "https://doi.org/10.1016/j.neuroimage.2022.119609"
+"Docker Images" = "https://hub.docker.com/r/pennlinc/cubids/tags/"
+
+[project.optional-dependencies]
+doc = [
+    "nbsphinx",
+    "packaging",
+    "sphinx >= 2.2",
+    "sphinx-argparse",
+    "sphinx_rtd_theme",
+    "sphinx_markdown_tables",
+    "recommonmark",
+]
+tests = [
+    "codespell",
+    "coverage",
+    "flake8",
+    "flake8-absolute-import",
+    "flake8-black",
+    "flake8-docstrings",
+    "flake8-isort",
+    "flake8-pyproject",
+    "flake8-unused-arguments",
+    "flake8-use-fstring",
+    "flake8-warnings",
+    "pep8-naming",
+    "pytest",
+    "pytest-cov",
+    "tomli",
+]
+maint = [
+    "fuzzywuzzy",
+    "python-Levenshtein",
+]
+
+# Aliases
+all = ["cubids[doc,maint,tests]"]
+
+[project.scripts]
+cubids-group = "cubids.cli:cubids_group"
+cubids-apply = "cubids.cli:cubids_apply"
+cubids-purge = "cubids.cli:cubids_purge"
+cubids-add-nifti-info = "cubids.cli:cubids_add_nifti_info"
+cubids-copy-exemplars = "cubids.cli:cubids_copy_exemplars"
+cubids-undo = "cubids.cli:cubids_undo"
+bids-sidecar-merge = "cubids.cli:bids_sidecar_merge"
+cubids-validate = "cubids.cli:cubids_validate"
+cubids-datalad-save = "cubids.cli:cubids_datalad_save"
+cubids-print-metadata-fields = "cubids.cli:cubids_print_metadata_fields"
+cubids-remove-metadata-fields = "cubids.cli:cubids_remove_metadata_fields"
+
+#
+# Hatch configurations
+#
+
+[tool.hatch.metadata]
+allow-direct-references = true
+
+[tool.hatch.build.targets.sdist]
+exclude = [".git_archival.txt"]  # No longer needed in sdist
+
+[tool.hatch.build.targets.wheel]
+packages = ["cubids"]
+exclude = [
+    "cubids/tests/data",  # Large test data directory
+]
+
+##  The following two sections configure setuptools_scm in the hatch way
+
+[tool.hatch.version]
+source = "vcs"
+
+[tool.hatch.build.hooks.vcs]
+version-file = "cubids/_version.py"
 
 #
 # Developer tool configurations
@@ -49,3 +160,22 @@ per-file-ignores = [
     "**/__init__.py : F401",
     "docs/conf.py : E265",
 ]
+
+[tool.coverage.run]
+branch = true
+omit = [
+    "*/tests/*",
+    "*/__init__.py",
+    "*/conftest.py",
+    "cubids/_version.py"
+]
+
+[tool.coverage.report]
+# Regexes for lines to exclude from consideration
+exclude_lines = [
+    'raise NotImplementedError',
+    'warnings\.warn',
+]
+
+[tool.codespell]
+skip = "CuBIDS_Toy_Dataset_Curation,notebooks,BIDS_Dataset,_version.py,*.pem,*.json,*.js,*.html,*.css,*.svg"
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index e69de29bb..000000000
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 31b4cb7fd..000000000
--- a/setup.cfg
+++ /dev/null
@@ -1,101 +0,0 @@
-[bumpversion]
-current_version = 1.0.3
-commit = True
-tag = True
-
-[bumpversion:file:setup.py]
-search = version='{current_version}'
-replace = version='{new_version}'
-
-[bumpversion:file:cubids/__init__.py]
-search = __version__ = '{current_version}'
-replace = __version__ = '{new_version}'
-
-[bdist_wheel]
-universal = 1
-
-[flake8]
-doctests = True
-exclude = *build/
-per-file-ignores =
-    # imported but unused
-    __init__.py: F401
-putty-ignore =
-	*/__init__.py : +F401
-	/^\s*\.\. _.*?: http/ : +E501
-
-[options]
-python_requires = >=3.8
-install_requires =
-	pyyaml
-	pybids
-	pandas
-	tqdm
-	numpy
-	scikit-learn
-	datalad>=0.13.5
-	wrapt<2,>=1.10
-	Sphinx
-	jinja2 < 3.1
-test_requires =
-	nibabel
-	pytest==4.6.5
-	pytest-runner==5.1
-	pip==19.2.3
-	bump2version==0.5.11
-	wheel==0.33.6
-	watchdog==0.9.0
-	flake8==3.7.8
-	flake8-absolute-import
-    flake8-black
-    flake8-docstrings
-    flake8-isort
-    flake8-pyproject
-    flake8-unused-arguments
-    flake8-use-fstring
-    pep8-naming
-	tox==3.14.0
-	coverage==4.5.4
-	Sphinx==2.2.0
-	twine==1.14.0
-include_package_data = True
-
-[options.exclude_package_data]
-* = tests
-
-[options.extras_require]
-datalad = datalad
-doc =
-	nbsphinx
-	packaging
-	sphinx >= 2.2
-	sphinx-argparse
-	sphinx-argparse
-    sphinx_rtd_theme
-    sphinx_markdown_tables
-    recommonmark
-docs =
-	%(doc)s
-tests =
-	coverage
-	codecov
-	pytest
-	pytest-env
-all =
-	%(datalad)s
-	%(doc)s
-	%(tests)s
-
-[options.package_data]
-cubids =
-    data/config.yml
-
-[tool:pytest]
-norecursedirs = .git
-addopts = -svx --doctest-modules
-doctest_optionflags = ALLOW_UNICODE NORMALIZE_WHITESPACE ELLIPSIS
-env =
-	PYTHONHASHSEED=0
-filterwarnings =
-	ignore::DeprecationWarning
-junit_family = xunit2
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 1498c5c61..000000000
--- a/setup.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-
-"""The setup script."""
-
-from setuptools import setup, find_packages
-
-# with open('README.rst') as readme_file:
-#     readme = readme_file.read()
-
-with open("README.rst", "r", encoding='utf-8') as readme_file:
-    readme = readme_file.read()
-
-with open('HISTORY.rst') as history_file:
-    history = history_file.read()
-
-setup_requirements = ['pytest-runner']
-
-setup(
-    author="Neuroinformatics Team of PennLINC",
-    author_email='sydney.covitz@pennmecidine.upenn.edu',
-    maintainer='Sydney Covitz',
-    python_requires='>=3.5',
-    classifiers=[
-        'Development Status :: 2 - Pre-Alpha',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: MIT License',
-        'Natural Language :: English',
-        'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.7',
-        'Programming Language :: Python :: 3.8',
-    ],
-    description="BIDS Curation Tool",
-    entry_points={
-        'console_scripts': [
-            'cubids-group=cubids.cli:cubids_group',
-            'cubids-apply=cubids.cli:cubids_apply',
-            'cubids-purge=cubids.cli:cubids_purge',
-            'cubids-add-nifti-info=cubids.cli:cubids_add_nifti_info',
-            'cubids-copy-exemplars=cubids.cli:cubids_copy_exemplars',
-            'cubids-undo=cubids.cli:cubids_undo',
-            'bids-sidecar-merge=cubids.cli:bids_sidecar_merge',
-            'cubids-validate=cubids.cli:cubids_validate',
-            'cubids-datalad-save=cubids.cli:cubids_datalad_save',
-            'cubids-print-metadata-fields=cubids.cli:'
-            'cubids_print_metadata_fields',
-            'cubids-remove-metadata-fields=cubids.cli:'
-            'cubids_remove_metadata_fields'
-        ],
-    },
-    license="MIT License",
-    long_description=readme + '\n\n' + history,
-    include_package_data=True,
-    keywords='cubids',
-    name='cubids',
-    packages=find_packages(include=['cubids', 'cubids.*']),
-    setup_requires=setup_requirements,
-    test_suite='tests',
-    url='https://github.com/pennlinc/cubids',
-    version='1.0.5',
-    zip_safe=False,
-)
diff --git a/tox.ini b/tox.ini
deleted file mode 100644
index 7a89eb01e..000000000
--- a/tox.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[tox]
-envlist = codespell
-
-[testenv:codespell]
-skip_install = true
-deps =
-    codespell~=2.0
-commands =
-    codespell -D- --skip "_version.py,*.pem,*.json" {posargs} cubds docs notebooks tests


Test patch:
diff --git a/cubids/testdata/BIDS_Dataset.zip b/cubids/tests/data/BIDS_Dataset.zip
similarity index 100%
rename from cubids/testdata/BIDS_Dataset.zip
rename to cubids/tests/data/BIDS_Dataset.zip
diff --git a/cubids/testdata/BIDS_Dataset/README b/cubids/tests/data/BIDS_Dataset/README
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/README
rename to cubids/tests/data/BIDS_Dataset/README
diff --git a/cubids/testdata/BIDS_Dataset/dataset_description.json b/cubids/tests/data/BIDS_Dataset/dataset_description.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/dataset_description.json
rename to cubids/tests/data/BIDS_Dataset/dataset_description.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/anat/sub-04_ses-phdiff_T1w.json b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/anat/sub-04_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/anat/sub-04_ses-phdiff_T1w.json
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/anat/sub-04_ses-phdiff_T1w.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/anat/sub-04_ses-phdiff_T1w.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/anat/sub-04_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/anat/sub-04_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/anat/sub-04_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/dwi/sub-04_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/fmap/sub-04_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/func/sub-04_ses-phdiff_task-rest_bold.json b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/func/sub-04_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/func/sub-04_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/func/sub-04_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/func/sub-04_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/func/sub-04_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/BIDS_Dataset/sub-04/ses-phdiff/func/sub-04_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/BIDS_Dataset/sub-04/ses-phdiff/func/sub-04_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/complete/README b/cubids/tests/data/complete/README
similarity index 100%
rename from cubids/testdata/complete/README
rename to cubids/tests/data/complete/README
diff --git a/cubids/testdata/complete/dataset_description.json b/cubids/tests/data/complete/dataset_description.json
similarity index 100%
rename from cubids/testdata/complete/dataset_description.json
rename to cubids/tests/data/complete/dataset_description.json
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json b/cubids/tests/data/complete/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
rename to cubids/tests/data/complete/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz b/cubids/tests/data/complete/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/complete/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/complete/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json b/cubids/tests/data/complete/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/complete/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/complete/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/complete/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/complete/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json b/cubids/tests/data/complete/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
rename to cubids/tests/data/complete/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz b/cubids/tests/data/complete/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/complete/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/complete/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/complete/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json b/cubids/tests/data/complete/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/complete/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/complete/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/complete/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/complete/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json b/cubids/tests/data/complete/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
rename to cubids/tests/data/complete/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz b/cubids/tests/data/complete/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/complete/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/complete/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/complete/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json b/cubids/tests/data/complete/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/complete/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/complete/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/complete/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/complete/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/complete/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/inconsistent/README b/cubids/tests/data/inconsistent/README
similarity index 100%
rename from cubids/testdata/inconsistent/README
rename to cubids/tests/data/inconsistent/README
diff --git a/cubids/testdata/inconsistent/dataset_description.json b/cubids/tests/data/inconsistent/dataset_description.json
similarity index 100%
rename from cubids/testdata/inconsistent/dataset_description.json
rename to cubids/tests/data/inconsistent/dataset_description.json
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.json
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/anat/sub-01_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/inconsistent/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/inconsistent/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/inconsistent/sub-01/ses-phdiff/func/sub-01_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.json
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/anat/sub-02_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/dwi/sub-02_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/fmap/sub-02_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/inconsistent/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/inconsistent/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/inconsistent/sub-02/ses-phdiff/func/sub-02_ses-phdiff_task-rest_bold.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.json
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/anat/sub-03_ses-phdiff_T1w.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bval
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.bvec
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.json
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/dwi/sub-03_ses-phdiff_acq-HASC55AP_dwi.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.json
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude1.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.json
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_magnitude2.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.json
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_acq-v4_phasediff.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.json
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/fmap/sub-03_ses-phdiff_dir-PA_epi.nii.gz
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.json
diff --git a/cubids/testdata/inconsistent/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz b/cubids/tests/data/inconsistent/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
similarity index 100%
rename from cubids/testdata/inconsistent/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
rename to cubids/tests/data/inconsistent/sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz
diff --git a/tests/test_bond.py b/cubids/tests/test_bond.py
similarity index 58%
rename from tests/test_bond.py
rename to cubids/tests/test_bond.py
index f9fda0d06..5e5b863ca 100644
--- a/tests/test_bond.py
+++ b/cubids/tests/test_bond.py
@@ -1,58 +1,60 @@
-#!/usr/bin/env python
-
 """Tests for `cubids` package."""
-import sys
-sys.path.append("..")
-import shutil
-from copy import deepcopy
-import hashlib
 import json
-from pathlib import Path
-from pkg_resources import resource_filename as pkgrf
-import pytest
-from cubids import CuBIDS
-from cubids.validator import (build_validator_call,
-                       run_validator, parse_validator_output)
-from cubids.metadata_merge import (
-    merge_without_overwrite, merge_json_into_json)
-from math import nan
 import subprocess
-import csv
-import os
-import filecmp
-import nibabel as nb
+from copy import deepcopy
+from pathlib import Path
+
 import numpy as np
 import pandas as pd
-import subprocess
+import pytest
 
-TEST_DATA = pkgrf("cubids", "testdata")
+from cubids import CuBIDS
+from cubids.metadata_merge import merge_json_into_json, merge_without_overwrite
+from cubids.tests.utils import (
+    _add_deletion,
+    _add_ext_files,
+    _edit_a_json,
+    _edit_a_nifti,
+    _get_json_string,
+    _remove_a_json,
+    file_hash,
+    get_data,
+)
+from cubids.validator import build_validator_call, parse_validator_output, run_validator
 
 COMPLETE_KEY_GROUPS = [
-    'acquisition-HASC55AP_datatype-dwi_suffix-dwi',
-    'acquisition-v4_datatype-fmap_fmap-magnitude1_suffix-magnitude1',
-    'acquisition-v4_datatype-fmap_fmap-magnitude2_suffix-magnitude2',
-    'acquisition-v4_datatype-fmap_fmap-phasediff_suffix-phasediff',
-    'datatype-anat_suffix-T1w',
-    'datatype-fmap_direction-PA_fmap-epi_suffix-epi',
-    'datatype-func_suffix-bold_task-rest']
-
-
-def get_data(tmp_path):
-    """Copy testing data to a local directory"""
-    data_root = tmp_path / "testdata"
-    shutil.copytree(TEST_DATA, str(data_root))
-    return data_root
+    "acquisition-HASC55AP_datatype-dwi_suffix-dwi",
+    "acquisition-v4_datatype-fmap_fmap-magnitude1_suffix-magnitude1",
+    "acquisition-v4_datatype-fmap_fmap-magnitude2_suffix-magnitude2",
+    "acquisition-v4_datatype-fmap_fmap-phasediff_suffix-phasediff",
+    "datatype-anat_suffix-T1w",
+    "datatype-fmap_direction-PA_fmap-epi_suffix-epi",
+    "datatype-func_suffix-bold_task-rest",
+]
 
 
 def test_ok_json_merge(tmp_path):
+    """Test ok_json_merge."""
     data_root = get_data(tmp_path)
 
     # Test that a successful merge can happen
-    dest_json = data_root / "inconsistent" / "sub-02" / \
-        "ses-phdiff" / "dwi" / "sub-02_ses-phdiff_acq-HASC55AP_dwi.json"
+    dest_json = (
+        data_root
+        / "inconsistent"
+        / "sub-02"
+        / "ses-phdiff"
+        / "dwi"
+        / "sub-02_ses-phdiff_acq-HASC55AP_dwi.json"
+    )
     orig_dest_json_content = _get_json_string(dest_json)
-    source_json = data_root / "inconsistent" / "sub-03" / \
-        "ses-phdiff" / "dwi" / "sub-03_ses-phdiff_acq-HASC55AP_dwi.json"
+    source_json = (
+        data_root
+        / "inconsistent"
+        / "sub-03"
+        / "ses-phdiff"
+        / "dwi"
+        / "sub-03_ses-phdiff_acq-HASC55AP_dwi.json"
+    )
 
     merge_return = merge_json_into_json(source_json, dest_json)
     assert merge_return == 0
@@ -60,32 +62,47 @@ def test_ok_json_merge(tmp_path):
 
 
 def test_ok_json_merge_cli(tmp_path):
+    """Test ok_json_merge_cli."""
     data_root = get_data(tmp_path)
 
     # Test that a successful merge can happen
-    dest_json = data_root / "inconsistent" / "sub-02" / \
-        "ses-phdiff" / "dwi" / "sub-02_ses-phdiff_acq-HASC55AP_dwi.json"
+    dest_json = (
+        data_root
+        / "inconsistent"
+        / "sub-02"
+        / "ses-phdiff"
+        / "dwi"
+        / "sub-02_ses-phdiff_acq-HASC55AP_dwi.json"
+    )
     orig_dest_json_content = _get_json_string(dest_json)
-    source_json = data_root / "inconsistent" / "sub-03" / \
-        "ses-phdiff" / "dwi" / "sub-03_ses-phdiff_acq-HASC55AP_dwi.json"
-
-    merge_proc = subprocess.run(
-        ['bids-sidecar-merge', str(source_json), str(dest_json)])
+    source_json = (
+        data_root
+        / "inconsistent"
+        / "sub-03"
+        / "ses-phdiff"
+        / "dwi"
+        / "sub-03_ses-phdiff_acq-HASC55AP_dwi.json"
+    )
+
+    merge_proc = subprocess.run(["bids-sidecar-merge", str(source_json), str(dest_json)])
     assert merge_proc.returncode == 0
     assert not _get_json_string(dest_json) == orig_dest_json_content
 
+
 def test_get_param_groups(tmp_path):
+    """Test get_param_groups."""
     data_root = get_data(tmp_path)
     bod = CuBIDS(data_root / "inconsistent", use_datalad=True)
-    tsv_prefix = str(tmp_path / "tsvs")
     key_groups = bod.get_key_groups()
     bod._cache_fieldmaps()
 
     for key_group in key_groups:
         ret = bod.get_param_groups_from_key_group(key_group)
-        assert sum(ret[1].Counts) == ret[1].loc[0, 'KeyGroupCount']
+        assert sum(ret[1].Counts) == ret[1].loc[0, "KeyGroupCount"]
+
 
 def test_copy_exemplars(tmp_path):
+    """Test copy_exemplars."""
     data_root = get_data(tmp_path)
     bod = CuBIDS(data_root / "complete", use_datalad=True)
     tsv_prefix = str(tmp_path / "tsvs")
@@ -93,7 +110,7 @@ def test_copy_exemplars(tmp_path):
     acq_group_tsv = tsv_prefix + "_AcqGrouping.tsv"
     print("ACQ GROUP PATH: ", acq_group_tsv)
     exemplars_dir = str(tmp_path / "exemplars")
-    print('EXEMPLARS DIR: ', exemplars_dir)
+    print("EXEMPLARS DIR: ", exemplars_dir)
     df = pd.read_table(acq_group_tsv)
 
     bod.copy_exemplars(exemplars_dir, acq_group_tsv, min_group_size=1)
@@ -105,57 +122,92 @@ def test_copy_exemplars(tmp_path):
     assert cntr == len(df.drop_duplicates(subset=["AcqGroup"]))
 
     # check that dataset_description.json got added
-    assert Path(exemplars_dir + '/dataset_description.json').exists()
+    assert Path(exemplars_dir + "/dataset_description.json").exists()
+
 
 def test_purge_no_datalad(tmp_path):
+    """Test purge_no_datalad."""
     data_root = get_data(tmp_path)
     scans = []
     scan_name = "sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz"
-    json_name = data_root / "complete" / "sub-03" / "ses-phdiff" \
-        / "func" / "sub-03_ses-phdiff_task-rest_bold.json"
+    json_name = (
+        data_root
+        / "complete"
+        / "sub-03"
+        / "ses-phdiff"
+        / "func"
+        / "sub-03_ses-phdiff_task-rest_bold.json"
+    )
     scans.append(scan_name)
     scans.append("sub-01/ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz")
 
     # create and save .txt with list of scans
     purge_path = str(tmp_path / "purge_scans.txt")
-    with open(purge_path, 'w') as filehandle:
+    with open(purge_path, "w") as filehandle:
         for listitem in scans:
-            filehandle.write('%s\n' % listitem)
+            filehandle.write(f"{listitem}\n")
+
     bod = CuBIDS(data_root / "complete", use_datalad=False)
 
     assert Path(data_root / "complete" / scan_name).exists()
     assert Path(json_name).exists()
 
     # Check that IntendedFor purge worked
-    with open(str(data_root / "complete" / "sub-01" / "ses-phdiff" / "fmap" / "sub-01_ses-phdiff_acq-v4_phasediff.json")) as f:
+    with open(
+        str(
+            data_root
+            / "complete"
+            / "sub-01"
+            / "ses-phdiff"
+            / "fmap"
+            / "sub-01_ses-phdiff_acq-v4_phasediff.json"
+        )
+    ) as f:
         j_dict = json.load(f)
 
     assert "ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz" in j_dict.values()
-    assert isinstance(j_dict['IntendedFor'], str)
+    assert isinstance(j_dict["IntendedFor"], str)
     # PURGE
     bod.purge(purge_path)
 
-    with open(str(data_root / "complete" / "sub-01" / "ses-phdiff" / "fmap" / "sub-01_ses-phdiff_acq-v4_phasediff.json")) as f:
+    with open(
+        str(
+            data_root
+            / "complete"
+            / "sub-01"
+            / "ses-phdiff"
+            / "fmap"
+            / "sub-01_ses-phdiff_acq-v4_phasediff.json"
+        )
+    ) as f:
         purged_dict = json.load(f)
 
     assert not Path(data_root / "complete" / scan_name).exists()
     assert not Path(json_name).exists()
     assert "ses-phdiff/dwi/sub-01_ses-phdiff_acq-HASC55AP_dwi.nii.gz" not in purged_dict.values()
-    assert isinstance(purged_dict['IntendedFor'], list)
-    assert purged_dict['IntendedFor'] == []
+    assert isinstance(purged_dict["IntendedFor"], list)
+    assert purged_dict["IntendedFor"] == []
+
 
 def test_purge(tmp_path):
+    """Test purge."""
     data_root = get_data(tmp_path)
     scans = []
     scan_name = "sub-03/ses-phdiff/func/sub-03_ses-phdiff_task-rest_bold.nii.gz"
-    json_name = data_root / "complete" / "sub-03" / "ses-phdiff" \
-        / "func" / "sub-03_ses-phdiff_task-rest_bold.json"
+    json_name = (
+        data_root
+        / "complete"
+        / "sub-03"
+        / "ses-phdiff"
+        / "func"
+        / "sub-03_ses-phdiff_task-rest_bold.json"
+    )
     scans.append(scan_name)
     purge_path = str(tmp_path / "purge_scans.txt")
 
-    with open(purge_path, 'w') as filehandle:
+    with open(purge_path, "w") as filehandle:
         for listitem in scans:
-            filehandle.write('%s\n' % listitem)
+            filehandle.write(f"{listitem}\n")
     bod = CuBIDS(data_root / "complete", use_datalad=True)
     bod.datalad_save()
 
@@ -171,35 +223,62 @@ def test_purge(tmp_path):
 
 
 def test_bad_json_merge(tmp_path):
+    """Test bad_json_merge."""
     data_root = get_data(tmp_path)
 
     # Test that a successful merge can happen
-    dest_json = data_root / "inconsistent" / "sub-02" / \
-        "ses-phdiff" / "dwi" / "sub-02_ses-phdiff_acq-HASC55AP_dwi.json"
+    dest_json = (
+        data_root
+        / "inconsistent"
+        / "sub-02"
+        / "ses-phdiff"
+        / "dwi"
+        / "sub-02_ses-phdiff_acq-HASC55AP_dwi.json"
+    )
     orig_dest_json_content = _get_json_string(dest_json)
-    invalid_source_json = data_root / "inconsistent" / "sub-01" / \
-        "ses-phdiff" / "dwi" / "sub-01_ses-phdiff_acq-HASC55AP_dwi.json"
+    invalid_source_json = (
+        data_root
+        / "inconsistent"
+        / "sub-01"
+        / "ses-phdiff"
+        / "dwi"
+        / "sub-01_ses-phdiff_acq-HASC55AP_dwi.json"
+    )
 
     assert merge_json_into_json(invalid_source_json, dest_json) > 0
     assert _get_json_string(dest_json) == orig_dest_json_content
 
 
 def test_bad_json_merge_cli(tmp_path):
+    """Test bade_json_merge_cli."""
     data_root = get_data(tmp_path)
 
     # Test that a successful merge can happen
-    dest_json = data_root / "inconsistent" / "sub-02" / \
-        "ses-phdiff" / "dwi" / "sub-02_ses-phdiff_acq-HASC55AP_dwi.json"
+    dest_json = (
+        data_root
+        / "inconsistent"
+        / "sub-02"
+        / "ses-phdiff"
+        / "dwi"
+        / "sub-02_ses-phdiff_acq-HASC55AP_dwi.json"
+    )
     orig_dest_json_content = _get_json_string(dest_json)
-    invalid_source_json = data_root / "inconsistent" / "sub-01" / \
-        "ses-phdiff" / "dwi" / "sub-01_ses-phdiff_acq-HASC55AP_dwi.json"
-
-    merge_proc = subprocess.run(
-        ['bids-sidecar-merge', str(invalid_source_json), str(dest_json)])
+    invalid_source_json = (
+        data_root
+        / "inconsistent"
+        / "sub-01"
+        / "ses-phdiff"
+        / "dwi"
+        / "sub-01_ses-phdiff_acq-HASC55AP_dwi.json"
+    )
+
+    merge_proc = subprocess.run(["bids-sidecar-merge", str(invalid_source_json), str(dest_json)])
     assert merge_proc.returncode > 0
     assert _get_json_string(dest_json) == orig_dest_json_content
 
+
 def test_add_nifti_info_datalad(tmp_path):
+    """Test add_nifti_info_datalad."""
     data_root = get_data(tmp_path)
     bod = CuBIDS(data_root / "complete", use_datalad=True, force_unlock=True)
     tsv_prefix = str(tmp_path / "tsvs")
@@ -207,21 +286,21 @@ def test_add_nifti_info_datalad(tmp_path):
     summary_tsv = tsv_prefix + "_summary.tsv"
     summary_df = pd.read_table(summary_tsv)
     l_cols = summary_df.columns.tolist()
-    assert 'NumVolumes' not in l_cols
-    assert 'Obliquity' not in l_cols
+    assert "NumVolumes" not in l_cols
+    assert "Obliquity" not in l_cols
 
     # now add nifti info
     bod.add_nifti_info()
 
     found_fields = set()
     for json_file in Path(bod.path).rglob("*.json"):
-        if '.git' not in str(json_file):
+        if ".git" not in str(json_file):
             with open(json_file, "r") as jsonr:
                 metadata = json.load(jsonr)
             found_fields.update(metadata.keys())
-    assert 'NumVolumes' in found_fields
-    assert 'Obliquity' in found_fields
-    assert 'ImageOrientation' in found_fields
+    assert "NumVolumes" in found_fields
+    assert "Obliquity" in found_fields
+    assert "ImageOrientation" in found_fields
 
     # nifti_tsv_prefix = str(tmp_path / "nifti_tsvs")
     # bod.get_tsvs(nifti_tsv_prefix)
@@ -232,20 +311,22 @@ def test_add_nifti_info_datalad(tmp_path):
     # assert 'Obliquity' in nifti_l_cols
     # assert 'ImageOrientation' in nifti_l_cols
 
+
 def test_add_nifti_info_no_datalad(tmp_path):
+    """Test add_nifti_info_no_datalad."""
     data_root = get_data(tmp_path)
     bod = CuBIDS(data_root / "complete", use_datalad=False, force_unlock=False)
     bod.add_nifti_info()
 
     found_fields = set()
     for json_file in Path(bod.path).rglob("*.json"):
-        if '.git' not in str(json_file):
+        if ".git" not in str(json_file):
             with open(json_file, "r") as jsonr:
                 metadata = json.load(jsonr)
             found_fields.update(metadata.keys())
-    assert 'NumVolumes' in found_fields
-    assert 'Obliquity' in found_fields
-    assert 'ImageOrientation' in found_fields
+    assert "NumVolumes" in found_fields
+    assert "Obliquity" in found_fields
+    assert "ImageOrientation" in found_fields
 
     # tsv_prefix = str(tmp_path / "tsvs")
     # bod.get_tsvs(tsv_prefix)
@@ -255,8 +336,12 @@ def test_add_nifti_info_no_datalad(tmp_path):
     # assert 'NumVolumes' in l_cols
     # assert 'Obliquity' in l_cols
 
-#TODO: add tests that return an error for invalid merge
+
+# TODO: add tests that return an error for invalid merge
+
+
 def test_tsv_merge_no_datalad(tmp_path):
+    """Test tsv_merge_no_datalad."""
     data_root = get_data(tmp_path)
     bod = CuBIDS(data_root / "inconsistent", use_datalad=False)
 
@@ -267,61 +352,57 @@ def test_tsv_merge_no_datalad(tmp_path):
     original_files_tsv = tsv_prefix + "_files.tsv"
 
     # give tsv with no changes (make sure it does nothing)
-    bod.apply_tsv_changes(original_summary_tsv,
-                          original_files_tsv,
-                          str(tmp_path / "unmodified"))
+    bod.apply_tsv_changes(original_summary_tsv, original_files_tsv, str(tmp_path / "unmodified"))
 
     # these will not actually be equivalent because of the auto renames
-    assert file_hash(original_summary_tsv) != \
-           file_hash(tmp_path / "unmodified_summary.tsv")
+    assert file_hash(original_summary_tsv) != file_hash(tmp_path / "unmodified_summary.tsv")
 
     # Find the dwi with no FlipAngle
     summary_df = pd.read_table(original_summary_tsv)
-    fa_nan_dwi_row, = np.flatnonzero(
-        np.isnan(summary_df.FlipAngle) &
-        summary_df.KeyGroup.str.fullmatch(
-            "acquisition-HASC55AP_datatype-dwi_suffix-dwi"))
+    (fa_nan_dwi_row,) = np.flatnonzero(
+        np.isnan(summary_df.FlipAngle)
+        & summary_df.KeyGroup.str.fullmatch("acquisition-HASC55AP_datatype-dwi_suffix-dwi")
+    )
     # Find the dwi with and EchoTime ==
-    complete_dwi_row, = np.flatnonzero(
-        summary_df.KeyGroup.str.fullmatch(
-            "acquisition-HASC55AP_datatype-dwi_suffix-dwi") &
-        (summary_df.FlipAngle == 90.) &
-        (summary_df.EchoTime > 0.05))
-    cant_merge_echotime_dwi_row, = np.flatnonzero(
-        summary_df.KeyGroup.str.fullmatch(
-            "acquisition-HASC55AP_datatype-dwi_suffix-dwi") &
-        (summary_df.FlipAngle == 90.) &
-        (summary_df.EchoTime < 0.05))
+    (complete_dwi_row,) = np.flatnonzero(
+        summary_df.KeyGroup.str.fullmatch("acquisition-HASC55AP_datatype-dwi_suffix-dwi")
+        & (summary_df.FlipAngle == 90.0)
+        & (summary_df.EchoTime > 0.05)
+    )
+    (cant_merge_echotime_dwi_row,) = np.flatnonzero(
+        summary_df.KeyGroup.str.fullmatch("acquisition-HASC55AP_datatype-dwi_suffix-dwi")
+        & (summary_df.FlipAngle == 90.0)
+        & (summary_df.EchoTime < 0.05)
+    )
 
     # Set a legal MergeInto value. This effectively fills in data
     # where there was previously as missing FlipAngle
-    summary_df.loc[fa_nan_dwi_row, "MergeInto"] = summary_df.ParamGroup[
-        complete_dwi_row]
+    summary_df.loc[fa_nan_dwi_row, "MergeInto"] = summary_df.ParamGroup[complete_dwi_row]
 
     valid_tsv_file = tsv_prefix + "_valid_summary.tsv"
     summary_df.to_csv(valid_tsv_file, sep="\t", index=False)
 
     # about to apply merges!
 
-    bod.apply_tsv_changes(valid_tsv_file,
-                          original_files_tsv,
-                          str(tmp_path / "ok_modified"))
+    bod.apply_tsv_changes(valid_tsv_file, original_files_tsv, str(tmp_path / "ok_modified"))
 
-    assert not file_hash(original_summary_tsv) == \
-           file_hash(tmp_path / "ok_modified_summary.tsv")
+    assert not file_hash(original_summary_tsv) == file_hash(tmp_path / "ok_modified_summary.tsv")
 
     # Add an illegal merge to MergeInto
     summary_df.loc[cant_merge_echotime_dwi_row, "MergeInto"] = summary_df.ParamGroup[
-        complete_dwi_row]
+        complete_dwi_row
+    ]
     invalid_tsv_file = tsv_prefix + "_invalid_summary.tsv"
     summary_df.to_csv(invalid_tsv_file, sep="\t", index=False)
 
     with pytest.raises(Exception):
-        bod.apply_tsv_changes(invalid_tsv_file,
-                              str(tmp_path / "originals_files.tsv"),
-                              str(tmp_path / "ok_modified"))
+        bod.apply_tsv_changes(
+            invalid_tsv_file, str(tmp_path / "originals_files.tsv"), str(tmp_path / "ok_modified")
+        )
+
 
 def test_tsv_merge_changes(tmp_path):
+    """Test tsv_merge_changes."""
     data_root = get_data(tmp_path)
     bod = CuBIDS(data_root / "inconsistent", use_datalad=True)
     bod.datalad_save()
@@ -334,14 +415,12 @@ def test_tsv_merge_changes(tmp_path):
     original_files_tsv = tsv_prefix + "_files.tsv"
 
     # give tsv with no changes (make sure it does nothing except rename)
-    bod.apply_tsv_changes(original_summary_tsv,
-                          original_files_tsv,
-                          str(tmp_path / "unmodified"))
+    bod.apply_tsv_changes(original_summary_tsv, original_files_tsv, str(tmp_path / "unmodified"))
     orig = pd.read_table(original_summary_tsv)
     # TEST RenameKeyGroup column got populated CORRECTLY
     for row in range(len(orig)):
-        if orig.loc[row, 'ParamGroup'] != 1:
-            assert str(orig.loc[row, 'RenameKeyGroup']) != 'nan'
+        if orig.loc[row, "ParamGroup"] != 1:
+            assert str(orig.loc[row, "RenameKeyGroup"]) != "nan"
 
     # TESTING RENAMES GOT APPLIED
     applied = pd.read_table(str(tmp_path / "unmodified_summary.tsv"))
@@ -349,78 +428,81 @@ def test_tsv_merge_changes(tmp_path):
     applied_f = pd.read_table(str(tmp_path / "unmodified_files.tsv"))
     odd = []
     for row in range(len(applied_f)):
-        if 'VARIANT' in applied_f.loc[row, 'FilePath'] and 'VARIANT' not in applied_f.loc[row, 'KeyParamGroup']:
-            odd.append((applied_f.loc[row, 'FilePath']))
+        if (
+            "VARIANT" in applied_f.loc[row, "FilePath"]
+            and "VARIANT" not in applied_f.loc[row, "KeyParamGroup"]
+        ):
+            odd.append((applied_f.loc[row, "FilePath"]))
 
     occurrences = {}
     for row in range(len(applied_f)):
-        if applied_f.loc[row, 'FilePath'] in odd:
-            if applied_f.loc[row, 'FilePath'] in occurrences.keys():
-                occurrences[applied_f.loc[row, 'FilePath']].append(applied_f.loc[row, 'KeyParamGroup'])
+        if applied_f.loc[row, "FilePath"] in odd:
+            if applied_f.loc[row, "FilePath"] in occurrences.keys():
+                occurrences[applied_f.loc[row, "FilePath"]].append(
+                    applied_f.loc[row, "KeyParamGroup"]
+                )
             else:
-                occurrences[applied_f.loc[row, 'FilePath']] = [applied_f.loc[row, 'KeyParamGroup']]
+                occurrences[applied_f.loc[row, "FilePath"]] = [applied_f.loc[row, "KeyParamGroup"]]
 
     assert len(orig) == len(applied)
 
     renamed = True
-    new_keys = applied['KeyGroup'].tolist()
+    new_keys = applied["KeyGroup"].tolist()
     for row in range(len(orig)):
-        if orig.loc[row, 'Modality'] != 'fmap':
-            if str(orig.loc[row, 'RenameKeyGroup']) != 'nan' \
-                    and str(orig.loc[row, 'RenameKeyGroup']) not in new_keys:
-                print(orig.loc[row, 'RenameKeyGroup'])
+        if orig.loc[row, "Modality"] != "fmap":
+            if (
+                str(orig.loc[row, "RenameKeyGroup"]) != "nan"
+                and str(orig.loc[row, "RenameKeyGroup"]) not in new_keys
+            ):
+                print(orig.loc[row, "RenameKeyGroup"])
                 renamed = False
 
-    assert renamed == True
+    assert renamed
 
     # will no longer be equal because of auto rename!
-    assert file_hash(original_summary_tsv)!= \
-           file_hash(tmp_path / "unmodified_summary.tsv")
+    assert file_hash(original_summary_tsv) != file_hash(tmp_path / "unmodified_summary.tsv")
 
     # Find the dwi with no FlipAngle
     summary_df = pd.read_table(original_summary_tsv)
-    fa_nan_dwi_row, = np.flatnonzero(
-        np.isnan(summary_df.FlipAngle) &
-        summary_df.KeyGroup.str.fullmatch(
-            "acquisition-HASC55AP_datatype-dwi_suffix-dwi"))
+    (fa_nan_dwi_row,) = np.flatnonzero(
+        np.isnan(summary_df.FlipAngle)
+        & summary_df.KeyGroup.str.fullmatch("acquisition-HASC55AP_datatype-dwi_suffix-dwi")
+    )
     # Find the dwi with and EchoTime ==
-    complete_dwi_row, = np.flatnonzero(
-        summary_df.KeyGroup.str.fullmatch(
-            "acquisition-HASC55AP_datatype-dwi_suffix-dwi") &
-        (summary_df.FlipAngle == 90.) &
-        (summary_df.EchoTime > 0.05))
-    cant_merge_echotime_dwi_row, = np.flatnonzero(
-        summary_df.KeyGroup.str.fullmatch(
-            "acquisition-HASC55AP_datatype-dwi_suffix-dwi") &
-        (summary_df.FlipAngle == 90.) &
-        (summary_df.EchoTime < 0.05))
+    (complete_dwi_row,) = np.flatnonzero(
+        summary_df.KeyGroup.str.fullmatch("acquisition-HASC55AP_datatype-dwi_suffix-dwi")
+        & (summary_df.FlipAngle == 90.0)
+        & (summary_df.EchoTime > 0.05)
+    )
+    (cant_merge_echotime_dwi_row,) = np.flatnonzero(
+        summary_df.KeyGroup.str.fullmatch("acquisition-HASC55AP_datatype-dwi_suffix-dwi")
+        & (summary_df.FlipAngle == 90.0)
+        & (summary_df.EchoTime < 0.05)
+    )
 
     # Set a legal MergeInto value. This effectively fills in data
     # where there was previously as missing FlipAngle
-    summary_df.loc[fa_nan_dwi_row, "MergeInto"] = summary_df.ParamGroup[
-        complete_dwi_row]
+    summary_df.loc[fa_nan_dwi_row, "MergeInto"] = summary_df.ParamGroup[complete_dwi_row]
 
     valid_tsv_file = tsv_prefix + "_valid_summary.tsv"
     summary_df.to_csv(valid_tsv_file, sep="\t", index=False)
 
     # about to merge
-    bod.apply_tsv_changes(valid_tsv_file,
-                          original_files_tsv,
-                          str(tmp_path / "ok_modified"))
+    bod.apply_tsv_changes(valid_tsv_file, original_files_tsv, str(tmp_path / "ok_modified"))
 
-    assert not file_hash(original_summary_tsv) == \
-           file_hash(tmp_path / "ok_modified_summary.tsv")
+    assert not file_hash(original_summary_tsv) == file_hash(tmp_path / "ok_modified_summary.tsv")
 
     # Add an illegal merge to MergeInto
     summary_df.loc[cant_merge_echotime_dwi_row, "MergeInto"] = summary_df.ParamGroup[
-        complete_dwi_row]
+        complete_dwi_row
+    ]
     invalid_tsv_file = tsv_prefix + "_invalid_summary.tsv"
     summary_df.to_csv(invalid_tsv_file, sep="\t", index=False)
 
     with pytest.raises(Exception):
-        bod.apply_tsv_changes(invalid_tsv_file,
-                              str(tmp_path / "originals_files.tsv"),
-                              str(tmp_path / "ok_modified"))
+        bod.apply_tsv_changes(
+            invalid_tsv_file, str(tmp_path / "originals_files.tsv"), str(tmp_path / "ok_modified")
+        )
 
     # Make sure MergeInto == 0 deletes the param group and all associations
     # summary_df = pd.read_table(original_summary_tsv)
@@ -448,43 +530,46 @@ def test_tsv_merge_changes(tmp_path):
 
     # assert delete_group not in tmp_path / "ok_deleted_summary.tsv"
 
+
 def test_merge_without_overwrite():
+    """Test merge_without_overwrite."""
     meta1 = {
-        'ManualCheck': 1.0,
-        'RenameKeyGroup': np.nan,
-        'MergeInto': 2.0,
-        'KeyGroup': 'datatype-func_suffix-bold_task-rest',
-        'ParamGroup': 12,
-        'Counts': 2,
-        'DwellTime': 2.6e-06,
-        'EchoTime': 0.03,
-        'EffectiveEchoSpacing': 0.000580013,
-        'FieldmapKey00': 'acquisition-fMRI_datatype-fmap_direction-AP_fmap-epi_suffix-epi',
-        'FieldmapKey01': 'acquisition-fMRI_datatype-fmap_direction-PA_fmap-epi_run-1_suffix-epi',
-        'FieldmapKey02': 'acquisition-fMRI_datatype-fmap_direction-PA_fmap-epi_run-2_suffix-epi',
-        'FieldmapKey03': np.nan,
-        'FieldmapKey04': np.nan,
-        'FieldmapKey05': np.nan,
-        'FieldmapKey06': np.nan,
-        'FieldmapKey07': np.nan,
-        'FlipAngle': 31.0,
-        'IntendedForKey00': np.nan,
-        'IntendedForKey01': np.nan,
-        'IntendedForKey02': np.nan,
-        'IntendedForKey03': np.nan,
-        'IntendedForKey04': np.nan,
-        'IntendedForKey05': np.nan,
-        'IntendedForKey06': np.nan,
-        'IntendedForKey07': np.nan,
-        'IntendedForKey08': np.nan,
-        'IntendedForKey09': np.nan,
-        'MultibandAccelerationFactor': 6.0,
-        'NSliceTimes': 60,
-        'ParallelReductionFactorInPlane': np.nan,
-        'PartialFourier': 1.0,
-        'PhaseEncodingDirection': 'j-',
-        'RepetitionTime': 0.8,
-        'TotalReadoutTime': 0.0481411}
+        "ManualCheck": 1.0,
+        "RenameKeyGroup": np.nan,
+        "MergeInto": 2.0,
+        "KeyGroup": "datatype-func_suffix-bold_task-rest",
+        "ParamGroup": 12,
+        "Counts": 2,
+        "DwellTime": 2.6e-06,
+        "EchoTime": 0.03,
+        "EffectiveEchoSpacing": 0.000580013,
+        "FieldmapKey00": "acquisition-fMRI_datatype-fmap_direction-AP_fmap-epi_suffix-epi",
+        "FieldmapKey01": "acquisition-fMRI_datatype-fmap_direction-PA_fmap-epi_run-1_suffix-epi",
+        "FieldmapKey02": "acquisition-fMRI_datatype-fmap_direction-PA_fmap-epi_run-2_suffix-epi",
+        "FieldmapKey03": np.nan,
+        "FieldmapKey04": np.nan,
+        "FieldmapKey05": np.nan,
+        "FieldmapKey06": np.nan,
+        "FieldmapKey07": np.nan,
+        "FlipAngle": 31.0,
+        "IntendedForKey00": np.nan,
+        "IntendedForKey01": np.nan,
+        "IntendedForKey02": np.nan,
+        "IntendedForKey03": np.nan,
+        "IntendedForKey04": np.nan,
+        "IntendedForKey05": np.nan,
+        "IntendedForKey06": np.nan,
+        "IntendedForKey07": np.nan,
+        "IntendedForKey08": np.nan,
+        "IntendedForKey09": np.nan,
+        "MultibandAccelerationFactor": 6.0,
+        "NSliceTimes": 60,
+        "ParallelReductionFactorInPlane": np.nan,
+        "PartialFourier": 1.0,
+        "PhaseEncodingDirection": "j-",
+        "RepetitionTime": 0.8,
+        "TotalReadoutTime": 0.0481411,
+    }
 
     # Suppose User tries to overwrite num with NaN (allowed)
     meta_NaN = deepcopy(meta1)
@@ -514,6 +599,7 @@ def test_merge_without_overwrite():
 
 
 def test_keygroups(tmp_path):
+    """Test keygroups."""
     data_root = get_data(tmp_path)
 
     # Test the complete data
@@ -537,8 +623,7 @@ def test_keygroups(tmp_path):
 
 
 def test_tsv_creation(tmp_path):
-    """Test the Key Group and Parameter Group creation on sample data.
-    """
+    """Test the Key Group and Parameter Group creation on sample data."""
     data_root = get_data(tmp_path)
 
     # Test the complete data
@@ -552,8 +637,7 @@ def test_tsv_creation(tmp_path):
     assert key_groups == COMPLETE_KEY_GROUPS
 
     # Get the tsvs from the complete data
-    cfiles_df, csummary_df = \
-        complete_bod.get_param_groups_dataframes()
+    cfiles_df, csummary_df = complete_bod.get_param_groups_dataframes()
 
     # Make sure we got all 21 of the files
     assert cfiles_df.shape[0] == 21
@@ -568,10 +652,12 @@ def test_tsv_creation(tmp_path):
     for row in range(len(csummary_df)):
         if str(csummary_df.loc[row, "UsedAsFieldmap"]) == "True":
             bool_IF = True
+
         if str(csummary_df.loc[row, "HasFieldmap"]) == "True":
             bool_FMAP = True
-    assert bool_IF == True
-    assert bool_FMAP == True
+
+    assert bool_IF
+    assert bool_FMAP
 
     # Test the incomplete
     ibod = CuBIDS(data_root / "inconsistent")
@@ -583,8 +669,7 @@ def test_tsv_creation(tmp_path):
     assert ikey_groups == COMPLETE_KEY_GROUPS
 
     # Get the tsvs from the inconsistent data
-    ifiles_df, isummary_df = \
-        ibod.get_param_groups_dataframes()
+    ifiles_df, isummary_df = ibod.get_param_groups_dataframes()
 
     # There are still 21 files
     assert ifiles_df.shape[0] == 21
@@ -594,32 +679,28 @@ def test_tsv_creation(tmp_path):
 
     # check that summary tsv param group nums are in the right order
     # and check that param groups are sorted by count vals
-    for i, (index, row) in enumerate(isummary_df.iterrows()):
-        if i == len(isummary_df) -1:
+    for i, (_, row) in enumerate(isummary_df.iterrows()):
+        if i == len(isummary_df) - 1:
             break
         # if key groups in rows i and i+1 are the same
-        if isummary_df.iloc[i]['KeyGroup'] == \
-            isummary_df.iloc[i+1]['KeyGroup']:
+        if isummary_df.iloc[i]["KeyGroup"] == isummary_df.iloc[i + 1]["KeyGroup"]:
             # param group i = param group i+1
-            assert isummary_df.iloc[i]['ParamGroup'] == \
-                isummary_df.iloc[i+1]['ParamGroup'] - 1
+            assert isummary_df.iloc[i]["ParamGroup"] == isummary_df.iloc[i + 1]["ParamGroup"] - 1
             # and count i < count i + 1
-            assert isummary_df.iloc[i]['Counts'] >= \
-                isummary_df.iloc[i+1]['Counts']
+            assert isummary_df.iloc[i]["Counts"] >= isummary_df.iloc[i + 1]["Counts"]
 
     # check that files tsv param group nums are in the right order
-    for i, (index, row) in enumerate(ifiles_df.iterrows()):
-        if i == len(ifiles_df) -1:
+    for i, (_, row) in enumerate(ifiles_df.iterrows()):
+        if i == len(ifiles_df) - 1:
             break
         # if key groups in rows i and i+1 are the same
-        if ifiles_df.iloc[i]['KeyGroup'] == \
-            ifiles_df.iloc[i+1]['KeyGroup']:
+        if ifiles_df.iloc[i]["KeyGroup"] == ifiles_df.iloc[i + 1]["KeyGroup"]:
             # param group i = param group i+1
-            assert ifiles_df.iloc[i]['ParamGroup'] <= \
-                ifiles_df.iloc[i+1]['ParamGroup']
+            assert ifiles_df.iloc[i]["ParamGroup"] <= ifiles_df.iloc[i + 1]["ParamGroup"]
 
 
 def test_apply_tsv_changes(tmp_path):
+    """Test apply_tsv_changes."""
     # set up like narrative of user using this
     # similar to test tsv creation
     # open the tsv, rename a key group
@@ -630,35 +711,26 @@ def test_apply_tsv_changes(tmp_path):
 
     data_root = get_data(tmp_path)
     bids_dir = str(data_root / "complete")
-    for scan in Path(bids_dir).rglob('sub-*/*/*/*.nii.gz'):
-
+    for scan in Path(bids_dir).rglob("sub-*/*/*/*.nii.gz"):
         # add extension files
         _add_ext_files(str(scan))
 
-    # path_to_img = str(data_root / "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz")
+    # path_to_img = str(
+    #    data_root / "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.nii.gz"
+    # )
     # _add_ext_files(path_to_img)
 
-    has_events = False
-    has_physio = False
-
-    # check if events and physio files
-    if Path(data_root /
-            "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_events.tsv").exists():
-        has_events = True
-    if Path(data_root /
-            "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_physio.tsv.gz").exists():
-        has_physio = True
-
-
     complete_cubids = CuBIDS(data_root / "complete", use_datalad=True)
     complete_cubids.datalad_save()
 
     complete_cubids.get_tsvs(str(tmp_path / "originals"))
 
     # give tsv with no changes (make sure it does nothing)
-    complete_cubids.apply_tsv_changes(str(tmp_path / "originals_summary.tsv"),
-                                    str(tmp_path / "originals_files.tsv"),
-                                    str(tmp_path / "modified1"))
+    complete_cubids.apply_tsv_changes(
+        str(tmp_path / "originals_summary.tsv"),
+        str(tmp_path / "originals_files.tsv"),
+        str(tmp_path / "modified1"),
+    )
 
     og_path = tmp_path / "originals_summary.tsv"
     with og_path.open("r") as f:
@@ -673,23 +745,30 @@ def test_apply_tsv_changes(tmp_path):
     # edit the tsv, add a RenameKeyGroup
 
     # _edit_tsv(str(tmp_path / "originals_summary.tsv"))
-    complete_cubids.apply_tsv_changes(str(tmp_path / "originals_summary.tsv"),
-                                    str(tmp_path / "originals_files.tsv"),
-                                    str(tmp_path / "modified2"))
+    complete_cubids.apply_tsv_changes(
+        str(tmp_path / "originals_summary.tsv"),
+        str(tmp_path / "originals_files.tsv"),
+        str(tmp_path / "modified2"),
+    )
 
     # check files df to make sure extension files also got renmaed
-    mod_files = tmp_path / "modified2_files.tsv"
+    # mod_files = tmp_path / "modified2_files.tsv"
     # ensure fmap didn't get renamed
-    # assert Path(data_root /
-    #     "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v5_magnitude1.json").exists() == False
-    assert Path(data_root /
-        "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json").exists() == True
+    # assert not Path(
+    #    data_root /
+    #    "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v5_magnitude1.json"
+    # ).exists()
+    assert Path(
+        data_root / "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_magnitude1.json"
+    ).exists()
 
     # check that old names are gone!
-    # assert Path(data_root /
-    #     "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v5_physio.tsv.gz").exists() == True
-    assert Path(data_root /
-        "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_physio.tsv.gz").exists() == True
+    # assert Path(
+    #    data_root / "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v5_physio.tsv.gz"
+    # ).exists()
+    assert Path(
+        data_root / "complete/sub-01/ses-phdiff/fmap/sub-01_ses-phdiff_acq-v4_physio.tsv.gz"
+    ).exists()
 
     mod2_path = tmp_path / "modified2_summary.tsv"
     with mod2_path.open("r") as f:
@@ -708,22 +787,22 @@ def test_apply_tsv_changes(tmp_path):
     assert deleted_keyparam in mod2_f_content
 
     # check scans and associations to be deleted are currently in the bids dir
-    mod2_summary_df = pd.read_table(mod2_path)
+    # mod2_summary_df = pd.read_table(mod2_path)
     mod2_files_df = pd.read_table(str(tmp_path / "modified2_files.tsv"))
     deleted_f = []
 
     for row in range(len(mod2_files_df)):
-        if mod2_files_df.loc[row, 'KeyParamGroup'] == deleted_keyparam:
-            deleted_f.append(mod2_files_df.loc[row, 'FilePath'])
+        if mod2_files_df.loc[row, "KeyParamGroup"] == deleted_keyparam:
+            deleted_f.append(mod2_files_df.loc[row, "FilePath"])
 
     for f in deleted_f:
-        assert Path(str(data_root / "complete") + f).exists() == True
-        assert Path(str(data_root / "complete") + f.replace('nii.gz', 'json')).exists() == True
+        assert Path(str(data_root / "complete") + f).exists()
+        assert Path(str(data_root / "complete") + f.replace("nii.gz", "json")).exists()
 
     # apply deletion
-    complete_cubids.apply_tsv_changes(mod2_path,
-                                    str(tmp_path / "modified2_files.tsv"),
-                                    str(tmp_path / "deleted"))
+    complete_cubids.apply_tsv_changes(
+        mod2_path, str(tmp_path / "modified2_files.tsv"), str(tmp_path / "deleted")
+    )
 
     # make sure deleted_keyparam gone from files_tsv
     deleted = tmp_path / "deleted_summary.tsv"
@@ -739,11 +818,12 @@ def test_apply_tsv_changes(tmp_path):
 
     # make sure deleted files are gone
     for f in deleted_f:
-        assert Path(f).exists() == False
-        assert Path(f.replace('nii.gz', 'json')).exists() == False
+        assert not Path(f).exists()
+        assert not Path(f.replace("nii.gz", "json")).exists()
 
 
 def test_session_apply(tmp_path):
+    """Test session_apply."""
     # set up like narrative of user using this
     # similar to test tsv creation
     # open the tsv, rename a key group
@@ -753,16 +833,17 @@ def test_session_apply(tmp_path):
     # make sure files you wanted to rename exist in the bids dir
 
     data_root = get_data(tmp_path)
-    bids_dir = str(data_root / "inconsistent")
 
-    ses_cubids = CuBIDS(data_root / "inconsistent", acq_group_level='session', use_datalad=True)
+    ses_cubids = CuBIDS(data_root / "inconsistent", acq_group_level="session", use_datalad=True)
 
     ses_cubids.get_tsvs(str(tmp_path / "originals"))
 
     # give tsv and make sure 'session' is in summary both pre and post apply
-    ses_cubids.apply_tsv_changes(str(tmp_path / "originals_summary.tsv"),
-                                    str(tmp_path / "originals_files.tsv"),
-                                    str(tmp_path / "modified1"))
+    ses_cubids.apply_tsv_changes(
+        str(tmp_path / "originals_summary.tsv"),
+        str(tmp_path / "originals_files.tsv"),
+        str(tmp_path / "modified1"),
+    )
 
     og_path = tmp_path / "originals_summary.tsv"
     with og_path.open("r") as f:
@@ -772,78 +853,8 @@ def test_session_apply(tmp_path):
     with mod1_path.open("r") as f:
         mod1_content = "".join(f.readlines())
 
-    assert 'session-' in og_content
-    assert 'session-' in mod1_content
-
-
-
-def _add_deletion(summary_tsv):
-    df = pd.read_table(summary_tsv)
-    df.loc[3, 'MergeInto'] = 0
-    df.to_csv(summary_tsv, sep="\t", index=False)
-    return df.loc[3, 'KeyParamGroup']
-
-
-# def _edit_tsv(summary_tsv):
-#     df = pd.read_table(summary_tsv)
-#     df['RenameKeyGroup'] = df['RenameKeyGroup'].apply(str)
-#     df['KeyGroup'] = df['KeyGroup'].apply(str)
-#     for row in range(len(df)):
-#         if df.loc[row, 'KeyGroup'] == \
-#             "acquisition-v4_datatype-fmap_fmap-magnitude1_suffix-magnitude1":
-#             df.at[row, 'RenameKeyGroup'] = \
-#                 "acquisition-v5_datatype-fmap_fmap-magnitude1_suffix-magnitude1"
-#     df.to_csv(summary_tsv)
-
-def _add_ext_files(img_path):
-    # add and save extension files in
-    dwi_exts = ['.bval', '.bvec']
-
-    # everyone gets a physio file
-    no_suffix = img_path.rpartition('_')[0]
-    physio_file = no_suffix + '_physio' + '.tsv.gz'
-    # save ext file in img_path's parent dir
-    Path(physio_file).touch()
-
-    if '/dwi/' in img_path:
-        # add bval and bvec
-        for ext in dwi_exts:
-            dwi_ext_file = img_path.replace(".nii.gz", "").replace(".nii", "") + ext
-            Path(dwi_ext_file).touch()
-    if 'bold' in img_path:
-        no_suffix = img_path.rpartition('_')[0]
-        bold_ext_file = no_suffix + '_events' + '.tsv'
-        Path(bold_ext_file).touch()
-
-
-def _edit_a_json(json_file):
-    """Open a json file, write something to it and save it to the same name."""
-    with open(json_file, "r") as metadatar:
-        metadata = json.load(metadatar)
-
-    metadata["THIS_IS_A_TEST"] = True
-    with open(json_file, "w") as metadataw:
-        json.dump(metadata, metadataw)
-
-
-def _edit_a_nifti(nifti_file):
-    img = nb.load(nifti_file)
-    new_img = nb.Nifti1Image(np.random.rand(*img.shape),
-                             affine=img.affine,
-                             header=img.header)
-    new_img.to_filename(nifti_file)
-
-
-def file_hash(file_name):
-    with open(str(file_name), 'rb') as fcheck:
-        data = fcheck.read()
-    return hashlib.md5(data).hexdigest()
-
-
-def _get_json_string(json_path):
-    with json_path.open("r") as f:
-        content = "".join(f.readlines())
-    return content
+    assert "session-" in og_content
+    assert "session-" in mod1_content
 
 
 def test_remove_fields(tmp_path):
@@ -856,9 +867,14 @@ def test_remove_fields(tmp_path):
     assert metadata_fields
 
     # Simulate some fields we might want to remove
-    fields_to_remove = ["DeviceSerialNumber", "AcquisitionTime",
-                        "InstitutionAddress", "InstitutionName",
-                        "StationName", "NotARealField"]
+    fields_to_remove = [
+        "DeviceSerialNumber",
+        "AcquisitionTime",
+        "InstitutionAddress",
+        "InstitutionName",
+        "StationName",
+        "NotARealField",
+    ]
 
     bod.remove_metadata_fields(fields_to_remove)
     new_fields = bod.get_all_metadata_fields()
@@ -866,8 +882,7 @@ def test_remove_fields(tmp_path):
 
 
 def test_datalad_integration(tmp_path):
-    """Test that datalad works for basic file modification operations.
-    """
+    """Test that datalad works for basic file modification operations."""
     data_root = get_data(tmp_path)
 
     # Test that an uninitialized CuBIDS raises exceptions
@@ -880,7 +895,7 @@ def test_datalad_integration(tmp_path):
 
     # initialize the datalad repository and try again
     uninit_cubids.init_datalad()
-    uninit_cubids.datalad_save('Test save')
+    uninit_cubids.datalad_save("Test save")
     assert uninit_cubids.is_datalad_clean()
 
     # Now, the datalad repository is initialized and saved.
@@ -892,10 +907,22 @@ def test_datalad_integration(tmp_path):
     assert complete_bod.is_datalad_clean()
 
     # Test clean and revert functionality
-    test_file = data_root / "complete" / "sub-03" / "ses-phdiff" \
-        / "func" / "sub-03_ses-phdiff_task-rest_bold.json"
-    test_binary = data_root / "complete" / "sub-03" / "ses-phdiff" \
-        / "func" / "sub-03_ses-phdiff_task-rest_bold.nii.gz"
+    test_file = (
+        data_root
+        / "complete"
+        / "sub-03"
+        / "ses-phdiff"
+        / "func"
+        / "sub-03_ses-phdiff_task-rest_bold.json"
+    )
+    test_binary = (
+        data_root
+        / "complete"
+        / "sub-03"
+        / "ses-phdiff"
+        / "func"
+        / "sub-03_ses-phdiff_task-rest_bold.nii.gz"
+    )
 
     # Try editing a locked file - it should fail
     with pytest.raises(Exception):
@@ -949,13 +976,8 @@ def test_datalad_integration(tmp_path):
     assert original_binary_content == restored_binary_content
 
 
-def _remove_a_json(json_file):
-
-    os.remove(json_file)
-
-
 def test_validator(tmp_path):
-
+    """Test validator."""
     data_root = get_data(tmp_path)
 
     # test the validator in valid dataset
@@ -963,20 +985,30 @@ def test_validator(tmp_path):
     ret = run_validator(call)
 
     assert ret.returncode == 0
-    parsed = parse_validator_output(ret.stdout.decode('UTF-8'))
-
+    parsed = parse_validator_output(ret.stdout.decode("UTF-8"))
 
     # change this assert
     # assert parsed.shape[1] < 1
 
-
     # bungle some data and test
 
     # get data
-    test_file = data_root / "complete" / "sub-03" / "ses-phdiff" \
-        / "func" / "sub-03_ses-phdiff_task-rest_bold.json"
-    test_binary = data_root / "complete" / "sub-03" / "ses-phdiff" \
-        / "func" / "sub-03_ses-phdiff_task-rest_bold.nii.gz"
+    test_file = (
+        data_root
+        / "complete"
+        / "sub-03"
+        / "ses-phdiff"
+        / "func"
+        / "sub-03_ses-phdiff_task-rest_bold.json"
+    )
+    test_binary = (
+        data_root
+        / "complete"
+        / "sub-03"
+        / "ses-phdiff"
+        / "func"
+        / "sub-03_ses-phdiff_task-rest_bold.nii.gz"
+    )
 
     # Edit the files
     _edit_a_nifti(test_binary)
@@ -987,27 +1019,26 @@ def test_validator(tmp_path):
 
     assert ret.returncode == 1
 
-    parsed = parse_validator_output(ret.stdout.decode('UTF-8'))
+    parsed = parse_validator_output(ret.stdout.decode("UTF-8"))
 
     assert type(parsed) == pd.core.frame.DataFrame
 
 
 def test_docker():
-    """Verify that docker is installed and the user has permission to
-    run docker images.
+    """Verify that docker is installed and the user has permission to run docker images.
+
     Returns
     -------
     -1  Docker can't be found
      0  Docker found, but user can't connect to daemon
      1  Test run OK
-     """
+    """
     try:
-
         return_status = 1
-        ret = subprocess.run(['docker', 'version'], stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+        ret = subprocess.run(["docker", "version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     except OSError as e:
         from errno import ENOENT
+
         if e.errno == ENOENT:
             print("Cannot find Docker engine!")
             return_status = 0
@@ -1019,7 +1050,7 @@ def test_docker():
 
 
 # def test_image(image='pennlinc/bond:latest'):
-#     """Check whether image is present on local system"""
+#     """Check whether image is present on local system."""
 #     ret = subprocess.run(['docker', 'images', '-q', image],
 #                          stdout=subprocess.PIPE)
 
diff --git a/cubids/tests/utils.py b/cubids/tests/utils.py
new file mode 100644
index 000000000..6f786e46f
--- /dev/null
+++ b/cubids/tests/utils.py
@@ -0,0 +1,93 @@
+"""Utility functions for CuBIDS' tests."""
+import hashlib
+import json
+import os
+import shutil
+from pathlib import Path
+
+import nibabel as nb
+import numpy as np
+import pandas as pd
+from pkg_resources import resource_filename as pkgrf
+
+TEST_DATA = pkgrf("cubids", "tests/data")
+
+
+def get_data(tmp_path):
+    """Copy testing data to a local directory."""
+    data_root = tmp_path / "testdata"
+    shutil.copytree(TEST_DATA, str(data_root))
+    return data_root
+
+
+def _remove_a_json(json_file):
+    os.remove(json_file)
+
+
+def _edit_a_nifti(nifti_file):
+    img = nb.load(nifti_file)
+    new_img = nb.Nifti1Image(np.random.rand(*img.shape), affine=img.affine, header=img.header)
+    new_img.to_filename(nifti_file)
+
+
+def file_hash(file_name):
+    """Create a hash from a file."""
+    with open(str(file_name), "rb") as fcheck:
+        data = fcheck.read()
+    return hashlib.md5(data).hexdigest()
+
+
+def _get_json_string(json_path):
+    with json_path.open("r") as f:
+        content = "".join(f.readlines())
+    return content
+
+
+def _add_deletion(summary_tsv):
+    df = pd.read_table(summary_tsv)
+    df.loc[3, "MergeInto"] = 0
+    df.to_csv(summary_tsv, sep="\t", index=False)
+    return df.loc[3, "KeyParamGroup"]
+
+
+# def _edit_tsv(summary_tsv):
+#     df = pd.read_table(summary_tsv)
+#     df['RenameKeyGroup'] = df['RenameKeyGroup'].apply(str)
+#     df['KeyGroup'] = df['KeyGroup'].apply(str)
+#     for row in range(len(df)):
+#         if df.loc[row, 'KeyGroup'] == \
+#             "acquisition-v4_datatype-fmap_fmap-magnitude1_suffix-magnitude1":
+#             df.at[row, 'RenameKeyGroup'] = \
+#                 "acquisition-v5_datatype-fmap_fmap-magnitude1_suffix-magnitude1"
+#     df.to_csv(summary_tsv)
+
+
+def _add_ext_files(img_path):
+    # add and save extension files in
+    dwi_exts = [".bval", ".bvec"]
+
+    # everyone gets a physio file
+    no_suffix = img_path.rpartition("_")[0]
+    physio_file = no_suffix + "_physio" + ".tsv.gz"
+    # save ext file in img_path's parent dir
+    Path(physio_file).touch()
+
+    if "/dwi/" in img_path:
+        # add bval and bvec
+        for ext in dwi_exts:
+            dwi_ext_file = img_path.replace(".nii.gz", "").replace(".nii", "") + ext
+            Path(dwi_ext_file).touch()
+    if "bold" in img_path:
+        no_suffix = img_path.rpartition("_")[0]
+        bold_ext_file = no_suffix + "_events" + ".tsv"
+        Path(bold_ext_file).touch()
+
+
+def _edit_a_json(json_file):
+    """Open a json file, write something to it and save it to the same name."""
+    with open(json_file, "r") as metadatar:
+        metadata = json.load(metadatar)
+
+    metadata["THIS_IS_A_TEST"] = True
+    with open(json_file, "w") as metadataw:
+        json.dump(metadata, metadataw)