diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index 4754b9b7763..f1c19f45c22 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -127,6 +127,7 @@ jobs: working-directory: ${{ needs.preamble.outputs.folder_platform }}/vcpkg run: | echo "vcpkg_sha_short=$(git rev-parse --short=8 HEAD)" >> $GITHUB_OUTPUT + echo "docker_label=hpccsystems/platform-build-${{ matrix.os }}:$(git rev-parse --short=8 HEAD)" >> $GITHUB_OUTPUT - name: Print vars run: | @@ -144,16 +145,18 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} - name: Create Build Image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: builder: ${{ steps.buildx.outputs.name }} file: ${{ needs.preamble.outputs.folder_platform }}/dockerfiles/vcpkg/${{ matrix.os }}.dockerfile context: ${{ needs.preamble.outputs.folder_platform }}/dockerfiles/vcpkg - load: true + push: true build-args: | VCPKG_REF=${{ steps.vars.outputs.vcpkg_sha_short }} tags: | - build-${{ matrix.os }}:latest + ${{ steps.vars.outputs.docker_label }} + cache-from: type=registry,ref=${{ steps.vars.outputs.docker_label }} + cache-to: type=inline - name: CMake Packages if: ${{ !matrix.container && !matrix.ln && !matrix.documentation }} @@ -164,12 +167,12 @@ jobs: for plugin in "${plugins[@]}"; do sudo rm -f ${{ needs.preamble.outputs.folder_build }}/CMakeCache.txt sudo rm -rf ${{ needs.preamble.outputs.folder_build }}/CMakeFiles - docker_label=build-${{ matrix.os }}:latest - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "${{ needs.preamble.outputs.gpg_import }} && cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -DSIGN_MODULES_PASSPHRASE=${{ secrets.SIGN_MODULES_PASSPHRASE }} -DSIGN_MODULES_KEYID=${{ secrets.SIGN_MODULES_KEYID }} -D$plugin=ON -DCONTAINERIZED=OFF -DCPACK_STRIP_FILES=OFF" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "${{ needs.preamble.outputs.gpg_import }} && cmake --build /hpcc-dev/build --parallel $(nproc) --target package" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "${{ needs.preamble.outputs.gpg_import }} && \ + cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -DSIGN_MODULES_PASSPHRASE=${{ secrets.SIGN_MODULES_PASSPHRASE }} -DSIGN_MODULES_KEYID=${{ secrets.SIGN_MODULES_KEYID }} -D$plugin=ON -DCONTAINERIZED=OFF -DCPACK_STRIP_FILES=OFF && \ + cmake --build /hpcc-dev/build --parallel $(nproc) --target package" # Disabled as not currently needed --- - # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -D$plugin=ON -DCONTAINERIZED=OFF -DCPACK_STRIP_FILES=ON" - # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" + # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -D$plugin=ON -DCONTAINERIZED=OFF -DCPACK_STRIP_FILES=ON" + # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" done - name: CMake Containerized Packages @@ -179,11 +182,12 @@ jobs: echo "${{ secrets.SIGNING_SECRET }}" > ${{ needs.preamble.outputs.folder_build }}/private.key sudo rm -f ${{ needs.preamble.outputs.folder_build }}/CMakeCache.txt sudo rm -rf ${{ needs.preamble.outputs.folder_build }}/CMakeFiles - docker_label=build-${{ matrix.os }}:latest - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "${{ needs.preamble.outputs.gpg_import }} && cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -DSIGN_MODULES_PASSPHRASE=${{ secrets.SIGN_MODULES_PASSPHRASE }} -DSIGN_MODULES_KEYID=${{ secrets.SIGN_MODULES_KEYID }} -DINCLUDE_PLUGINS=ON -DCONTAINERIZED=ON -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=OFF" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "${{ needs.preamble.outputs.gpg_import }} && cmake --build /hpcc-dev/build --parallel $(nproc) --target package" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "${{ needs.preamble.outputs.gpg_import }} && cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -DSIGN_MODULES_PASSPHRASE=${{ secrets.SIGN_MODULES_PASSPHRASE }} -DSIGN_MODULES_KEYID=${{ secrets.SIGN_MODULES_KEYID }} -DINCLUDE_PLUGINS=ON -DCONTAINERIZED=ON -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=ON" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "${{ needs.preamble.outputs.gpg_import }} && cmake --build /hpcc-dev/build --parallel $(nproc) --target package" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "${{ needs.preamble.outputs.gpg_import }} && \ + cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -DSIGN_MODULES_PASSPHRASE=${{ secrets.SIGN_MODULES_PASSPHRASE }} -DSIGN_MODULES_KEYID=${{ secrets.SIGN_MODULES_KEYID }} -DINCLUDE_PLUGINS=ON -DCONTAINERIZED=ON -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=OFF && \ + cmake --build /hpcc-dev/build --parallel $(nproc) --target package" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "${{ needs.preamble.outputs.gpg_import }} && \ + cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -DSIGN_MODULES_PASSPHRASE=${{ secrets.SIGN_MODULES_PASSPHRASE }} -DSIGN_MODULES_KEYID=${{ secrets.SIGN_MODULES_KEYID }} -DINCLUDE_PLUGINS=ON -DCONTAINERIZED=ON -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=ON && \ + cmake --build /hpcc-dev/build --parallel $(nproc) --target package" - name: CMake documentation if: ${{ matrix.documentation }} @@ -191,11 +195,11 @@ jobs: mkdir -p {${{needs.preamble.outputs.folder_build }},EN_US,PT_BR} sudo rm -f ${{ needs.preamble.outputs.folder_build }}/CMakeCache.txt sudo rm -rf ${{ needs.preamble.outputs.folder_build }}/CMakeFiles - docker_label=build-${{ matrix.os }}:latest - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build -DMAKE_DOCS_ONLY=ON -DUSE_NATIVE_LIBRARIES=ON -DDOCS_AUTO=ON -DDOC_LANGS=ALL" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake --build /hpcc-dev/build --parallel $(nproc) --target all" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cd /hpcc-dev/build/Release/docs/EN_US && zip ALL_HPCC_DOCS_EN_US-${{ needs.preamble.outputs.community_tag }}.zip *.pdf" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cd /hpcc-dev/build/Release/docs/PT_BR && zip ALL_HPCC_DOCS_PT_BR-${{ needs.preamble.outputs.community_tag }}.zip *.pdf" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "\ + cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build -DMAKE_DOCS_ONLY=ON -DUSE_NATIVE_LIBRARIES=ON -DDOCS_AUTO=ON -DDOC_LANGS=ALL && \ + cmake --build /hpcc-dev/build --parallel $(nproc) --target all" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "cd /hpcc-dev/build/Release/docs/EN_US && zip ALL_HPCC_DOCS_EN_US-${{ needs.preamble.outputs.community_tag }}.zip *.pdf" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "cd /hpcc-dev/build/Release/docs/PT_BR && zip ALL_HPCC_DOCS_PT_BR-${{ needs.preamble.outputs.community_tag }}.zip *.pdf" - name: Upload Assets uses: ncipollo/release-action@v1.12.0 @@ -213,11 +217,11 @@ jobs: echo "${{ secrets.SIGNING_SECRET }}" > ${{ needs.preamble.outputs.folder_build }}/private.key sudo rm -f ${{ needs.preamble.outputs.folder_build }}/CMakeCache.txt sudo rm -rf ${{ needs.preamble.outputs.folder_build }}/CMakeFiles - docker_label=build-${{ matrix.os }}:latest - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "${{ needs.preamble.outputs.gpg_import }} && cmake -S /hpcc-dev/LN -B /hpcc-dev/build -DHPCC_SOURCE_DIR=/hpcc-dev/HPCC-Platform ${{ needs.preamble.outputs.cmake_docker_config }} -DSIGN_MODULES_PASSPHRASE=${{ secrets.SIGN_MODULES_PASSPHRASE }} -DSIGN_MODULES_KEYID=${{ secrets.SIGN_MODULES_KEYID }} -DINCLUDE_PLUGINS=ON -DCONTAINERIZED=OFF -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=OFF" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "${{ needs.preamble.outputs.gpg_import }} && cmake --build /hpcc-dev/build --parallel $(nproc) --target package" - # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake -S /hpcc-dev/LN -B /hpcc-dev/build -DHPCC_SOURCE_DIR=/hpcc-dev/HPCC-Platform ${{ needs.preamble.outputs.cmake_docker_config }} -DINCLUDE_PLUGINS=ON -DCONTAINERIZED=OFF -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=ON" - # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "${{ needs.preamble.outputs.gpg_import }} && \ + cmake -S /hpcc-dev/LN -B /hpcc-dev/build -DHPCC_SOURCE_DIR=/hpcc-dev/HPCC-Platform ${{ needs.preamble.outputs.cmake_docker_config }} -DSIGN_MODULES_PASSPHRASE=${{ secrets.SIGN_MODULES_PASSPHRASE }} -DSIGN_MODULES_KEYID=${{ secrets.SIGN_MODULES_KEYID }} -DINCLUDE_PLUGINS=ON -DCONTAINERIZED=OFF -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=OFF && \ + cmake --build /hpcc-dev/build --parallel $(nproc) --target package" + # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "cmake -S /hpcc-dev/LN -B /hpcc-dev/build -DHPCC_SOURCE_DIR=/hpcc-dev/HPCC-Platform ${{ needs.preamble.outputs.cmake_docker_config }} -DINCLUDE_PLUGINS=ON -DCONTAINERIZED=OFF -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=ON" + # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" - name: Upload LN Assets if: ${{ matrix.ln }} diff --git a/.github/workflows/build-vcpkg.yml b/.github/workflows/build-vcpkg.yml index fd66e3b01b7..487a34673a6 100644 --- a/.github/workflows/build-vcpkg.yml +++ b/.github/workflows/build-vcpkg.yml @@ -123,6 +123,7 @@ jobs: working-directory: ${{ needs.preamble.outputs.folder_platform }}/vcpkg run: | echo "vcpkg_sha_short=$(git rev-parse --short=8 HEAD)" >> $GITHUB_OUTPUT + echo "docker_label=hpccsystems/platform-build-${{ matrix.os }}:$(git rev-parse --short=8 HEAD)" >> $GITHUB_OUTPUT - name: Print vars run: | @@ -136,7 +137,7 @@ jobs: - name: Create Build Image if: ${{ contains(matrix.event_name, github.event_name) && needs.preamble.outputs.platform }} - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: builder: ${{ steps.buildx.outputs.name }} file: ${{ needs.preamble.outputs.folder_platform }}/dockerfiles/vcpkg/${{ matrix.os }}.dockerfile @@ -145,7 +146,9 @@ jobs: build-args: | VCPKG_REF=${{ steps.vars.outputs.vcpkg_sha_short }} tags: | - build-${{ matrix.os }}:latest + ${{ steps.vars.outputs.docker_label }} + cache-from: type=registry,ref=${{ steps.vars.outputs.docker_label }} + cache-to: type=inline - name: CMake Packages if: ${{ !matrix.container && !matrix.ln && contains(matrix.event_name, github.event_name) && needs.preamble.outputs.platform }} @@ -160,9 +163,9 @@ jobs: for plugin in "${plugins[@]}"; do sudo rm -f ${{ needs.preamble.outputs.folder_build }}/CMakeCache.txt sudo rm -rf ${{ needs.preamble.outputs.folder_build }}/CMakeFiles - docker_label=build-${{ matrix.os }}:latest - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -D$plugin=ON -DCONTAINERIZED=OFF -DCPACK_STRIP_FILES=OFF" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "\ + cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -D$plugin=ON -DCONTAINERIZED=OFF -DCPACK_STRIP_FILES=OFF && \ + cmake --build /hpcc-dev/build --parallel $(nproc) --target package" # Disabled as not currently needed --- # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -D$plugin=ON -DCONTAINERIZED=OFF -DCPACK_STRIP_FILES=ON" # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" @@ -174,10 +177,9 @@ jobs: mkdir -p ${{ needs.preamble.outputs.folder_build }} sudo rm -f ${{ needs.preamble.outputs.folder_build }}/CMakeCache.txt sudo rm -rf ${{ needs.preamble.outputs.folder_build }}/CMakeFiles - docker_label=build-${{ matrix.os }}:latest - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -DINCLUDE_PLUGINS=${{ needs.preamble.outputs.include_plugins }} -DCONTAINERIZED=ON -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=OFF" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" - + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "\ + cmake -S /hpcc-dev/HPCC-Platform -B /hpcc-dev/build ${{ needs.preamble.outputs.cmake_docker_config }} -DINCLUDE_PLUGINS=${{ needs.preamble.outputs.include_plugins }} -DCONTAINERIZED=ON -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=OFF && \ + cmake --build /hpcc-dev/build --parallel $(nproc) --target package" - name: CMake LN Packages if: ${{ matrix.ln && contains(matrix.event_name, github.event_name) && needs.preamble.outputs.platform }} @@ -185,9 +187,9 @@ jobs: mkdir -p ${{ needs.preamble.outputs.folder_build }} sudo rm -f ${{ needs.preamble.outputs.folder_build }}/CMakeCache.txt sudo rm -rf ${{ needs.preamble.outputs.folder_build }}/CMakeFiles - docker_label=build-${{ matrix.os }}:latest - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake -S /hpcc-dev/LN -B /hpcc-dev/build -DHPCC_SOURCE_DIR=/hpcc-dev/HPCC-Platform ${{ needs.preamble.outputs.cmake_docker_config }} -DINCLUDE_PLUGINS=${{ needs.preamble.outputs.include_plugins }} -DCONTAINERIZED=OFF -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=OFF" - docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" + docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} ${{ steps.vars.outputs.docker_label }} "\ + cmake -S /hpcc-dev/LN -B /hpcc-dev/build -DHPCC_SOURCE_DIR=/hpcc-dev/HPCC-Platform ${{ needs.preamble.outputs.cmake_docker_config }} -DINCLUDE_PLUGINS=${{ needs.preamble.outputs.include_plugins }} -DCONTAINERIZED=OFF -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=OFF && \ + cmake --build /hpcc-dev/build --parallel $(nproc) --target package" # Disabled as not currently needed --- # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake -S /hpcc-dev/LN -B /hpcc-dev/build -DHPCC_SOURCE_DIR=/hpcc-dev/HPCC-Platform ${{ needs.preamble.outputs.cmake_docker_config }} -DINCLUDE_PLUGINS=${{ needs.preamble.outputs.include_plugins }} -DCONTAINERIZED=OFF -DSUPPRESS_REMBED=ON -DSUPPRESS_V8EMBED=ON -DSUPPRESS_SPARK=ON -DCPACK_STRIP_FILES=ON" # docker run --rm --mount ${{ needs.preamble.outputs.mount_platform }} --mount ${{ needs.preamble.outputs.mount_ln }} --mount ${{ needs.preamble.outputs.mount_build }} $docker_label "cmake --build /hpcc-dev/build --parallel $(nproc) --target package" diff --git a/cmake_modules/commonSetup.cmake b/cmake_modules/commonSetup.cmake index ee433fb7763..9790aad883a 100644 --- a/cmake_modules/commonSetup.cmake +++ b/cmake_modules/commonSetup.cmake @@ -135,10 +135,28 @@ IF ("${COMMONSETUP_DONE}" STREQUAL "") set(DEVEL OFF) endif() - option(PORTALURL "Set url to hpccsystems portal download page") + # The following options need to be set after the project() command + if (WIN32) + option(USE_AERON "Include the Aeron message protocol" OFF) + else() + option(USE_AERON "Include the Aeron message protocol" ON) + endif() + if (APPLE OR WIN32) + option(USE_NUMA "Configure use of numa" OFF) + else() + option(USE_NUMA "Configure use of numa" ON) + endif() + IF (WIN32) + option(USE_NATIVE_LIBRARIES "Search standard OS locations (otherwise in EXTERNALS_DIRECTORY) for 3rd party libraries" OFF) + ELSE() + option(USE_NATIVE_LIBRARIES "Search standard OS locations (otherwise in EXTERNALS_DIRECTORY) for 3rd party libraries" ON) + ENDIF() - if ( NOT PORTALURL ) - set( PORTALURL "http://hpccsystems.com/download" ) + # Generates code that is more efficient, but will cause problems if target platforms do not support it. + if (CMAKE_SIZEOF_VOID_P EQUAL 8) + option(USE_INLINE_TSC "Inline calls to read TSC (time stamp counter)" ON) + else() + option(USE_INLINE_TSC "Inline calls to read TSC (time stamp counter)" OFF) endif() if(UNIX AND SIGN_MODULES) diff --git a/cmake_modules/options.cmake b/cmake_modules/options.cmake index 5a22b076ced..62b3ff420d5 100644 --- a/cmake_modules/options.cmake +++ b/cmake_modules/options.cmake @@ -27,27 +27,11 @@ option(USE_OPENSSLV3 "Configure use of OpenSSL Version 3 or newer" ON) option(USE_ZLIB "Configure use of zlib" ON) option(USE_AZURE "Configure use of azure" ON) option(USE_GIT "Configure use of GIT (Hooks)" ON) -if (WIN32) - option(USE_AERON "Include the Aeron message protocol" OFF) -else() - option(USE_AERON "Include the Aeron message protocol" ON) -endif() option(USE_LIBARCHIVE "Configure use of libarchive" ON) option(USE_URIPARSER "Configure use of uriparser" OFF) -if (APPLE OR WIN32) - option(USE_NUMA "Configure use of numa" OFF) -else() - option(USE_NUMA "Configure use of numa" ON) -endif() option(USE_AWS "Configure use of aws" ON) option(STRIP_RELEASE_SYMBOLS "Strip symbols from release builds" OFF) -IF (WIN32) - option(USE_NATIVE_LIBRARIES "Search standard OS locations (otherwise in EXTERNALS_DIRECTORY) for 3rd party libraries" OFF) -ELSE() - option(USE_NATIVE_LIBRARIES "Search standard OS locations (otherwise in EXTERNALS_DIRECTORY) for 3rd party libraries" ON) -ENDIF() - option(USE_GIT_DESCRIBE "Use git describe to generate build tag" ON) option(CHECK_GIT_TAG "Require git tag to match the generated build tag" OFF) option(USE_XALAN "Configure use of xalan" OFF) @@ -70,19 +54,9 @@ option(USE_PYTHON2 "Enable python2 language support for platform build" OFF) option(USE_PYTHON3 "Enable python3 language support for platform build" ON) option(USE_OPTIONAL "Automatically disable requested features with missing dependencies" ON) option(JLIB_ONLY "Build JLIB for other projects such as Configurator, Ganglia Monitoring, etc" OFF) -# Generates code that is more efficient, but will cause problems if target platforms do not support it. -if (CMAKE_SIZEOF_VOID_P EQUAL 8) - option(USE_INLINE_TSC "Inline calls to read TSC (time stamp counter)" ON) -else() - option(USE_INLINE_TSC "Inline calls to read TSC (time stamp counter)" OFF) -endif() -if (APPLE OR WIN32) - option(USE_TBB "Enable Threading Building Block support" OFF) -else() - option(USE_TBB "Enable Threading Building Block support" OFF) - option(USE_TBBMALLOC "Enable Threading Building Block scalable allocator proxy support" OFF) - option(USE_TBBMALLOC_ROXIE "Enable Threading Building Block scalable allocator proxy support in Roxie" OFF) -endif() +option(USE_TBB "Enable Threading Building Block support" OFF) +option(USE_TBBMALLOC "Enable Threading Building Block scalable allocator proxy support" OFF) +option(USE_TBBMALLOC_ROXIE "Enable Threading Building Block scalable allocator proxy support in Roxie" OFF) option(LOGGING_SERVICE "Configure use of logging service" ON) option(WSSQL_SERVICE "Configure use of ws_sql service" ON) option(USE_DIGISIGN "Use digisign" ON) @@ -93,6 +67,10 @@ option(USE_ELASTICSTACK_CLIENT "Configure use of Elastic Stack client" ON) option(SKIP_ECLWATCH "Skip building ECL Watch" OFF) option(USE_ADDRESS_SANITIZER "Use address sanitizer to spot leaks" OFF) option(INSTALL_VCPKG_CATALOG "Install vcpkg-catalog.txt" ON) +option(PORTALURL "Set url to hpccsystems portal download page") +if ( NOT PORTALURL ) + set( PORTALURL "http://hpccsystems.com/download" ) +endif() if ("${CMAKE_BUILD_TYPE}" STREQUAL "") set ( CMAKE_BUILD_TYPE "Release" ) diff --git a/cmake_modules/plugins.cmake b/cmake_modules/plugins.cmake index 88a5cdbbc1b..7b12f5ae48c 100644 --- a/cmake_modules/plugins.cmake +++ b/cmake_modules/plugins.cmake @@ -124,11 +124,6 @@ if (USE_LIBXALAN) set(VCPKG_LIBXALAN "${VCPKG_INCLUDE}") endif() -set(VCPKG_NUMA "${VCPKG_SUPPRESS}") -if (USE_NUMA) - set(VCPKG_NUMA "${VCPKG_INCLUDE}") -endif() - set(VCPKG_OPENLDAP "${VCPKG_SUPPRESS}") if (USE_OPENLDAP) set(VCPKG_OPENLDAP "${VCPKG_INCLUDE}") diff --git a/common/remote/hooks/git/CMakeLists.txt b/common/remote/hooks/git/CMakeLists.txt index e39b1623426..17a36f0d27d 100644 --- a/common/remote/hooks/git/CMakeLists.txt +++ b/common/remote/hooks/git/CMakeLists.txt @@ -44,5 +44,5 @@ install ( TARGETS gitfile DESTINATION filehooks CALC_DEPS) target_link_libraries ( gitfile jlib - unofficial::git2::git2 + unofficial::git2::libgit2package ) diff --git a/common/remote/hooks/libarchive/archive.cpp b/common/remote/hooks/libarchive/archive.cpp index a04c4447442..da811b75588 100644 --- a/common/remote/hooks/libarchive/archive.cpp +++ b/common/remote/hooks/libarchive/archive.cpp @@ -64,12 +64,16 @@ static const char *splitName(const char *fileName) static void splitArchivedFileName(const char *fullName, StringAttr &container, StringAttr &option, StringAttr &relPath) { const char *tail = splitName(fullName); - assertex(tail); - size_t containerLen = tail-fullName; - if (fullName[containerLen-1]==PATHSEPCHAR) - containerLen--; - container.set(fullName, containerLen); - if (*tail=='{') + if (tail) + { + size_t containerLen = tail-fullName; + if (fullName[containerLen-1]==PATHSEPCHAR) + containerLen--; + container.set(fullName, containerLen); + } + else + container.set(fullName); + if (tail && *tail=='{') { tail++; const char *end = strchr(tail, '}'); @@ -406,8 +410,8 @@ class ArchiveFile : implements IFile, public CInterface virtual bool setCompression(bool set) { UNIMPLEMENTED; } virtual offset_t compressedSize() { UNIMPLEMENTED; } virtual unsigned getCRC() { UNIMPLEMENTED; } - virtual void setCreateFlags(unsigned short cflags) { UNIMPLEMENTED; } - virtual void setShareMode(IFSHmode shmode) { UNIMPLEMENTED; } + virtual void setCreateFlags(unsigned short cflags) { } // MORE: Should save and apply to any file that was created + virtual void setShareMode(IFSHmode shmode) { } // MORE: Should save and use when the archive io is opened virtual bool createDirectory() { UNIMPLEMENTED; } virtual IDirectoryDifferenceIterator *monitorDirectory( IDirectoryIterator *prev=NULL, // in (NULL means use current as baseline) @@ -517,7 +521,7 @@ class ArchiveDirectoryIterator : implements IDirectoryIterator, public CInterfac if (includeDirs || !isDir) { const char *filename = archive_entry_pathname(entry); - if (memcmp(filename, relDir.get(), relDir.length())==0) + if (memcmp_iflen(filename, relDir.get(), relDir.length())==0) { StringBuffer tail(filename + relDir.length()); if (tail.length()) diff --git a/common/thorhelper/thorcommon.hpp b/common/thorhelper/thorcommon.hpp index fd2959f3a3a..2378dc4ae8b 100644 --- a/common/thorhelper/thorcommon.hpp +++ b/common/thorhelper/thorcommon.hpp @@ -278,10 +278,10 @@ class ActivityTimer ActivityTimer(ActivityTimeAccumulator &_accumulator, const bool _enabled) : accumulator(_accumulator), enabled(_enabled), isFirstRow(false) { - if (enabled) + if (likely(enabled)) { startCycles = get_cycles_now(); - if (!accumulator.firstRow) + if (unlikely(!accumulator.firstRow)) { isFirstRow = true; accumulator.startCycles = startCycles; @@ -294,13 +294,13 @@ class ActivityTimer ~ActivityTimer() { - if (enabled) + if (likely(enabled)) { cycle_t nowCycles = get_cycles_now(); accumulator.endCycles = nowCycles; cycle_t elapsedCycles = nowCycles - startCycles; accumulator.totalCycles += elapsedCycles; - if (isFirstRow) + if (unlikely(isFirstRow)) accumulator.firstExitCycles = nowCycles; } } @@ -316,7 +316,7 @@ class SimpleActivityTimer inline SimpleActivityTimer(cycle_t &_accumulator, const bool _enabled) : accumulator(_accumulator), enabled(_enabled) { - if (enabled) + if (likely(enabled)) startCycles = get_cycles_now(); else startCycles = 0; @@ -324,7 +324,7 @@ class SimpleActivityTimer inline ~SimpleActivityTimer() { - if (enabled) + if (likely(enabled)) { cycle_t nowCycles = get_cycles_now(); cycle_t elapsedCycles = nowCycles - startCycles; diff --git a/common/thorhelper/thorfile.cpp b/common/thorhelper/thorfile.cpp index 4d7f8cc6764..1e31d971aa9 100644 --- a/common/thorhelper/thorfile.cpp +++ b/common/thorhelper/thorfile.cpp @@ -109,7 +109,7 @@ IHThorDiskReadArg * createWorkUnitReadArg(const char * filename, IHThorWorkunitR #define MAX_FILE_READ_FAIL_COUNT 3 -IKeyIndex *openKeyFile(IDistributedFilePart & keyFile) +IKeyIndex *openKeyFile(IDistributedFilePart & keyFile, size32_t blockedIndexIOSize) { unsigned failcount = 0; unsigned numCopies = keyFile.numCopies(); @@ -128,7 +128,13 @@ IKeyIndex *openKeyFile(IDistributedFilePart & keyFile) rfn.getPath(remotePath); unsigned crc = 0; keyFile.getCrc(crc); - return createKeyIndex(remotePath.str(), crc, false); + Owned iFile = createIFile(remotePath.str()); + Owned iFileIO = iFile->open(IFOread); + if (nullptr == iFileIO) + throw makeStringExceptionV(0, "Failed to open index file %s", remotePath.str()); + if (blockedIndexIOSize) + iFileIO.setown(createBlockedIO(iFileIO.getClear(), blockedIndexIOSize)); + return createKeyIndex(remotePath.str(), crc, *iFileIO, (unsigned) -1, false); } } catch (IException *E) @@ -242,6 +248,8 @@ static void gatherDerivedIndexInformation(DerivedIndexInformation & result, IDis result.sizeDiskLeaves = result.numLeafNodes * nodeSize; result.sizeDiskBlobs = result.numBlobNodes * nodeSize; result.sizeDiskBranches = result.numBranchNodes * nodeSize; + result.sizeMemoryBranches = attrs.getPropInt64("@branchMemorySize"); + result.sizeMemoryLeaves = attrs.getPropInt64("@leafMemorySize"); } else { @@ -283,11 +291,12 @@ static void gatherDerivedIndexInformation(DerivedIndexInformation & result, IDis result.sizeOriginalData = attrs.getPropInt64("@uncompressedSize"); //The following will depend on the compression format - e.g. if compressed searching is implemented - result.sizeMemoryBranches = result.sizeOriginalBranches; + if (result.sizeMemoryBranches == 0) + result.sizeMemoryBranches = result.sizeOriginalBranches; //NOTE: sizeOriginalData now includes the blob sizes that are removed before passing to the builder // if the original blob size is recorded then use it, otherwise estimate it - if (result.sizeOriginalData) + if (result.sizeOriginalData && (result.sizeMemoryLeaves == 0)) { offset_t originalBlobSize = attrs.getPropInt64("@originalBlobSize"); if (result.numBlobNodes == 0) diff --git a/common/thorhelper/thorfile.hpp b/common/thorhelper/thorfile.hpp index 28fb5be9827..4f74a4b510d 100644 --- a/common/thorhelper/thorfile.hpp +++ b/common/thorhelper/thorfile.hpp @@ -55,7 +55,7 @@ interface IKeyIndex; THORHELPER_API bool checkIndexMetaInformation(IDistributedFile * file, bool force); THORHELPER_API bool calculateDerivedIndexInformation(DerivedIndexInformation & result, IDistributedFile * file, bool force); THORHELPER_API void mergeDerivedInformation(DerivedIndexInformation & result, const DerivedIndexInformation & other); -THORHELPER_API IKeyIndex *openKeyFile(IDistributedFilePart & keyFile); +THORHELPER_API IKeyIndex *openKeyFile(IDistributedFilePart & keyFile, size32_t blockedIndexFileIOSize=0); #endif diff --git a/common/workunit/workunit.cpp b/common/workunit/workunit.cpp index ff46e79c392..b86fc1e70ac 100644 --- a/common/workunit/workunit.cpp +++ b/common/workunit/workunit.cpp @@ -2696,6 +2696,45 @@ cost_type aggregateDiskAccessCost(const IConstWorkUnit * wu, const char *scope) return totalCost; } +void gatherSpillSize(const IConstWorkUnit * wu, const char *scope, stat_type & peakSizeSpill) +{ + WuScopeFilter filter; + if (!isEmptyString(scope)) + filter.addScope(scope); + else + { + filter.addScope(""); + filter.addSource("global"); + } + filter.setIncludeNesting(1); + filter.addOutputStatistic(StSizeGraphSpill); + filter.addRequiredStat(StSizeGraphSpill); + filter.finishedFilter(); + Owned it = &wu->getScopeIterator(filter); + peakSizeSpill = 0; + for (it->first(); it->isValid(); ) + { + stat_type value = 0; + if (it->getStat(StSizeGraphSpill, value)) + { + if (value>peakSizeSpill) + peakSizeSpill = value; + it->nextSibling(); + } + else + { + it->next(); + } + } +} + +void updateSpillSize(IWorkUnit * wu, const char * scope, StatisticScopeType scopeType) +{ + stat_type peakSizeSpill = 0; + gatherSpillSize(wu, scope, peakSizeSpill); + if (peakSizeSpill) + wu->setStatistic(queryStatisticsComponentType(), queryStatisticsComponentName(), scopeType, scope, StSizeGraphSpill, nullptr, peakSizeSpill, 1, 0, StatsMergeMax); +} //--------------------------------------------------------------------------------------------------------------------- @@ -14139,7 +14178,7 @@ void executeThorGraph(const char * graphName, IConstWorkUnit &workunit, const IP { CCycleTimer elapsedTimer; - bool multiJobLinger = config.getPropBool("@multiJobLinger"); + bool multiJobLinger = config.getPropBool("@multiJobLinger", true); // NB: executeGraphOnLingeringThor looks for existing Thor instance that has been used for the same job, // and communicates with it directly diff --git a/common/workunit/workunit.hpp b/common/workunit/workunit.hpp index adb79dd614e..73f4921bef0 100644 --- a/common/workunit/workunit.hpp +++ b/common/workunit/workunit.hpp @@ -1722,6 +1722,7 @@ extern WORKUNIT_API void updateWorkunitTimings(IWorkUnit * wu, StatisticScopeTyp extern WORKUNIT_API void aggregateStatistic(StatsAggregation & result, IConstWorkUnit * wu, const WuScopeFilter & filter, StatisticKind search); extern WORKUNIT_API cost_type aggregateCost(const IConstWorkUnit * wu, const char *scope=nullptr, bool excludehThor=false); extern WORKUNIT_API cost_type aggregateDiskAccessCost(const IConstWorkUnit * wu, const char *scope); +extern WORKUNIT_API void updateSpillSize(IWorkUnit * wu, const char * scope, StatisticScopeType scopeType); extern WORKUNIT_API const char *getTargetClusterComponentName(const char *clustname, const char *processType, StringBuffer &name); extern WORKUNIT_API void descheduleWorkunit(char const * wuid); #if 0 diff --git a/dali/base/dautils.cpp b/dali/base/dautils.cpp index bc7b4744930..78c3463bf10 100644 --- a/dali/base/dautils.cpp +++ b/dali/base/dautils.cpp @@ -103,23 +103,22 @@ void getPlaneHosts(StringArray &hosts, IPropertyTree *plane) } } -constexpr const char * lz_plane_path = "storage/planes[@category='lz']"; - IPropertyTreeIterator * getDropZonePlanesIterator(const char * name) { - StringBuffer xpath(lz_plane_path); - if (!isEmptyString(name)) - xpath.appendf("[@name='%s']", name); - return getGlobalConfigSP()->getElements(xpath); + return getPlanesIterator("lz", name); } IPropertyTree * getDropZonePlane(const char * name) { if (isEmptyString(name)) throw makeStringException(-1, "Drop zone name required"); - StringBuffer xpath(lz_plane_path); - xpath.appendf("[@name='%s']", name); - return getGlobalConfigSP()->getPropTree(xpath); + Owned iter = getDropZonePlanesIterator(name); + return iter->first() ? &iter->get() : nullptr; +} + +bool isPathInPlane(IPropertyTree *plane, const char *path) +{ + return isEmptyString(path) || startsWith(path, plane->queryProp("@prefix")); } bool validateDropZone(IPropertyTree * plane, const char * path, const char * host, bool ipMatch) @@ -133,7 +132,7 @@ bool validateDropZone(IPropertyTree * plane, const char * path, const char * hos return false; //Match path - return isEmptyString(path) || startsWith(path, plane->queryProp("@prefix")); + return isPathInPlane(plane, path); } IPropertyTree * findPlane(const char *category, const char * path, const char * host, bool ipMatch, bool mustMatch) diff --git a/dali/base/dautils.hpp b/dali/base/dautils.hpp index fbe09fe6a61..871299d1c86 100644 --- a/dali/base/dautils.hpp +++ b/dali/base/dautils.hpp @@ -548,6 +548,7 @@ extern da_decl bool validateDropZone(IPropertyTree *plane, const char *path, con extern da_decl bool isHostInPlane(IPropertyTree *plane, const char *host, bool ipMatch); extern da_decl bool getPlaneHost(StringBuffer &host, IPropertyTree *plane, unsigned which); extern da_decl void getPlaneHosts(StringArray &hosts, IPropertyTree *plane); +extern da_decl bool isPathInPlane(IPropertyTree *plane, const char *path); extern da_decl void setPageCacheTimeoutMilliSeconds(unsigned timeoutSeconds); extern da_decl void setMaxPageCacheItems(unsigned _maxPageCacheItems); extern da_decl IRemoteConnection* connectXPathOrFile(const char* path, bool safe, StringBuffer& xpath); diff --git a/dali/ft/fttransform.cpp b/dali/ft/fttransform.cpp index 4fc47411e5a..84f64c1b54f 100644 --- a/dali/ft/fttransform.cpp +++ b/dali/ft/fttransform.cpp @@ -865,7 +865,7 @@ bool TransferServer::pull() decrypt(key,encryptKey); compressor.setown(createAESCompressor256(key.length(),key.str())); } - outio.setown(createCompressedFileWriter(outio, false, 0, true, compressor, COMPRESS_METHOD_LZW)); + outio.setown(createCompressedFileWriter(outio, false, 0, true, compressor, COMPRESS_METHOD_LZ4)); } LOG(MCdebugProgress, unknownJob, "Start pulling to file: %s", localFilename.str()); @@ -995,7 +995,7 @@ bool TransferServer::push() decrypt(key,encryptKey); compressor.setown(createAESCompressor256(key.length(),key.str())); } - outio.setown(createCompressedFileWriter(outio, false, 0, true, compressor, COMPRESS_METHOD_LZW)); + outio.setown(createCompressedFileWriter(outio, false, 0, true, compressor, COMPRESS_METHOD_LZ4)); } out.setown(createIOStream(outio)); if (!compressOutput) diff --git a/devdoc/CodeSubmissions.md b/devdoc/CodeSubmissions.md index da821305f51..ad71ae9f019 100644 --- a/devdoc/CodeSubmissions.md +++ b/devdoc/CodeSubmissions.md @@ -37,40 +37,7 @@ Contributors should use the github reviewers section on the PR to request review Reviewers should check for PRs that are ready for their review via github's webpage (filter "review-requested:\") or via the github CLI (e.g. gh pr status). Contributors should similarly ensure they stay up to date with any comments on requests for change on their submissions. -## Target Version +## Target branch +The [Version support](VersionSupport.md) document contains details of the different versions that are supported, and which version should be targetted for different kinds of changes. Occasionally earlier branches will be chosen, (e.g. security fixes to even older versions) but they should always be carefully discussed (and documented). -We normally maintain 4 versions of the system - which means that each new major or minor release will typically be supported for a year. Once a new major or minor version goes gold it becomes the current version, and should not have any changes that change the behavior of queries. PRs should target the oldest appropriate branch, and once they are merged they will be automatically up-merged into later versions. Which branch should changes target? The following gives some examples and illustrates the version numbers assuming 8.12.x is the latest version. - -master: -- New features. -- Bug fixes that will change the semantics of existing queries or processes. -- Refactoring. -- Performance improvements (unless simple and safe) - -current(8.12.x): -- Bug fixes that only change behavior where it previously crashes or had undefined behavior (If well defined but wrong need to have very strong justification to change.) -- Fixes for race conditions (the behavior was previously indeterminate so less of an argument against it changing) -- Data corruption fixes - on a case by case basis if they change existing query results. -- Missing functionality that prevents features from working. -- Changes for tech-preview work that only effect those who are using it. -- Regressions. -- Improvements to logging and error messages (possibly in "previous" if simple and added to help diagnose problems). -- Occasional simple refactoring that makes up-merging simpler.. -- Changes to improve backward compatibility of new features. (E.g. adding an ignored syntax to the compiler.) -- Performance improvements - if simple and safe - -previous(8.10.x): -- Simple bug fixes that do not change behavior -- Simple changes for missing functionality -- Regressions with simple fixes (but care is needed if it caused a change in behavior) -- Serious regressions -- Complex security fixes - -security(8.8.x) -- Simple security fixes -- Complex security fixes if sufficiently serious - -deprecated(8.6.x) -- Serious security fixes - -Occasionally earlier branches will be chosen, (e.g. security fixes to even older versions) but they should always be carefully discussed (and documented). +Changes will always be upmerged into the next point release for all the more recent major and minor versions (and master). diff --git a/devdoc/VersionSupport.md b/devdoc/VersionSupport.md new file mode 100644 index 00000000000..4f5491c3f47 --- /dev/null +++ b/devdoc/VersionSupport.md @@ -0,0 +1,79 @@ +# Current versions + +| name | version | +| -------- | ------- | +| early | 9.2.0 | +| current | 9.0.x | +| previous | 8.12.x | +| critical | 8.10.x | +| security | 8.8.x | + +## Supported versions + +We release a new version of the platform every 3 months. If there are major changes in functionality, or significant backward compatibility issues then it will be tagged as a new major version, otherwise a new minor version. We normally maintain 4 versions of the system, which means that each new release will typically be supported for a year. Once a new major or minor version has been tagged gold it should not have any changes that change the behavior of queries. + +Which versions should changes be applied to? The following gives some examples of the types of changes and which version they would be most relevant to target. + +"master": +- New features. +- Bug fixes that will change the semantics of existing queries or processes. +- Refactoring. +- Performance improvements (unless simple and safe) + +"current": +- Bug fixes that only change behavior where it previously crashes or had undefined behavior (If well defined but wrong need to have very strong justification to change.) +- Fixes for race conditions (the behavior was previously indeterminate so less of an argument against it changing) +- Data corruption fixes - on a case by case basis if they change existing query results. +- Missing functionality that prevents features from working. +- Changes for tech-preview work that only effect those who are using it. +- Regressions. +- Improvements to logging and error messages (possibly in "previous" if simple and added to help diagnose problems). +- Occasional simple refactoring that makes up-merging simpler.. +- Changes to improve backward compatibility of new features. (E.g. adding an ignored syntax to the compiler.) +- Performance improvements - if simple and safe + +"previous": +- Simple bug fixes that do not change behavior +- Simple changes for missing functionality +- Regressions with simple fixes (but care is needed if it caused a change in behavior) +- Serious regressions +- Complex security fixes + +"critical" fixes only: +- Simple security fixes +- Complex security fixes if sufficiently serious + +"security" fixes only: +- Serious security fixes + +early: +- The first few point release of a new major or minor version may be less stable than later point releases. The security fix is still supported until any teething problems have been solved with the new version. + +Occasionally earlier branches will be chosen, (e.g. security fixes to even older versions) but they should always be carefully discussed (and documented). + +## Patches and images + +We aim to produce new point releases once a week. The point releases will contain + +a) Any changes to the code base for that branch. +b) Any security fixes for libraries that are project dependencies. We will upgrade to the latest point release for the library that fixes the security issue. +c) For the cloud any security fixes in the base image or the packages installed in that image. + +If there are no changes in any of those areas for a particular version then a new point release will not be created. + +If you are deploying a system to the cloud you have one of two options + +a) Use the images that are automatically built and published as part of the build pipeline. This image is currently based on ubuntu 22.04 and contains the majority of packages users will require. + +b) Use your own hardened base image, and install the containerized package that we publish into that image. + +## Package versions. + +We currently generate the following versions of the package and images: + +- debug +- release with symbols +- release without symbols. + +It is recommended that you deploy the "release with symbols" version to all bare-metal and non-production cloud deployments. The extra symbols allow the system to generate stack backtraces which make it much easier to diagnose problems if they occur. +The "release without symbols" version is recommended for Kubernetes production deployments. Deploying a system without symbols reduces the size of the images. This reduces the time it takes Kubernetes to copy the image before provisioning a new node. diff --git a/ecl/eclagent/eclagent.cpp b/ecl/eclagent/eclagent.cpp index 6d513f88983..0b0610c3adb 100644 --- a/ecl/eclagent/eclagent.cpp +++ b/ecl/eclagent/eclagent.cpp @@ -1985,7 +1985,7 @@ void EclAgent::doProcess() const cost_type diskAccessCost = aggregateDiskAccessCost(w, nullptr); if (diskAccessCost) w->setStatistic(queryStatisticsComponentType(), queryStatisticsComponentName(), SSTglobal, "", StCostFileAccess, NULL, diskAccessCost, 1, 0, StatsMergeReplace); - + updateSpillSize(w, nullptr, SSTglobal); addTimings(w); switch (w->getState()) @@ -2534,6 +2534,7 @@ void EclAgentWorkflowMachine::noteTiming(unsigned wfid, timestamp_type startTime const cost_type diskAccessCost = aggregateDiskAccessCost(wu, scope); if (diskAccessCost) wu->setStatistic(queryStatisticsComponentType(), queryStatisticsComponentName(), SSTworkflow, scope, StCostFileAccess, NULL, diskAccessCost, 1, 0, StatsMergeReplace); + updateSpillSize(wu, scope, SSTworkflow); } void EclAgentWorkflowMachine::doExecutePersistItem(IRuntimeWorkflowItem & item) diff --git a/ecl/eclcc/eclcc.cpp b/ecl/eclcc/eclcc.cpp index 7dfa9fe88d1..f5eaea7e5d2 100644 --- a/ecl/eclcc/eclcc.cpp +++ b/ecl/eclcc/eclcc.cpp @@ -1464,6 +1464,9 @@ void EclCC::processSingleQuery(const EclRepositoryManager & localRepositoryManag instance.stats.parseTime = (unsigned)nanoToMilli(parseTimeNs); updateWorkunitStat(instance.wu, SSTcompilestage, "compile:parse", StTimeElapsed, NULL, parseTimeNs); + stat_type sourceDownloadTime = localRepositoryManager.getStatistic(StTimeElapsed); + if (sourceDownloadTime) + updateWorkunitStat(instance.wu, SSTcompilestage, "compile:parse:download", StTimeElapsed, NULL, sourceDownloadTime); if (optExtraStats) { diff --git a/ecl/hql/hqlrepository.cpp b/ecl/hql/hqlrepository.cpp index 664c550bc96..5a118205ede 100644 --- a/ecl/hql/hqlrepository.cpp +++ b/ecl/hql/hqlrepository.cpp @@ -639,6 +639,16 @@ void EclRepositoryManager::gatherPackagesUsed(StringArray & used) const } } +unsigned __int64 EclRepositoryManager::getStatistic(StatisticKind kind) const +{ + switch (kind) + { + case StTimeElapsed: + return cycle_to_nanosec(gitDownloadCycles); + } + return 0; +} + void EclRepositoryManager::processArchive(IPropertyTree * archiveTree) { IArrayOf savedSources; // also includes -D options @@ -793,6 +803,7 @@ IEclSourceCollection * EclRepositoryManager::resolveGitCollection(const char * r } bool ok = false; + CCycleTimer gitDownloadTimer; if (alreadyExists) { if (options.updateRepos) @@ -819,6 +830,7 @@ IEclSourceCollection * EclRepositoryManager::resolveGitCollection(const char * r ok = true; } } + gitDownloadCycles += gitDownloadTimer.elapsedCycles(); if (!ok) throw makeStringExceptionV(99, "Cannot locate the source code for dependency '%s'. --fetchrepos not enabled", defaultUrl); diff --git a/ecl/hql/hqlrepository.hpp b/ecl/hql/hqlrepository.hpp index bca8a4daa2c..89c849332d0 100644 --- a/ecl/hql/hqlrepository.hpp +++ b/ecl/hql/hqlrepository.hpp @@ -53,6 +53,7 @@ class HQL_API EclRepositoryManager void gatherPackagesUsed(StringArray & used) const; void inherit(const EclRepositoryManager & other); void kill(); + unsigned __int64 getStatistic(StatisticKind kind) const; void processArchive(IPropertyTree * archiveTree); IEclPackage * queryDependentRepository(IIdAtom * name, const char * defaultUrl, IEclSourceCollection * overrideSources); @@ -86,6 +87,7 @@ class HQL_API EclRepositoryManager std::vector dependencies; IArrayOf sharedSources; // plugins, std library, bundles IArrayOf allSources; // also includes -D options + cycle_t gitDownloadCycles = 0; //Include all options in a nested struct to make it easy to ensure they are cloned struct { diff --git a/ecl/hql/hqlutil.cpp b/ecl/hql/hqlutil.cpp index 67d217a200d..4440bb15330 100644 --- a/ecl/hql/hqlutil.cpp +++ b/ecl/hql/hqlutil.cpp @@ -345,8 +345,15 @@ IHqlExpression * convertIndexPhysical2LogicalValue(IHqlExpression * cur, IHqlExp if (cur->hasAttribute(blobAtom)) { if (cur->isDataset()) - return createDataset(no_id2blob, LINK(physicalSelect), getSerializedForm(cur->queryRecord(), diskAtom)); - else if (cur->isDatarow()) + { + IHqlExpression * record = cur->queryRecord(); + OwnedHqlExpr serializedRecord = getSerializedForm(record, diskAtom); + OwnedHqlExpr extracted = createDataset(no_id2blob, LINK(physicalSelect), LINK(serializedRecord)); + if (record != serializedRecord) + return ensureDeserialized(extracted, cur->queryType(), diskAtom); + return extracted.getClear(); + } + if (cur->isDatarow()) return createRow(no_id2blob, LINK(physicalSelect), getSerializedForm(cur->queryRecord(), diskAtom)); else return createValue(no_id2blob, cur->getType(), LINK(physicalSelect)); diff --git a/ecl/hthor/hthor.cpp b/ecl/hthor/hthor.cpp index dc656bcde9a..9a7f4d34591 100644 --- a/ecl/hthor/hthor.cpp +++ b/ecl/hthor/hthor.cpp @@ -575,7 +575,7 @@ void CHThorDiskWriteActivity::open() blockcompressed = true; } if(blockcompressed) - io.setown(createCompressedFileWriter(file, groupedMeta->getFixedSize(), extend, true, ecomp, COMPRESS_METHOD_LZW)); + io.setown(createCompressedFileWriter(file, groupedMeta->getFixedSize(), extend, true, ecomp, COMPRESS_METHOD_LZ4)); else io.setown(file->open(extend ? IFOwrite : IFOcreate)); if(!io) @@ -1161,6 +1161,8 @@ void CHThorIndexWriteActivity::execute() unsigned __int64 numBlobNodes = 0; unsigned __int64 numBranchNodes = 0; offset_t originalBlobSize = 0; + offset_t branchMemorySize = 0; + offset_t leafMemorySize = 0; unsigned nodeSize = 0; file.setown(createIFile(filename.get())); @@ -1260,6 +1262,8 @@ void CHThorIndexWriteActivity::execute() numBranchNodes = builder->getNumBranchNodes(); numBlobNodes = builder->getNumBlobNodes(); originalBlobSize = bc.queryTotalSize(); + branchMemorySize = builder->getBranchMemorySize(); + leafMemorySize = builder->getLeafMemorySize(); totalLeafNodes += numLeafNodes; totalBranchNodes += numBranchNodes; @@ -1346,6 +1350,10 @@ void CHThorIndexWriteActivity::execute() properties.setPropInt64("@numBlobNodes", numBlobNodes); if (numBlobNodes) properties.setPropInt64("@originalBlobSize", originalBlobSize); + if (branchMemorySize) + properties.setPropInt64("@branchMemorySize", branchMemorySize); + if (leafMemorySize) + properties.setPropInt64("@leafMemorySize", leafMemorySize); size32_t keyedSize = helper.getKeyedSize(); if (keyedSize == (size32_t)-1) diff --git a/ecl/hthor/hthorkey.cpp b/ecl/hthor/hthorkey.cpp index 82e1ede5d56..9f5b46155ad 100644 --- a/ecl/hthor/hthorkey.cpp +++ b/ecl/hthor/hthorkey.cpp @@ -594,7 +594,15 @@ void CHThorIndexReadActivityBase::killPart() bool CHThorIndexReadActivityBase::setCurrentPart(unsigned whichPart) { - keyIndex.setown(openKeyFile(df->queryPart(whichPart))); + IDistributedFilePart &part = df->queryPart(whichPart); + size32_t blockedSize = 0; + if (!helper.hasSegmentMonitors()) // unfiltered + { + StringBuffer planeName; + df->getClusterName(part.copyClusterNum(0), planeName); + blockedSize = getBlockedFileIOSize(planeName); + } + keyIndex.setown(openKeyFile(part, blockedSize)); if(df->numParts() == 1) verifyIndex(keyIndex); initPart(); diff --git a/esp/CMakeLists.txt b/esp/CMakeLists.txt index c56ba6223e2..968aaa05e4e 100644 --- a/esp/CMakeLists.txt +++ b/esp/CMakeLists.txt @@ -30,6 +30,7 @@ HPCC_ADD_SUBDIRECTORY (test "PLATFORM") HPCC_ADD_SUBDIRECTORY (tools "CLIENTTOOLS") HPCC_ADD_SUBDIRECTORY (xslt) HPCC_ADD_SUBDIRECTORY (esdllib) +HPCC_ADD_SUBDIRECTORY (esdlscriptlib) HPCC_ADD_SUBDIRECTORY (applications) HPCC_ADD_SUBDIRECTORY (espcommon) if (LOGGING_SERVICE) diff --git a/esp/bindings/http/platform/httpbinding.cpp b/esp/bindings/http/platform/httpbinding.cpp index 82c2503881e..14de4699692 100644 --- a/esp/bindings/http/platform/httpbinding.cpp +++ b/esp/bindings/http/platform/httpbinding.cpp @@ -47,6 +47,7 @@ #include "workunit.hpp" #include "cumulativetimer.hpp" #include +#include "esdl_def_helper.hpp" #define FILE_UPLOAD "FileUploadAccess" #define DEFAULT_HTTP_PORT 80 @@ -95,7 +96,7 @@ static IXmlSchema* createXmlSchema(const char* schema) XmlSchemaCreator creator = (XmlSchemaCreator)GetSharedProcedure(xmllib, "createXmlSchemaFromString"); if (!creator) throw MakeStringException(-1,"load XmlSchema factory failed: createXmlSchemaFromString()"); - + return creator(schema); } @@ -114,6 +115,17 @@ static void setBndCfgServiceType(IPropertyTree* tree, const char* procName, IPro bndCfg->setProp("@serviceType", srvType); } + +static void generateEsdlNamespace(IEspContext &context, CHttpRequest* request, const char *serv, const char *method, StringBuffer &ns, double version) { + ns.append("urn:hpccsystems:ws:"); + if (serv && *serv) + ns.appendLower(strlen(serv), serv); + + if (method && *method) + ns.append(":").append(method); + ns.toLowerCase(); +} + class CEspCorsAllowedOrigin : public CInterfaceOf { StringBuffer hostPort; @@ -288,7 +300,7 @@ IEspCorsHelper *createEspCorsHelper(IPropertyTree *cors) EspHttpBinding::EspHttpBinding(IPropertyTree* tree, const char *bindname, const char *procname) { Owned proc_cfg = getProcessConfig(tree, procname); - m_viewConfig = proc_cfg ? proc_cfg->getPropBool("@httpConfigAccess") : false; + m_viewConfig = proc_cfg ? proc_cfg->getPropBool("@httpConfigAccess") : false; m_formOptions = proc_cfg ? proc_cfg->getPropBool("@formOptionsAccess") : false; m_includeSoapTest = true; m_includeJsonTest = true; @@ -346,7 +358,7 @@ EspHttpBinding::EspHttpBinding(IPropertyTree* tree, const char *bindname, const m_subservices.setown(createPTreeFromXMLFile(ssfile, ipt_caseInsensitive)); } } - + m_realm.set((realm) ? realm : "EspServices"); } } @@ -627,7 +639,7 @@ void EspHttpBinding::setUnrestrictedSSTypes() bool EspHttpBinding::isUnrestrictedSSType(sub_service ss) const { auto search = unrestrictedSSTypes.find(ss); - return (search != unrestrictedSSTypes.end()); + return (search != unrestrictedSSTypes.end()); } //Check whether the url is valid or not for redirect after authentication. @@ -1145,19 +1157,19 @@ int EspHttpBinding::onGet(CHttpRequest* request, CHttpResponse* response) LogLevel level = getEspLogLevel(&context); if (level >= LogNormal) DBGLOG("EspHttpBinding::onGet"); - + response->setVersion(HTTP_VERSION); response->addHeader("Expires", "0"); response->setStatus(HTTP_STATUS_OK); - + sub_service sstype = sub_serv_unknown; StringBuffer pathEx; StringBuffer serviceName; StringBuffer methodName; StringBuffer paramStr; - + request->getEspPathInfo(sstype, &pathEx, &serviceName, &methodName, false); // adjust version if necessary @@ -1382,7 +1394,7 @@ static void filterXmlBySchema(StringBuffer& in, StringBuffer& schema, const char if (type) filterXmlBySchema(tree,type,name,out); - else + else { const char* value = tree->queryProp(NULL); UWARNLOG("Unknown xml tag ignored: <%s>%s", name, value?value:"", name); @@ -1410,7 +1422,7 @@ void EspHttpBinding::getXMLMessageTag(IEspContext& ctx, bool isRequest, const ch void EspHttpBinding::getSoapMessage(StringBuffer& soapmsg, IEspContext& ctx, CHttpRequest* request, const char *serv, const char *method) { StringBuffer reqName(serv); - reqName.append("Request"); + reqName.append("Request"); Owned msg = new CRpcMessage(reqName.str()); msg->setContext(&ctx); @@ -1423,7 +1435,7 @@ void EspHttpBinding::getSoapMessage(StringBuffer& soapmsg, IEspContext& ctx, CHt getSchema(schema,ctx,request,serv,method,false); getXMLMessageTag(ctx, true, method, tag); filterXmlBySchema(req,schema,tag.str(),filtered); - + StringBuffer ns; soapmsg.appendf( "" @@ -1530,7 +1542,7 @@ static void filterXmlBySchema(StringBuffer& in, StringBuffer& schema, StringBuff if (type) filterXmlBySchema(tree,type,name,out,indent); - else + else { const char* value = tree->queryProp(NULL); DBGLOG("Unknown xml tag ignored: <%s>%s", name, value?value:"", name); @@ -1552,7 +1564,7 @@ void EspHttpBinding::getSoapMessage(StringBuffer& soapmsg, IEspContext& ctx, CHt getSchema(schema,ctx,request,serv,method,false); //DBGLOG("Schema: %s", schema.str()); filterXmlBySchema(req,schema,filtered,2); - + soapmsg.appendf( "\n" "transform(page); + xform->transform(page); response->setContent(page); response->setContentType("text/html; charset=UTF-8"); @@ -1755,24 +1767,24 @@ int EspHttpBinding::onGetIframe(IEspContext &context, CHttpRequest* request, CHt if(title.length() > 0) content.appendf("%s", title.str()); content.append(""); - + content.append(""); content.appendf("", title.str()); - - //content.appendf("", path, request->queryParamStr()); + + //content.appendf("", path, request->queryParamStr()); StringBuffer inner; request->getParameter("inner", inner); StringBuffer plainText; request->getParameter("PlainText", plainText); if (plainText.length() > 0) inner.appendf("&PlainText=%s", plainText.str()); - + ESPLOG(LogNormal,"Inner: %s", inner.str()); ESPLOG(LogNormal,"Param: %s", request->queryParamStr()); content.appendf("", inner.str()); content.append(""); content.append(""); - + response->setContent(content.length(), content.str()); response->setContentType("text/html"); response->send(); @@ -1823,7 +1835,7 @@ int EspHttpBinding::onGetVersion(IEspContext &context, CHttpRequest* request, CH StringBuffer srvQName; qualifyServiceName(context, service, NULL, srvQName, NULL); verxml.appendf("%s%.3f", srvQName.str(), m_wsdlVer); - + response->setContent(verxml.str()); response->setContentType(HTTP_TYPE_APPLICATION_XML_UTF8); response->setStatus(HTTP_STATUS_OK); @@ -1831,17 +1843,85 @@ int EspHttpBinding::onGetVersion(IEspContext &context, CHttpRequest* request, CH return 0; } +void getServiceSchema(const char *serviceQName, const char *methodQName, double version, const char *nstr, + const StringBuffer &xmlFilename, Owned ¶ms, EsdlXslTypeId EsdlXslType, + IProperties *opts, StringBuffer &schema) +{ + Owned esdlDef = createEsdlDefinition(nullptr, nullptr); + Owned defHelper = createEsdlDefinitionHelper(); + + std::string xmlFilePath(getCFD()); + xmlFilePath.append("esdl_files").append(PATHSEPSTR).append(xmlFilename.str()); + esdlDef->addDefinitionsFromFile(xmlFilePath.c_str()); + unsigned optFlags{DEPFLAG_COLLAPSE|DEPFLAG_ARRAYOF}; + Owned structs = esdlDef->getDependencies(serviceQName, methodQName, ";", version, opts, optFlags ); + + StringBuffer xlstFile(getCFD()); + xlstFile.append("xslt").append(PATHSEPSTR).append("esp_service_xml2xsd.xslt"); + + defHelper->loadTransform(xlstFile, params, EsdlXslType); + defHelper->toWSDL(*structs, schema, EsdlXslType, version, opts, nstr, optFlags); +} + + int EspHttpBinding::onGetXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method) { - return getWsdlOrXsd(context,request,response,service,method,false); + return getServiceWsdlOrXsd(context, request, response, service, method, false); } int EspHttpBinding::onGetWsdl(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method) { - return getWsdlOrXsd(context,request,response,service,method,true); + return getServiceWsdlOrXsd(context, request, response, service, method, true); } -bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequest* req, const char *service, const char *method, bool standalone) +int EspHttpBinding::getServiceWsdlOrXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method, bool isWsdl) +{ + StringBuffer serviceQName; + StringBuffer methodQName; + + if (!qualifyServiceName(context, service, method, serviceQName, &methodQName)) + return onGetNotFound(context, request, response, service); + + Owned params; + params.set(createProperties()); + + double version = getVersion(context); + params->setProp("version", StringBuffer("'").appendf("%g", version).append("'")); + + StringBuffer nstr; + generateEsdlNamespace(context, request, serviceQName.str(), methodQName.str(), nstr, version); + params->setProp("tnsParam", StringBuffer("'").append(nstr).append("'").str()); + + if (isWsdl) + { + params->setProp( "create_wsdl", "true()" ); + StringBuffer location(m_wsdlAddress.str()); + if (request->queryParameters()->hasProp("wsdl_destination_path")) + location.append(request->queryParameters()->queryProp("wsdl_destination_path")); + else + location.append('/').append(serviceQName.str()).appendf("?ver_=%g", version); + params->setProp("location", StringBuffer("'").append(location).append("'").str()); + } + + StringBuffer xmlFilename; + if (!getXmlFilename(xmlFilename)) + { + throw MakeStringException(-1, "Unable to get service XML filename"); + } + + StringBuffer schema; + getServiceSchema(serviceQName.str(), methodQName.str(), version, nstr.str(), xmlFilename, + params, isWsdl ? EsdlXslToWsdl : EsdlXslToXsd, context.queryRequestParameters(), schema); + + response->setContent(schema.length(), schema.str()); + response->setContentType(HTTP_TYPE_APPLICATION_XML_UTF8); + response->setStatus(HTTP_STATUS_OK); + response->send(); + return 0; +} + + +bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequest* req, const char *service, const char *method, bool standalone) { StringBuffer serviceQName; StringBuffer methodQName; @@ -1870,10 +1950,10 @@ bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequ ForEach(*nsiter) { IPropertyTree &ns = nsiter->query(); - if (ns.hasProp("@import")) + if (ns.hasProp("@import")) schema.appendf("", ns.queryProp("@ns"), ns.queryProp("@location")); } - + schema.append( "" @@ -1895,7 +1975,7 @@ bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequ if (ctx.queryOptions()&ESPCTX_WSDL_EXT) { - schema.append( + schema.append( "" "" "" @@ -1919,91 +1999,13 @@ bool EspHttpBinding::getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequ ); } - bool mda=(req->queryParameters()->getPropInt("mda")!=0); + bool mda = (req->queryParameters()->getPropInt("mda") != 0); getXsdDefinition(ctx, req, schema, sqName, mqName, mda); - schema.append("\n"); schema.append(""); - return true; } -int EspHttpBinding::getWsdlOrXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method, bool isWsdl) -{ - bool mda=(request->queryParameters()->getPropInt("mda")!=0); - try - { - StringBuffer serviceQName; - StringBuffer methodQName; - - if (!qualifyServiceName(context, service, method, serviceQName, &methodQName)) - { - return onGetNotFound(context, request, response, service); - } - else - { - const char *sqName = serviceQName.str(); - const char *mqName = methodQName.str(); - StringBuffer ns; - generateNamespace(context, request, serviceQName.str(), methodQName.str(), ns); - - StringBuffer content(""); - if (context.queryRequestParameters()->hasProp("display")) - content.append(""); - else if (isWsdl && context.queryRequestParameters()->hasProp("wsdlviewer")) - content.append(""); - if (isWsdl) - { - content.appendf("", ns.str(), ns.str()); - content.append(""); - } - - getSchema(content,context,request,service,method,!isWsdl); - - if (isWsdl) - { - content.append(""); - - getWsdlMessages(context, request, content, sqName, mqName, mda); - getWsdlPorts(context, request, content, sqName, mqName, mda); - getWsdlBindings(context, request, content, sqName, mqName, mda); - - StringBuffer location(m_wsdlAddress.str()); - if (request->queryParameters()->hasProp("wsdl_destination_path")) - location.append(request->queryParameters()->queryProp("wsdl_destination_path")); - else - location.append('/').append(sqName).appendf("?ver_=%g", context.getClientVersion()); - - if (request->queryParameters()->hasProp("encode_results")) - { - const char *encval = request->queryParameters()->queryProp("encode_results"); - location.append("&").appendf("encode_=%s", (encval && *encval) ? encval : "1"); - } - - content.appendf("", sqName); - content.appendf("", sqName, sqName); - content.appendf("", location.str()); - content.append(""); - content.append(""); - content.append(""); - } - - response->setContent(content.length(), content.str()); - response->setContentType(HTTP_TYPE_APPLICATION_XML_UTF8); - response->setStatus(HTTP_STATUS_OK); - } - } - catch (IException *e) - { - return onGetException(context, request, response, *e); - } - - response->send(); - return 0; -} - static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, const char* tag, const char* ns=NULL) { assertex(type!=NULL); @@ -2014,7 +2016,7 @@ static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, { if (typeName && std::find(parent.begin(),parent.end(),typeName) != parent.end()) return; // recursive - + out.appendf("<%s", tag); if (ns) out.append(' ').append(ns); @@ -2028,9 +2030,9 @@ static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, out.append('>'); if (typeName) parent.push_back(typeName); - + int flds = type->getFieldCount(); - + switch (type->getSubType()) { case SubType_Complex_SimpleContent: @@ -2045,7 +2047,7 @@ static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, } if (typeName) - parent.pop_back(); + parent.pop_back(); out.appendf("",tag); } else if (type->isArray()) @@ -2063,7 +2065,7 @@ static void genSampleXml(StringStack& parent, IXmlType* type, StringBuffer& out, parent.push_back(typeName); genSampleXml(parent,itemType,item,itemName); if (typeName) - parent.pop_back(); + parent.pop_back(); // gen two items out.appendf("<%s>%s%s", tag,item.str(),item.str(),tag); @@ -2346,7 +2348,7 @@ int EspHttpBinding::onFinishUpload(IEspContext &ctx, CHttpRequest* request, CHtt int EspHttpBinding::getWsdlMessages(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda) { bool allMethods = (method==NULL || !*method); - + MethodInfoArray methods; getQualifiedNames(context, methods); int count=methods.ordinality(); @@ -2416,7 +2418,7 @@ int EspHttpBinding::getWsdlBindings(IEspContext &context, CHttpRequest *request, content.appendf("", serviceName.str(), serviceName.str()); content.append(""); - + bool allMethods = (method==NULL || !*method); MethodInfoArray methods; getQualifiedNames(context, methods); @@ -2436,7 +2438,7 @@ int EspHttpBinding::getWsdlBindings(IEspContext &context, CHttpRequest *request, content.append(""); content.append(""); content.append(""); - + content.append(""); if (!allMethods) // no need to continue break; @@ -2560,8 +2562,8 @@ int EspHttpBinding::onGetIndex(IEspContext &context, CHttpRequest* request, CHt list->appendContent(new CHtmlLink(method.m_label.str(), wsLink.str())); } } - - page.appendContent(new CHtmlText("
For a formal definition, please review the ")); + + page.appendContent(new CHtmlText("
For a formal definition, please review the ")); urlParams.append(urlParams.length()>0 ? "&wsdl" : "?wsdl"); wsLink.clear().appendf("%s", urlParams.str()); @@ -2601,7 +2603,7 @@ void EspHttpBinding::escapeSingleQuote(StringBuffer& src, StringBuffer& escaped) { if (*p == '\'') escaped.append("'"); - else + else escaped.append(*p); } } @@ -2653,7 +2655,7 @@ int EspHttpBinding::onGetXForm(IEspContext &context, CHttpRequest* request, CHtt if (!getUrlParams(context.queryRequestParameters(),params)) params.appendf("%cver_=%g",(params.length()>0) ? '&' : '?', context.getClientVersion()); xform->setStringParameter("queryParams", params.str()); - + StringBuffer tmp,escaped; getMethodHelp(context, serviceQName, methodQName, tmp); escapeSingleQuote(tmp,escaped); @@ -2693,7 +2695,7 @@ int EspHttpBinding::onGetXForm(IEspContext &context, CHttpRequest* request, CHtt break; } } - xform->transform(page); + xform->transform(page); response->setContentType("text/html"); response->setContent(page.str()); } @@ -2759,7 +2761,7 @@ int EspHttpBinding::onGetForm(IEspContext &context, CHttpRequest* request, CHttp "" "" "

"); - + page.appendf("> %s", methodQName.str()); page.append("

" "" @@ -2810,25 +2812,25 @@ int EspHttpBinding::onGetForm(IEspContext &context, CHttpRequest* request, CHttp response->setContent(page.str()); response->setContentType("text/html"); } - + response->send(); return 0; } - + int EspHttpBinding::formatHtmlResultSet(IEspContext &context, const char *serv, const char *method, const char *resultsXml, StringBuffer &html) { Owned ptree = createPTreeFromXMLString(resultsXml); - + Owned exceptions = ptree->getElements("//Exception"); ForEach(*exceptions.get()) { IPropertyTree &xcpt = exceptions->query(); - html.appendf("
Exception:
Reported by: %s
Message: %s
", + html.appendf("
Exception:
Reported by: %s
Message: %s
", xcpt.queryProp("Source"), xcpt.queryProp("Message")); } - + Owned datasets = ptree->getElements("//Dataset"); ForEach(*datasets.get()) { @@ -2842,14 +2844,14 @@ int EspHttpBinding::formatHtmlResultSet(IEspContext &context, const char *serv, if (row1) { html.append(" "); - + Owned columns = row1->getElements("*"); ForEach(*columns.get()) { const char *title = columns->query().queryName(); html.appendf("%s", (title!=NULL) ? title : " "); - } - + } + html.append(""); } @@ -2861,21 +2863,21 @@ int EspHttpBinding::formatHtmlResultSet(IEspContext &context, const char *serv, { IPropertyTree &row = datarows->query(); Owned columns = row.getElements("*"); - + html.appendf("%d", count++); ForEach(*columns.get()) { const char *value = columns->query().queryProp(NULL); html.appendf("%s", (value!=NULL) ? value : " "); - } - + } + html.append(""); } } - + html.append(""); } - + return 0; } @@ -2928,7 +2930,7 @@ int EspHttpBinding::formatResultsPage(IEspContext &context, const char *serv, co "" "" "

"); - + page.appendf("> %s Results", methodQName.str()); page.append("

" "" @@ -2967,7 +2969,7 @@ bool EspHttpBinding::setContentFromFile(IEspContext &context, CHttpResponse &res return false; } -void EspHttpBinding::onBeforeSendResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, +void EspHttpBinding::onBeforeSendResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, const char *serviceName, const char* methodName) { IProperties* params = request->queryParameters(); @@ -2977,7 +2979,7 @@ void EspHttpBinding::onBeforeSendResponse(IEspContext& context, CHttpRequest* re sortResponse(context, request, content, serviceName, methodName); } -void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, +void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, const char *service, const char* method) { StringBuffer serviceQName; @@ -2985,15 +2987,15 @@ void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* reques if (!qualifyServiceName(context, service, method, serviceQName, &methodQName)) return; - + StringBuffer xml,xsd; - + // name space StringBuffer ns; generateNamespace(context, request, serviceQName.str(), methodQName.str(), ns); // XML - Owned tree; + Owned tree; try { tree.setown(createPTreeFromXMLString(content.length(), content.toByteArray())); // format it for better error message @@ -3001,14 +3003,14 @@ void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* reques //Hack: add default name space to XML const char* end = strstr(xml, ""); if (end) end = strchr(end+2, '>'); if (!end) throw MakeStringException(-1,"Invalid response XML in processing instruction"); - } + } else { end = strchr(xml, '>'); @@ -3033,7 +3035,7 @@ void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* reques // schema getSchema(xsd,context,request,serviceQName,methodQName,true); - + // validation if (getEspLogLevel()>LogMax) DBGLOG("[VALIDATE] xml: %s\nxsd: %s\nns: %s",xml.str(), xsd.str(), ns.str()); @@ -3068,7 +3070,7 @@ void EspHttpBinding::validateResponse(IEspContext& context, CHttpRequest* reques content.setBuffer(len, temp.detach(), true); } -void EspHttpBinding::sortResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, +void EspHttpBinding::sortResponse(IEspContext& context, CHttpRequest* request, MemoryBuffer& content, const char *serviceName, const char* methodName) { ESPLOG(LogNormal,"Sorting Response XML..."); @@ -3088,7 +3090,7 @@ void EspHttpBinding::sortResponse(IEspContext& context, CHttpRequest* request, M if (getEspLogLevel()>LogNormal) DBGLOG("XML sorted: %s", result.str()); unsigned len = result.length(); - content.setBuffer(len, result.detach(), true); + content.setBuffer(len, result.detach(), true); } catch (IException* e) { StringBuffer msg; IERRLOG("Unexpected error: parsing XML: %s", e->errorMessage(msg).str()); diff --git a/esp/bindings/http/platform/httpbinding.hpp b/esp/bindings/http/platform/httpbinding.hpp index 93821268e5b..e36ba07097f 100644 --- a/esp/bindings/http/platform/httpbinding.hpp +++ b/esp/bindings/http/platform/httpbinding.hpp @@ -111,6 +111,7 @@ interface IEspWsdlSections // virtual MethodInfoArray & queryQualifiedNames(IEspContext& ctx)=0; virtual int getQualifiedNames(IEspContext& ctx, MethodInfoArray & methods)=0; virtual int getXsdDefinition(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda)=0; + virtual int getXmlFilename(StringBuffer &filename)=0; virtual int getWsdlMessages(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda)=0; virtual int getWsdlPorts(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda)=0; virtual int getWsdlBindings(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda)=0; @@ -344,6 +345,7 @@ class esp_http_decl EspHttpBinding : // MethodInfoArray &queryQualifiedNames(IEspContext& ctx) { m_methods.popAll(); getQualifiedNames(ctx,m_methods); return m_methods;}; int getXsdDefinition(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda){return 0;}; + int getXmlFilename(StringBuffer &filename) {return 0;}; int getWsdlMessages(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda); int getWsdlPorts(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda); int getWsdlBindings(IEspContext &context, CHttpRequest *request, StringBuffer &content, const char *service, const char *method, bool mda); @@ -427,9 +429,21 @@ class esp_http_decl EspHttpBinding : static void escapeSingleQuote(StringBuffer& src, StringBuffer& escaped); + virtual bool getDefaultClientVersion(double &ver) {ver=0; return true;} + + double getVersion(IEspContext &context) + { + double version = context.getClientVersion(); + if (version == 0.0) + { + getDefaultClientVersion(version); + } + return version; + } + protected: virtual bool basicAuth(IEspContext* ctx); - int getWsdlOrXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method, bool isWsdl); + int getServiceWsdlOrXsd(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method, bool isWsdl); virtual bool getSchema(StringBuffer& schema, IEspContext &ctx, CHttpRequest* req, const char *service, const char *method,bool standalone); virtual void appendSchemaNamespaces(IPropertyTree *namespaces, IEspContext &ctx, CHttpRequest* req, const char *service, const char *method){} void generateSampleXml(bool isRequest, IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *serv, const char *method); diff --git a/esp/esdllib/CMakeLists.txt b/esp/esdllib/CMakeLists.txt index 72dde89ae1e..e79da490aa3 100644 --- a/esp/esdllib/CMakeLists.txt +++ b/esp/esdllib/CMakeLists.txt @@ -27,6 +27,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/system/include ${HPCC_SOURCE_DIR}/esp/esdllib ${HPCC_SOURCE_DIR}/esp/services/common + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/system/jlib ${HPCC_SOURCE_DIR}/system/security/shared ${HPCC_SOURCE_DIR}/rtl/eclrtl @@ -43,23 +44,11 @@ set ( SRCS esdl_def.cpp esdl_def_helper.cpp esdl_transformer2.cpp - esdl_script.cpp params2xml.cpp - ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp/fxpp/FragmentedXmlPullParser.cpp; ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp/xpp/xpputils.cpp ${HPCC_SOURCE_DIR}/esp/services/common/wsexcept.cpp ) -if (USE_LIBXSLT) - list (APPEND SRCS - esdl_xpath_extensions_libxml.cpp - ) -else() - list (APPEND SRCS - esdl_xpath_extensions_unsupported.cpp - ) -endif() - HPCC_ADD_LIBRARY( esdllib SHARED ${SRCS} ${HEADERS} ) @@ -71,8 +60,7 @@ add_dependencies ( esdllib jlib espscm) target_link_libraries ( esdllib jlib xmllib - thorhelper - esphttp + dllserver ) IF (USE_LIBXSLT) diff --git a/esp/esdlscriptlib/CMakeLists.txt b/esp/esdlscriptlib/CMakeLists.txt new file mode 100644 index 00000000000..15e67acd136 --- /dev/null +++ b/esp/esdlscriptlib/CMakeLists.txt @@ -0,0 +1,72 @@ +################################################################################ +# HPCC SYSTEMS software Copyright (C) 2013 HPCC Systems®. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +################################################################################ +# Component: esdllib + +project( esdllib ) + +include_directories ( + ${HPCC_SOURCE_DIR}/system/xmllib + ${HPCC_SOURCE_DIR}/esp/bindings + ${HPCC_SOURCE_DIR}/esp/bindings/http/client + ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp + ${HPCC_SOURCE_DIR}/esp/platform + ${HPCC_SOURCE_DIR}/system/include + ${HPCC_SOURCE_DIR}/esp/services/common + ${HPCC_SOURCE_DIR}/system/jlib + ${HPCC_SOURCE_DIR}/system/security/shared + ${HPCC_SOURCE_DIR}/rtl/eclrtl + ${HPCC_SOURCE_DIR}/rtl/include #IXMLWriter + ${HPCC_SOURCE_DIR}/common/dllserver #loading plugins + ${HPCC_SOURCE_DIR}/system/masking/include +) + +ADD_DEFINITIONS ( -D_USRDLL -DESDLSCRIPTLIB_EXPORTS ) + +set ( SRCS + esdl_script.cpp + ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp/fxpp/FragmentedXmlPullParser.cpp; + ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp/xpp/xpputils.cpp +) + +if (USE_LIBXSLT) + list (APPEND SRCS + esdl_xpath_extensions_libxml.cpp + ) +else() + list (APPEND SRCS + esdl_xpath_extensions_unsupported.cpp + ) +endif() + +HPCC_ADD_LIBRARY( esdlscriptlib SHARED ${SRCS} + ${HEADERS} +) + +install ( TARGETS esdlscriptlib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ) + +add_dependencies ( esdlscriptlib jlib espscm) + +target_link_libraries ( esdlscriptlib + jlib + dllserver + esphttp +) + +IF (USE_LIBXSLT) + include_directories ( + ${LIBXML2_INCLUDE_DIR} + ) +ENDIF() diff --git a/esp/esdllib/esdl_script.cpp b/esp/esdlscriptlib/esdl_script.cpp similarity index 99% rename from esp/esdllib/esdl_script.cpp rename to esp/esdlscriptlib/esdl_script.cpp index dd3d7bf5f0d..b1a3db77ac8 100644 --- a/esp/esdllib/esdl_script.cpp +++ b/esp/esdlscriptlib/esdl_script.cpp @@ -3133,7 +3133,7 @@ class CEsdlTransformOperationSetTraceOptions : public CEsdlTransformOperationWit const char* locked = stag.getValue("locked"); if (!isEmptyString(locked)) m_locked.setown(compileXpath(locked)); - + if (!m_enabled && !m_locked) recordError(ESDL_SCRIPT_MissingOperationAttr, "missing all options"); } @@ -3911,11 +3911,11 @@ class CEsdlTransformMethodMap : public CInterfaceOf } }; -esdl_decl IEsdlScriptContext* createEsdlScriptContext(IEspContext* espCtx, IEsdlFunctionRegister* functionRegister, IDataMaskingEngine* engine) +esdlscript_decl IEsdlScriptContext* createEsdlScriptContext(IEspContext* espCtx, IEsdlFunctionRegister* functionRegister, IDataMaskingEngine* engine) { return new CEsdlScriptContext(espCtx, functionRegister, engine); } -esdl_decl IEsdlTransformMethodMap *createEsdlTransformMethodMap() +esdlscript_decl IEsdlTransformMethodMap *createEsdlTransformMethodMap() { return new CEsdlTransformMethodMap(); } diff --git a/esp/esdllib/esdl_script.hpp b/esp/esdlscriptlib/esdl_script.hpp similarity index 90% rename from esp/esdllib/esdl_script.hpp rename to esp/esdlscriptlib/esdl_script.hpp index 4566341881d..9a935a9db1a 100644 --- a/esp/esdllib/esdl_script.hpp +++ b/esp/esdlscriptlib/esdl_script.hpp @@ -18,10 +18,10 @@ #ifndef ESDL_SCRIPT_HPP_ #define ESDL_SCRIPT_HPP_ -#ifdef ESDLLIB_EXPORTS - #define esdl_decl DECL_EXPORT +#ifdef ESDLSCRIPTLIB_EXPORTS + #define esdlscript_decl DECL_EXPORT #else - #define esdl_decl + #define esdlscript_decl #endif #include "jlib.hpp" @@ -30,7 +30,7 @@ #include "jlog.hpp" #include "esp.hpp" -#include "esdl_def.hpp" +//#include "esdl_def.hpp" #include "datamaskingengine.hpp" #include "tracer.h" @@ -163,7 +163,7 @@ interface IEsdlScriptContext : extends ISectionalXmlDocModel * The absence of a sectional document model in the parameter list implies the returned instance * is responsible for creating its own model. */ -extern "C" esdl_decl IEsdlScriptContext* createEsdlScriptContext(IEspContext* espCtx, IEsdlFunctionRegister* functionRegister, IDataMaskingEngine* engine); +extern "C" esdlscript_decl IEsdlScriptContext* createEsdlScriptContext(IEspContext* espCtx, IEsdlFunctionRegister* functionRegister, IDataMaskingEngine* engine); interface IEsdlCustomTransform : extends IInterface { @@ -229,11 +229,11 @@ interface IEsdlTransformMethodMap : extends IInterface virtual void bindFunctionCalls() = 0; }; -esdl_decl IEsdlTransformMethodMap *createEsdlTransformMethodMap(); +esdlscript_decl IEsdlTransformMethodMap *createEsdlTransformMethodMap(); -esdl_decl IEsdlCustomTransform *createEsdlCustomTransform(const char *scriptXml, const char *ns_prefix); +esdlscript_decl IEsdlCustomTransform *createEsdlCustomTransform(const char *scriptXml, const char *ns_prefix); -esdl_decl void processServiceAndMethodTransforms(IEsdlScriptContext * scriptCtx, std::initializer_list const &transforms, const char *srcSection, const char *tgtSection); -esdl_decl void registerEsdlXPathExtensions(IXpathContext *xpathCtx, IEsdlScriptContext *scriptCtx, const StringArray &prefixes); +esdlscript_decl void processServiceAndMethodTransforms(IEsdlScriptContext * scriptCtx, std::initializer_list const &transforms, const char *srcSection, const char *tgtSection); +esdlscript_decl void registerEsdlXPathExtensions(IXpathContext *xpathCtx, IEsdlScriptContext *scriptCtx, const StringArray &prefixes); #endif /* ESDL_SCRIPT_HPP_ */ diff --git a/esp/esdllib/esdl_xpath_extensions_libxml.cpp b/esp/esdlscriptlib/esdl_xpath_extensions_libxml.cpp similarity index 100% rename from esp/esdllib/esdl_xpath_extensions_libxml.cpp rename to esp/esdlscriptlib/esdl_xpath_extensions_libxml.cpp diff --git a/esp/esdllib/esdl_xpath_extensions_unsupported.cpp b/esp/esdlscriptlib/esdl_xpath_extensions_unsupported.cpp similarity index 100% rename from esp/esdllib/esdl_xpath_extensions_unsupported.cpp rename to esp/esdlscriptlib/esdl_xpath_extensions_unsupported.cpp diff --git a/esp/logging/logginglib/CMakeLists.txt b/esp/logging/logginglib/CMakeLists.txt index 1beb7a573f7..23e3727bbd7 100644 --- a/esp/logging/logginglib/CMakeLists.txt +++ b/esp/logging/logginglib/CMakeLists.txt @@ -32,6 +32,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/Platform #CSoapRequestBinding ${HPCC_SOURCE_DIR}/esp/clients #edwin.h in generated/ws_loggingservice.esp ${HPCC_SOURCE_DIR}/esp/esdllib + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/common/thorhelper ) @@ -58,5 +59,5 @@ target_link_libraries ( logginglib jlib xmllib esphttp - esdllib + esdlscriptlib ) diff --git a/esp/protocols/http/CMakeLists.txt b/esp/protocols/http/CMakeLists.txt index b2d39e4e075..db16c06339a 100644 --- a/esp/protocols/http/CMakeLists.txt +++ b/esp/protocols/http/CMakeLists.txt @@ -64,10 +64,11 @@ include_directories( ./../../../system/security/shared ./../../../system/security/LdapSecurity ./../../../system/security/zcrypt - ./../../../system/mp + ./../../../system/mp ./../../../dali/base ./../../../common/workunit ${HPCC_SOURCE_DIR}/common/thorhelper + ${HPCC_SOURCE_DIR}/esp/esdllib ) add_definitions(-DESPHTTP_EXPORTS -DESP_TIMING -D_USRDLL -DESP_PLUGIN -DTXSUMMARY_EXPORTS) @@ -76,6 +77,7 @@ if(USE_OPENLDAP) endif() HPCC_ADD_LIBRARY(esphttp SHARED ${SRCS}) add_dependencies(esphttp espscm) + install(TARGETS esphttp RUNTIME DESTINATION ${EXEC_DIR} LIBRARY DESTINATION ${LIB_DIR}) target_link_libraries( esphttp @@ -86,6 +88,7 @@ target_link_libraries( dalibase thorhelper # this should not be dependent on the engine helper dll workunit # neither should it be dependent on the wokunit dll + esdllib ) if(LIBMEMCACHED_FOUND) diff --git a/esp/scm/additional.cmake b/esp/scm/additional.cmake index 105dbaa7b63..e34b4b9c76a 100644 --- a/esp/scm/additional.cmake +++ b/esp/scm/additional.cmake @@ -53,6 +53,9 @@ foreach ( loop_var ${ESPSCM_SRCS} ) set_source_files_properties(${ESPSCM_GENERATED_DIR}/${result}_esp.ipp PROPERTIES GENERATED TRUE) set_source_files_properties(${ESPSCM_GENERATED_DIR}/${result}.xml PROPERTIES GENERATED TRUE) set ( ESP_GENERATED_INCLUDES ${ESP_GENERATED_INCLUDES} ${ESPSCM_GENERATED_DIR}/${result}.esp ${ESPSCM_GENERATED_DIR}/${result}.hpp ${ESPSCM_GENERATED_DIR}/${result}.ipp ${ESPSCM_GENERATED_DIR}/${result}_esp.ipp ${ESPSCM_GENERATED_DIR}/${result}.xml ) + if ( PLATFORM ) + Install( FILES ${ESPSCM_GENERATED_DIR}/${result}.xml DESTINATION componentfiles/esdl_files COMPONENT Runtime ) + endif ( PLATFORM ) endforeach ( loop_var ${ESPSCM_SRCS} ) include_directories ( ${ESPSCM_GENERATED_DIR} ${HPCC_SOURCE_DIR}/esp/espcommon) diff --git a/esp/scm/smcscm.cmake b/esp/scm/smcscm.cmake index 42ff20ff9d3..d90d80364c3 100644 --- a/esp/scm/smcscm.cmake +++ b/esp/scm/smcscm.cmake @@ -70,6 +70,9 @@ foreach ( loop_var ${ESPSCM_SRCS} ) set_source_files_properties(${ESPSCM_GENERATED_DIR}/${result}_esp.ipp PROPERTIES GENERATED TRUE) set_source_files_properties(${ESPSCM_GENERATED_DIR}/${result}.xml PROPERTIES GENERATED TRUE) set ( ESP_GENERATED_INCLUDES ${ESP_GENERATED_INCLUDES} ${ESPSCM_GENERATED_DIR}/${result}.esp ${ESPSCM_GENERATED_DIR}/${result}.hpp ${ESPSCM_GENERATED_DIR}/${result}.ipp ${ESPSCM_GENERATED_DIR}/${result}_esp.ipp ${ESPSCM_GENERATED_DIR}/${result}.xml ) + if ( PLATFORM ) + Install( FILES ${ESPSCM_GENERATED_DIR}/${result}.xml DESTINATION componentfiles/esdl_files COMPONENT Runtime ) + endif ( PLATFORM ) endforeach ( loop_var ${ESPSCM_SRCS} ) include_directories ( ${ESPSCM_GENERATED_DIR} ${HPCC_SOURCE_DIR}/esp/espcommon ) diff --git a/esp/scm/ws_workunits_req_resp.ecm b/esp/scm/ws_workunits_req_resp.ecm index 9d9391d0a97..9bc7718d604 100644 --- a/esp/scm/ws_workunits_req_resp.ecm +++ b/esp/scm/ws_workunits_req_resp.ecm @@ -1024,12 +1024,12 @@ ESPresponse [exceptions_inline, nil_remove] WUGetNumFileToCopyResponse ESPRequest WUDetailsRequest { string WUID; - [optional] ESPstruct WUScopeFilter ScopeFilter; // which scopes are matched - [optional] ESPstruct WUNestedFilter NestedFilter; // what nested scopes are returned - [optional] ESPstruct WUPropertiesToReturn PropertiesToReturn; // List of properties to return - [optional] string Filter; // Filter as a string text - [optional] ESPstruct WUScopeOptions ScopeOptions; // Which scope details are returned - [optional] ESPstruct WUPropertyOptions PropertyOptions; // Which attribute details are returned + ESPstruct WUScopeFilter ScopeFilter; // which scopes are matched + ESPstruct WUNestedFilter NestedFilter; // what nested scopes are returned + ESPstruct WUPropertiesToReturn PropertiesToReturn; // List of properties to return + string Filter; // Filter as a string text + ESPstruct WUScopeOptions ScopeOptions; // Which scope details are returned + ESPstruct WUPropertyOptions PropertyOptions; // Which attribute details are returned }; ESPResponse [exceptions_inline] WUDetailsResponse @@ -1108,13 +1108,13 @@ ESPresponse [exceptions_inline] WUGetPluginsResponse ESPrequest [nil_remove] WUAnalyseHotspotRequest { string Wuid; - [optional] string RootScope; + string RootScope; bool OptOnlyActive(false); bool OnlyCriticalPath(false); bool IncludeProperties(true); bool IncludeStatistics(true); double ThresholdPercent(1.0); - [optional] ESPstruct WUPropertyOptions PropertyOptions; // Which attribute details are returned + ESPstruct WUPropertyOptions PropertyOptions; // Which attribute details are returned }; ESPresponse [exceptions_inline] WUAnalyseHotspotResponse diff --git a/esp/scm/ws_workunits_struct.ecm b/esp/scm/ws_workunits_struct.ecm index 4952df23f58..01d84b71ce6 100644 --- a/esp/scm/ws_workunits_struct.ecm +++ b/esp/scm/ws_workunits_struct.ecm @@ -731,9 +731,9 @@ ESPstruct WUPropertyFilter { string Name; // Attribute Name to match // Match attribute's RawValue - [optional] string ExactValue; - [optional] string MinValue; - [optional] string MaxValue; + string ExactValue; + string MinValue; + string MaxValue; }; // Filters that indicates which nodes are explicitly matched @@ -742,29 +742,29 @@ ESPstruct WUPropertyFilter // PropertyFilters (attributes or statistics) is applied to all matches ESPStruct WUScopeFilter { - [optional] integer MaxDepth(9999); // Maximum depth to return matches from (omitted means no limit) - [optional] ESParray Scopes; // Fully qualified scope (See definition of "Scope" in workunit.hpp) - [optional] ESParray Ids; // Return scope with given node id - [optional] ESParray ScopeTypes; // Return scope of a given type - [optional] ESParray PropertyFilters; + integer MaxDepth(9999); // Maximum depth to return matches from (omitted means no limit) + ESParray Scopes; // Fully qualified scope (See definition of "Scope" in workunit.hpp) + ESParray Ids; // Return scope with given node id + ESParray ScopeTypes; // Return scope of a given type + ESParray PropertyFilters; }; // This provides the filter which indicates which nodes are implicitly matched // Once a match is found, all nested scopes to a depth of depth are implicitly matched, provided they match the nested filter ESPStruct WUNestedFilter { - [optional] unsigned Depth(9999); // How many nodes deep relative to matched scope id(s) - // 0 - implies return only the given scope id - // 1 - return only the immediate child of the given scope - // n - return children to 'n' level deep - [optional] ESParray ScopeTypes; // Return scope of a given type + unsigned Depth(9999); // How many nodes deep relative to matched scope id(s) + // 0 - implies return only the given scope id + // 1 - return only the immediate child of the given scope + // n - return children to 'n' level deep + ESParray ScopeTypes; // Return scope of a given type }; // Additional properties that are returned for a scopeType ESPStruct WUExtraProperties { string scopeType; // A type of scope e.g., activity/edge - [optional] ESParray Properties; // a list of properties to return, omitted means none + ESParray Properties; // a list of properties to return, omitted means none }; // If measure and attributes are omitted then all matches are returned @@ -778,10 +778,10 @@ ESPStruct WUPropertiesToReturn bool AllScopes(false); bool AllProperties(false); [min_ver("1.76")] bool AllNotes(false); - [optional] uint64 MinVersion; // Only return properties where the version is later than this version. - [optional] string Measure; // E.g. Time, Num, Size - [optional] ESParray Properties; // a list of properties to return - [optional] ESParray ExtraProperties; + uint64 MinVersion; // Only return properties where the version is later than this version. + string Measure; // E.g. Time, Num, Size + ESParray Properties; // a list of properties to return + ESParray ExtraProperties; }; ESPStruct WUScopeOptions @@ -807,31 +807,31 @@ ESPStruct WUPropertyOptions // Response related structures ESPstruct [nil_remove] WUResponseProperty { - [optional] string Name; // Name of attribute - [optional] string RawValue; // Value of attribute - [optional] string Formatted; // Formatted value of attribute - [optional] string Measure; // What type is this attribute - [optional] string Creator; // Which engine created it - [optional] string CreatorType; // What type of engine created it. + string Name; // Name of attribute + string RawValue; // Value of attribute + string Formatted; // Formatted value of attribute + string Measure; // What type is this attribute + string Creator; // Which engine created it + string CreatorType; // What type of engine created it. }; ESPstruct [nil_remove] WUResponseNote { - [optional] string Source; // Thor, Eclcc, Analyser etc - [optional] string Message; - [optional] nonNegativeInteger ErrorCode; - [optional] string Severity; - [optional] nonNegativeInteger Cost; + string Source; // Thor, Eclcc, Analyser etc + string Message; + nonNegativeInteger ErrorCode; + string Severity; + nonNegativeInteger Cost; }; ESPstruct [nil_remove] WUResponseScope { - [optional] string ScopeName; // Fully qualified scope (See definition of "Scope" in workunit.hpp) - [optional] string Id; // Node/Graph id - [optional] string ScopeType; // e.g. Activity, Edge - [optional] ESParray Properties; - [optional, min_ver("1.76")] ESParray Notes; - [optional, min_ver("1.92")] string SinkActivity; // Only used by hotspot code + string ScopeName; // Fully qualified scope (See definition of "Scope" in workunit.hpp) + string Id; // Node/Graph id + string ScopeType; // e.g. Activity, Edge + ESParray Properties; + [min_ver("1.76")] ESParray Notes; + [min_ver("1.92")] string SinkActivity; // Only used by hotspot code }; ESPStruct WUQueryConfigResult diff --git a/esp/services/esdl_svc_engine/CMakeLists.txt b/esp/services/esdl_svc_engine/CMakeLists.txt index 969d98f23ee..796c164eba2 100755 --- a/esp/services/esdl_svc_engine/CMakeLists.txt +++ b/esp/services/esdl_svc_engine/CMakeLists.txt @@ -61,6 +61,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/rtl/eclrtl ${HPCC_SOURCE_DIR}/rtl/include ${HPCC_SOURCE_DIR}/esp/esdllib + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/esp/logging/logginglib ${HPCC_SOURCE_DIR}/esp/logging/loggingmanager ${CMAKE_BINARY_DIR} @@ -86,6 +87,7 @@ target_link_libraries ( esdl_svc_engine remote dalibase esdllib + esdlscriptlib dllserver dalibase ${COMMON_ESP_SERVICE_LIBS} diff --git a/esp/services/ws_access/ws_accessService.cpp b/esp/services/ws_access/ws_accessService.cpp index 56c1d1ae63a..50f56575ad4 100644 --- a/esp/services/ws_access/ws_accessService.cpp +++ b/esp/services/ws_access/ws_accessService.cpp @@ -1768,11 +1768,6 @@ bool Cws_accessEx::onResources(IEspContext &context, IEspResourcesRequest &req, oneresource->setIsSpecial(true); } } - else if(rtype == RT_FILE_SCOPE && stricmp(rname, "file") == 0) - { - //oneresource->setIsSpecial(true); //33067 - continue; - } oneresource->setName(rname); oneresource->setDescription(r.getDescription()); diff --git a/esp/services/ws_esdlconfig/CMakeLists.txt b/esp/services/ws_esdlconfig/CMakeLists.txt index b2f01116d01..87d794da1f3 100644 --- a/esp/services/ws_esdlconfig/CMakeLists.txt +++ b/esp/services/ws_esdlconfig/CMakeLists.txt @@ -57,6 +57,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/esp/smc/SMCLib ${HPCC_SOURCE_DIR}/esp/services/esdl_svc_engine ${HPCC_SOURCE_DIR}/esp/esdllib + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/esp/logging/logginglib ${HPCC_SOURCE_DIR}/esp/logging/loggingmanager ${HPCC_SOURCE_DIR}/common/thorhelper diff --git a/esp/services/ws_esdlconfig/ws_esdlconfigservice.cpp b/esp/services/ws_esdlconfig/ws_esdlconfigservice.cpp index a71843d2b99..cbaa8ec59bd 100644 --- a/esp/services/ws_esdlconfig/ws_esdlconfigservice.cpp +++ b/esp/services/ws_esdlconfig/ws_esdlconfigservice.cpp @@ -186,8 +186,8 @@ void CWsESDLConfigEx::init(IPropertyTree *cfg, const char *process, const char * if(servicecfg == NULL) throw MakeStringException(-1, "config not found for service %s/%s",process, service); - m_isDetachedFromDali = false; m_esdlStore.setown(createEsdlCentralStore()); + m_isDetachedFromDali = (nullptr == m_esdlStore); } // Build two independent lists. First an array of IEspMethodConfig elements that lists @@ -1119,22 +1119,6 @@ bool CWsESDLConfigEx::onConfigureESDLBindingLogTransform(IEspContext &context, I return true; } -int CWsESDLConfigEx::getBindingXML(const char * bindingId, StringBuffer & bindingXml, StringBuffer & msg) -{ - Owned esdlBinding = m_esdlStore->getBindingTree(bindingId, msg); - if (esdlBinding) - { - toXML(esdlBinding, bindingXml, 0,0); - msg.setf("Successfully fetched binding %s", bindingId); - return 0; - } - else - { - msg.setf("Could not fetch binding %s", bindingId); - return -1; - } -} - bool CWsESDLConfigEx::onGetESDLBinding(IEspContext &context, IEspGetESDLBindingRequest &req, IEspGetESDLBindingResponse &resp) { try diff --git a/esp/services/ws_esdlconfig/ws_esdlconfigservice.hpp b/esp/services/ws_esdlconfig/ws_esdlconfigservice.hpp index 84eba260b64..6cb79df3010 100644 --- a/esp/services/ws_esdlconfig/ws_esdlconfigservice.hpp +++ b/esp/services/ws_esdlconfig/ws_esdlconfigservice.hpp @@ -38,7 +38,6 @@ class CWsESDLConfigEx : public CWsESDLConfig private: Owned m_esdlStore; IPropertyTree * getEspProcessRegistry(const char * espprocname, const char * espbingingport, const char * servicename); - int getBindingXML(const char * bindingId, StringBuffer & bindingXml, StringBuffer & msg); void buildServiceMethodsResponse(IEsdlDefinitionInfo* defInfo, IArrayOf& methodList, StringArray& serviceList, const char* svc = nullptr); void buildServiceWithMethodsResponse(IEsdlDefinitionInfo* defInfo, IArrayOf& serviceList, const char* svc = nullptr); void wrapWithDefinitionElement(IEsdlDefinitionInfo* defInfo, StringBuffer& def); @@ -66,8 +65,14 @@ class CWsESDLConfigEx : public CWsESDLConfig bool attachServiceToDali() override { - m_isDetachedFromDali = false; - return true; + if(nullptr == m_esdlStore) + { + m_esdlStore.setown(createEsdlCentralStore()); + m_isDetachedFromDali = (nullptr == m_esdlStore); + } + else + m_isDetachedFromDali = false; + return !m_isDetachedFromDali; } bool detachServiceFromDali() override diff --git a/esp/services/ws_fs/ws_fsService.cpp b/esp/services/ws_fs/ws_fsService.cpp index ce876276fd1..5f2b418d5ac 100644 --- a/esp/services/ws_fs/ws_fsService.cpp +++ b/esp/services/ws_fs/ws_fsService.cpp @@ -1908,7 +1908,19 @@ IPropertyTree *CFileSprayEx::getAndValidateDropZone(const char *path, const char return nullptr; } -void CFileSprayEx::readAndCheckSpraySourceReq(MemoryBuffer& srcxml, const char* srcIP, const char* srcPath, const char* srcPlane, +static bool parseUNCPath(const char* sprayPath, StringBuffer& localPath, StringBuffer& hostInPath) +{ + if (!splitUNCFilename(sprayPath, &hostInPath, &localPath, &localPath, &localPath)) + return false; + + hostInPath.remove(0, 2); //Skip the leading "//" + if (hostInPath.isEmpty()) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Invalid SourcePath %s.", sprayPath); + + return true; +} + +void CFileSprayEx::readAndCheckSpraySourceReq(IEspContext& context, MemoryBuffer& srcxml, const char* srcIP, const char* srcPath, const char* srcPlane, StringBuffer& sourcePlaneReq, StringBuffer& sourceIPReq, StringBuffer& sourcePathReq) { StringBuffer sourcePath(srcPath); @@ -1920,38 +1932,107 @@ void CFileSprayEx::readAndCheckSpraySourceReq(MemoryBuffer& srcxml, const char* if (containsRelPaths(sourcePath)) //Detect a path like: a/../../../f throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Invalid path %s", sourcePath.str()); - if (!isEmptyString(srcPlane)) + Owned dropZone; + sourceIPReq.set(srcIP).trim(); + sourcePlaneReq.set(srcPlane).trim(); + + // establish dropzone if possible + if (!sourcePlaneReq.isEmpty()) { - Owned dropZone = getDropZonePlane(srcPlane); + dropZone.setown(getDropZonePlane(sourcePlaneReq)); if (!dropZone) - throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Unknown landing zone: %s", srcPlane); - const char * dropZonePlanePath = dropZone->queryProp("@prefix"); - if (isAbsolutePath(sourcePath)) - { - if (!startsWith(sourcePath, dropZonePlanePath)) - throw makeStringException(ECLWATCH_INVALID_INPUT, "Invalid source path"); - } - else - { - StringBuffer s(sourcePath); - sourcePath.set(dropZonePlanePath); - addNonEmptyPathSepChar(sourcePath); - sourcePath.append(s); - } - getDropZoneHost(srcPlane, dropZone, sourceIPReq); - sourcePlaneReq.append(srcPlane); + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Unknown landing zone: %s", sourcePlaneReq.str()); + if (!sourceIPReq.isEmpty() && !isHostInPlane(dropZone, sourceIPReq, true)) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "SourceIP '%s' is not defined within the dropzone %s.", sourceIPReq.str(), dropZone->queryProp("@name")); } else { - sourceIPReq.set(srcIP).trim(); if (sourceIPReq.isEmpty()) throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Source network IP not specified."); - Owned plane = getAndValidateDropZone(sourcePath, sourceIPReq); - if (plane) - sourcePlaneReq.append(plane->queryProp("@name")); + dropZone.setown(findDropZonePlane(nullptr, sourceIPReq, true, isContainerized())); + if (dropZone) + sourcePlaneReq.append(dropZone->queryProp("@name")); + // else - only possible if bare-metal and isDropZoneRestrictionEnabled()==false + } + + SocketEndpoint sourceHostEp(sourceIPReq); + + //Validate dropzone scope access for every files from the sourcePathReq. + //Correct relative path and save into the sourcePathReq. + getStandardPosixPath(sourcePathReq, sourcePath.str()); + StringArray files; + files.appendList(sourcePathReq, ","); // handles comma separated files + sourcePathReq.clear(); + ForEachItemIn(i, files) + { + const char* file = files.item(i); + if (isEmptyString(file)) + continue; + + //Parse the file to find/validate possible host/ip and local path. + //Validate file path. + StringBuffer hostInPath, localPath, absPath; + const char* path = nullptr; + if (parseUNCPath(file, localPath, hostInPath)) + { + SocketEndpoint hostInPathEp(hostInPath); + if (!sourceIPReq.isEmpty() && !sourceHostEp.ipequals(hostInPathEp)) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "The host '%s' defined in the SourcePath '%s' does not match with the host '%s' defined in SourceIP.", hostInPath.str(), file, sourceIPReq.str()); + if (dropZone) + { + // don't re-check if sourceIPReq specified and therefore already checked valid previously. + if (sourceIPReq.isEmpty()) + { + if (!isHostInPlane(dropZone, hostInPath, true)) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Host '%s' in '%s' is not defined within the dropzone %s.", hostInPath.str(), file, dropZone->queryProp("@name")); + } + if (!isPathInPlane(dropZone, localPath)) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Path '%s' in '%s' is not valid for dropzone '%s'", localPath.str(), file, dropZone->queryProp("@name")); + } + // else implies bare-metal+restrictions off - sourceIPReq cannot be empty, if no dropzone. + + path = localPath.str(); + } + else + { + path = file; + if (isAbsolutePath(path)) + { + if (dropZone && !isPathInPlane(dropZone, path)) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Path '%s' is not valid for dropzone '%s'", path, sourcePlaneReq.str()); + } + else + { + if (dropZone) // force paths to absolute, for LDAP checking below + { + absPath.set(dropZone->queryProp("@prefix")); + addNonEmptyPathSepChar(absPath); + absPath.append(path); + path = absPath.str(); + } + } + } + + if (dropZone) + { + //Based on the tests, the dfuserver only supports the wildcard inside the file name, like '/path/f*'. + //The dfuserver throws an error if the wildcard is inside the path, like /p*ath/file. + SecAccessFlags permission = getDZFileScopePermissions(context, sourcePlaneReq, path, nullptr); + if (permission < SecAccess_Read) + throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Access DropZone Scope %s %s not allowed for user %s (permission:%s). Read Access Required.", + sourcePlaneReq.str(), path, context.queryUserId(), getSecAccessFlagName(permission)); + } + + if (!sourcePathReq.isEmpty()) + sourcePathReq.append(","); + if (!hostInPath.isEmpty()) + sourcePathReq.append("//").append(hostInPath); + sourcePathReq.append(path); } + // fill in sourceIPReq based on dropzone if not provided + if (dropZone && sourceIPReq.isEmpty()) + getDropZoneHost(sourcePlaneReq, dropZone, sourceIPReq); } - getStandardPosixPath(sourcePathReq, sourcePath.str()); } static void checkValidDfuQueue(const char * dfuQueue) @@ -1997,7 +2078,7 @@ bool CFileSprayEx::onSprayFixed(IEspContext &context, IEspSprayFixed &req, IEspS MemoryBuffer& srcxml = (MemoryBuffer&)req.getSrcxml(); StringBuffer sourcePlaneReq, sourceIPReq, sourcePathReq; - readAndCheckSpraySourceReq(srcxml, req.getSourceIP(), req.getSourcePath(), req.getSourcePlane(), sourcePlaneReq, sourceIPReq, sourcePathReq); + readAndCheckSpraySourceReq(context, srcxml, req.getSourceIP(), req.getSourcePath(), req.getSourcePlane(), sourcePlaneReq, sourceIPReq, sourcePathReq); const char* srcfile = sourcePathReq.str(); const char* destname = req.getDestLogicalName(); if(isEmptyString(destname)) @@ -2036,7 +2117,7 @@ bool CFileSprayEx::onSprayFixed(IEspContext &context, IEspSprayFixed &req, IEspS wu->setCommand(DFUcmd_import); IDFUfileSpec *source = wu->queryUpdateSource(); - checkDZScopeAccessAndSetSpraySourceDFUFileSpec(context, sourcePlaneReq, sourceIPReq, srcfile, srcxml, source); + setSpraySourceDFUFileSpec(context, sourcePlaneReq, sourceIPReq, srcfile, srcxml, source); source->setGroupName(sourcePlaneReq); IDFUfileSpec *destination = wu->queryUpdateDestination(); bool nosplit = req.getNosplit(); @@ -2164,7 +2245,7 @@ bool CFileSprayEx::onSprayVariable(IEspContext &context, IEspSprayVariable &req, MemoryBuffer& srcxml = (MemoryBuffer&)req.getSrcxml(); StringBuffer sourcePlaneReq, sourceIPReq, sourcePathReq; - readAndCheckSpraySourceReq(srcxml, req.getSourceIP(), req.getSourcePath(), req.getSourcePlane(), sourcePlaneReq, sourceIPReq, sourcePathReq); + readAndCheckSpraySourceReq(context, srcxml, req.getSourceIP(), req.getSourcePath(), req.getSourcePlane(), sourcePlaneReq, sourceIPReq, sourcePathReq); const char* srcfile = sourcePathReq.str(); const char* destname = req.getDestLogicalName(); if(isEmptyString(destname)) @@ -2197,7 +2278,7 @@ bool CFileSprayEx::onSprayVariable(IEspContext &context, IEspSprayVariable &req, IDFUfileSpec *destination = wu->queryUpdateDestination(); IDFUoptions *options = wu->queryUpdateOptions(); - checkDZScopeAccessAndSetSpraySourceDFUFileSpec(context, sourcePlaneReq, sourceIPReq, srcfile, srcxml, source); + setSpraySourceDFUFileSpec(context, sourcePlaneReq, sourceIPReq, srcfile, srcxml, source); source->setMaxRecordSize(req.getSourceMaxRecordSize()); source->setFormat((DFUfileformat)req.getSourceFormat()); source->setGroupName(sourcePlaneReq); @@ -2306,43 +2387,19 @@ bool CFileSprayEx::onSprayVariable(IEspContext &context, IEspSprayVariable &req, return true; } -void CFileSprayEx::checkDZScopeAccessAndSetSpraySourceDFUFileSpec(IEspContext &context, const char *srcPlane, const char *srcHost, +void CFileSprayEx::setSpraySourceDFUFileSpec(IEspContext &context, const char *srcPlane, const char *srcHost, const char *srcFile, MemoryBuffer &srcXML, IDFUfileSpec *srcDFUfileSpec) { if(srcXML.length() == 0) { //The srcHost is validated in readAndCheckSpraySourceReq(). - //If the srcPlane is found by readAndCheckSpraySourceReq(), the DZFileScopePermissions - //should be validated for every files in srcFile. - StringBuffer fnamebuf(srcFile); - fnamebuf.trim(); - if (!isEmptyString(srcPlane)) // must be true, unless bare-metal and isDropZoneRestrictionEnabled()==false - { - StringArray files; - files.appendList(fnamebuf, ","); // handles comma separated files - ForEachItemIn(i, files) - { - const char *file = files.item(i); - if (isEmptyString(file)) - continue; - - //Based on the tests, the dfuserver only supports the wildcard inside the file name, like '/path/f*'. - //The dfuserver throws an error if the wildcard is inside the path, like /p*ath/file. - - SecAccessFlags permission = getDZFileScopePermissions(context, srcPlane, file, srcHost); - if (permission < SecAccess_Read) - throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Access DropZone Scope %s %s not allowed for user %s (permission:%s). Read Access Required.", - srcPlane, file, context.queryUserId(), getSecAccessFlagName(permission)); - } - } - SocketEndpoint ep(srcHost); if (ep.isNull()) throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Cannot resolve source network IP from %s.", srcHost); RemoteMultiFilename rmfn; rmfn.setEp(ep); - rmfn.append(fnamebuf.str()); + rmfn.append(srcFile); srcDFUfileSpec->setMultiFilename(rmfn); } else diff --git a/esp/services/ws_fs/ws_fsService.hpp b/esp/services/ws_fs/ws_fsService.hpp index 4fe1693849e..eaf05c12342 100644 --- a/esp/services/ws_fs/ws_fsService.hpp +++ b/esp/services/ws_fs/ws_fsService.hpp @@ -66,14 +66,14 @@ class Schedule : public Thread class CFileSprayEx : public CFileSpray { - void readAndCheckSpraySourceReq(MemoryBuffer& srcxml, const char* srcIP, const char* srcPath, const char* srcplane, + void readAndCheckSpraySourceReq(IEspContext& context, MemoryBuffer& srcxml, const char* srcIP, const char* srcPath, const char* srcplane, StringBuffer& sourcePlaneReq, StringBuffer& sourceIPReq, StringBuffer& sourcePathReq); void getServersInDropZone(const char* dropZoneName, IArrayOf& dropZoneList, bool isECLWatchVisibleOnly, StringArray& serverList); IPropertyTree* getAndValidateDropZone(const char * path, const char * host); IEspDFUWorkunit* createDFUWUFromSashaListResult(const char* result); void setDFUCommand(const char* commandStr, IEspDFUWorkunit* dfuWU); - void checkDZScopeAccessAndSetSpraySourceDFUFileSpec(IEspContext& context, const char* srcPlane, const char * srcHost, + void setSpraySourceDFUFileSpec(IEspContext& context, const char* srcPlane, const char * srcHost, const char* srcFile, MemoryBuffer& srcXML, IDFUfileSpec* srcDFUfileSpec); public: diff --git a/esp/smc/SMCLib/TpCommon.cpp b/esp/smc/SMCLib/TpCommon.cpp index a42b9eb4576..a5e8612b622 100644 --- a/esp/smc/SMCLib/TpCommon.cpp +++ b/esp/smc/SMCLib/TpCommon.cpp @@ -155,6 +155,10 @@ extern TPWRAPPER_API bool validateDropZoneHostAndPath(const char* dropZoneName, throw makeStringException(ECLWATCH_INVALID_INPUT, "Host not defined."); if (isEmptyString(pathToCheck)) throw makeStringException(ECLWATCH_INVALID_INPUT, "Path not defined."); + if (isContainerized() && streq("localhost", hostToCheck)) + hostToCheck = nullptr; // "localhost" is a placeholder for mounted dropzones that have no hosts. + if (isEmptyString(hostToCheck) && isEmptyString(dropZoneName)) + throw makeStringException(ECLWATCH_INVALID_INPUT, "No dropzone or host provided."); if (containsRelPaths(pathToCheck)) //Detect a path like: /home/lexis/runtime/var/lib/HPCCSystems/mydropzone/../../../ throw makeStringExceptionV(ECLWATCH_INVALID_INPUT, "Invalid path %s", pathToCheck); diff --git a/esp/src/eclwatch/ClusterProcessesQueryWidget.js b/esp/src/eclwatch/ClusterProcessesQueryWidget.js index cab88c0c761..b3a388288d8 100644 --- a/esp/src/eclwatch/ClusterProcessesQueryWidget.js +++ b/esp/src/eclwatch/ClusterProcessesQueryWidget.js @@ -80,10 +80,14 @@ define([ initTab: function () { var currSel = this.getSelectedChild(); if (currSel && !currSel.initalized) { - if (currSel.id === this.legacyClustersProcessesIframeWidget.id && !this.legacyClustersProcessesIframeWidget.initalized) { + if (currSel.id === this.id + "_Grid") { + this.refreshGrid(); + } else if (currSel.id === this.legacyClustersProcessesIframeWidget.id && !this.legacyClustersProcessesIframeWidget.initalized) { this.legacyClustersProcessesIframeWidget.init({ src: ESPRequest.getBaseURL("WsTopology") + "/TpClusterQuery?Type=ROOT" }); + } else { + currSel.init(currSel.params); } } }, diff --git a/esp/src/eclwatch/GetDFUWorkunitsWidget.js b/esp/src/eclwatch/GetDFUWorkunitsWidget.js index 5db8915d29d..dc320468733 100644 --- a/esp/src/eclwatch/GetDFUWorkunitsWidget.js +++ b/esp/src/eclwatch/GetDFUWorkunitsWidget.js @@ -368,10 +368,13 @@ define([ initWorkunitsGrid: function () { var context = this; + var filter = this.filter.toObject(); + filter.includeTimings = true; + filter.includeTransferRate = true; var store = this.params.searchResults ? this.params.searchResults : new ESPDFUWorkunit.CreateWUQueryStore(); this.workunitsGrid = new declare([ESPUtil.Grid(true, true, false, false, "GetDFUWorkunitsWidget")])({ store: store, - query: this.filter.toObject(), + query: filter, columns: { col1: selector({ width: 27, @@ -418,6 +421,20 @@ define([ domClass.add(node, "justify-right"); node.innerText = Utility.valueCleanUp(object.PercentDone); } + }, + TimeStarted: { label: this.i18n.TimeStarted, width: 150, sortable: true }, + TimeStopped: { label: nlsHPCC.TimeStopped, width: 150, sortable: true }, + KbPerSec: { + label: nlsHPCC.TransferRate, width: 120, + renderCell: function (object, value, node, options) { + node.innerText = Utility.convertedSize(object.KbPerSec * 1024) + " / sec"; + } + }, + KbPerSecAve: { // KbPerSecAve seems to never be different than KbPerSec, see HPCC-29894 + label: nlsHPCC.TransferRateAvg, width: 90, + renderCell: function (object, value, node, options) { + node.innerText = Utility.convertedSize(object.KbPerSecAve * 1024) + " / sec"; + } } } }, this.id + "WorkunitsGrid"); @@ -459,7 +476,10 @@ define([ }, refreshGrid: function (clearSelection) { - this.workunitsGrid.set("query", this.filter.toObject()); + var filter = this.filter.toObject(); + filter.includeTimings = true; + filter.includeTransferRate = true; + this.workunitsGrid.set("query", filter); if (clearSelection) { this.workunitsGrid.clearSelection(); } diff --git a/esp/src/eclwatch/HPCCPlatformWidget.js b/esp/src/eclwatch/HPCCPlatformWidget.js index d7e7db593fc..9c34774d85e 100644 --- a/esp/src/eclwatch/HPCCPlatformWidget.js +++ b/esp/src/eclwatch/HPCCPlatformWidget.js @@ -178,12 +178,12 @@ define([ this.bannerColor = activity.BannerColor; this.bannerSize = activity.BannerSize; if (this.showBanner) { - var msg = "" + encodeHTML(activity.BannerContent) + ""; - this.upgradeBar.notify(msg); var marquee = dom.byId(this.id + "Marquee"); - var height = domGeo.getContentBox(marquee).h; + var height = activity.BannerSize * 2; + var msg = "" + encodeHTML(activity.BannerContent) + ""; + this.upgradeBar.notify(msg); domStyle.set(this.upgradeBar.domNode, "height", height + "px"); - domStyle.set(marquee.parentNode, { top: "auto", "margin-top": "auto" }); + domStyle.set(marquee.parentNode, { top: "auto", "margin-top": "auto", height: height + "px" }); } else { this.upgradeBar.notify(""); domStyle.set(this.upgradeBar.domNode, "height", "0px"); diff --git a/esp/src/eclwatch/HelpersWidget.js b/esp/src/eclwatch/HelpersWidget.js index fb5c5e73a95..ac4a2bbbcb9 100644 --- a/esp/src/eclwatch/HelpersWidget.js +++ b/esp/src/eclwatch/HelpersWidget.js @@ -63,7 +63,7 @@ define([ params = `/WUFile/res.txt?Wuid=${uriEncodedParams.Wuid}&Type=${uriEncodedParams.Type}`; break; case "ComponentLog": - params = `/WUFile/${item.Type}?Wuid=${uriEncodedParams.Wuid}&Name=${uriEncodedParams.Name}&Type=${uriEncodedParams.Type}`; + params = `/WUFile/${item.Type}?Wuid=${uriEncodedParams.Wuid}&Name=${uriEncodedParams.Name}&Type=${uriEncodedParams.Type}&LogFormat=2`; break; case "postmortem": params = `/WUFile/${item.Type}?Wuid=${uriEncodedParams.Wuid}&Name=${uriEncodedParams.Name}&Type=${uriEncodedParams.Type}`; diff --git a/esp/src/eclwatch/LZBrowseWidget.js b/esp/src/eclwatch/LZBrowseWidget.js index c267aa53497..0fb0452bd16 100644 --- a/esp/src/eclwatch/LZBrowseWidget.js +++ b/esp/src/eclwatch/LZBrowseWidget.js @@ -72,6 +72,8 @@ define([ serverFilterSelect: null, replicateEnabled: null, + dzExpanded: "", + postCreate: function (args) { this.inherited(arguments); this.sprayFixedForm = registry.byId(this.id + "SprayFixedForm"); @@ -447,7 +449,8 @@ define([ var context = this; this._spraySelectedOneAtATime("SprayFixedDropDown", "SprayFixedForm", function (request, item) { lang.mixin(request, { - sourceRecordSize: item.targetRecordLength + sourceRecordSize: item.targetRecordLength, + destNumParts: item.targetNumParts }); FileSpray.SprayFixed({ request: request @@ -460,6 +463,9 @@ define([ _onSprayDelimited: function (event) { var context = this; this._spraySelectedOneAtATime("SprayDelimitedDropDown", "SprayDelimitedForm", function (request, item) { + lang.mixin(request, { + destNumParts: item.targetNumParts + }); FileSpray.SprayVariable({ request: request }).then(function (response) { @@ -472,7 +478,8 @@ define([ var context = this; this._spraySelectedOneAtATime("SprayXmlDropDown", "SprayXmlForm", function (request, item) { lang.mixin(request, { - sourceRowTag: item.targetRowTag + sourceRowTag: item.targetRowTag, + destNumParts: item.targetNumParts }); FileSpray.SprayVariable({ request: request @@ -487,6 +494,7 @@ define([ this._spraySelectedOneAtATime("SprayJsonDropDown", "SprayJsonForm", function (request, item) { lang.mixin(request, { sourceRowPath: item.targetRowPath, + destNumParts: item.targetNumParts, isJSON: true }); FileSpray.SprayVariable({ @@ -500,6 +508,9 @@ define([ _onSprayVariable: function (event) { var context = this; this._spraySelectedOneAtATime("SprayVariableDropDown", "SprayVariableForm", function (request, item) { + lang.mixin(request, { + destNumParts: item.targetNumParts + }); FileSpray.SprayFixed({ request: request }).then(function (response) { @@ -511,6 +522,9 @@ define([ _onSprayBlob: function (event) { var context = this; this._spraySelected("SprayBlobDropDown", "SprayBlobForm", function (request, item) { + lang.mixin(request, { + destNumParts: item.targetNumParts + }); FileSpray.SprayFixed({ request: request }).then(function (response) { @@ -708,6 +722,13 @@ define([ displayName: tree({ label: this.i18n.Name, sortable: false, + shouldExpand: function (row, level) { + if ((context.dzExpanded === "" || context.dzExpanded === row.data.DropZone.Name) && level <= 1) { + context.dzExpanded = row.data.DropZone.Name; + return true; + } + return false; + }, formatter: function (_name, row) { var img = ""; var name = _name; @@ -764,6 +785,7 @@ define([ columns: { targetName: editor({ label: this.i18n.TargetName, + width: 80, autoSave: true, editor: "text", editorArgs: { @@ -775,9 +797,17 @@ define([ required: true, placeholder: this.i18n.RequiredForFixedSpray, promptMessage: this.i18n.RequiredForFixedSpray, - style: "width: 100%;" }, label: this.i18n.RecordLength, + width: 60, + autoSave: true, + }, ValidationTextBox), + targetNumParts: editor({ + editorArgs: { + promptMessage: this.i18n.ValidationErrorEnterNumber, + }, + label: this.i18n.NumberofParts, + width: 40, autoSave: true, }, ValidationTextBox) } @@ -788,10 +818,21 @@ define([ columns: { targetName: editor({ label: this.i18n.TargetName, - width: 144, + width: 80, autoSave: true, - editor: "text" - }) + editor: "text", + editorArgs: { + style: "width: 100%;" + } + }, TextBox), + targetNumParts: editor({ + editorArgs: { + promptMessage: this.i18n.ValidationErrorEnterNumber, + }, + label: this.i18n.NumberofParts, + width: 36, + autoSave: true, + }, ValidationTextBox) } }); @@ -800,15 +841,26 @@ define([ columns: { targetName: editor({ label: this.i18n.TargetName, - width: 120, + width: 80, autoSave: true, - editor: "text" - }), + editor: "text", + editorArgs: { + style: "width: 100%;" + } + }, TextBox), targetRowTag: editor({ label: this.i18n.RowTag, - width: 100, + width: 60, autoSave: true - }) + }, TextBox), + targetNumParts: editor({ + editorArgs: { + promptMessage: this.i18n.ValidationErrorEnterNumber + }, + label: this.i18n.NumberofParts, + width: 36, + autoSave: true, + }, ValidationTextBox) } }); @@ -817,16 +869,27 @@ define([ columns: { targetName: editor({ label: this.i18n.TargetName, - width: 144, + width: 80, autoSave: true, - editor: "text" - }), + editor: "text", + editorArgs: { + style: "width: 100%;" + } + }, TextBox), targetRowPath: editor({ label: this.i18n.RowPath, - width: 72, + width: 60, autoSave: true, editor: "text" - }) + }, TextBox), + targetNumParts: editor({ + editorArgs: { + promptMessage: this.i18n.ValidationErrorEnterNumber, + }, + label: this.i18n.NumberofParts, + width: 40, + autoSave: true, + }, ValidationTextBox) } }); @@ -835,10 +898,21 @@ define([ columns: { targetName: editor({ label: this.i18n.TargetName, - width: 144, + width: 100, autoSave: true, - editor: "text" - }) + editor: "text", + editorArgs: { + style: "width: 100%;" + } + }, TextBox), + targetNumParts: editor({ + editorArgs: { + promptMessage: this.i18n.ValidationErrorEnterNumber, + }, + label: this.i18n.NumberofParts, + width: 40, + autoSave: true, + }, ValidationTextBox) } }); @@ -847,10 +921,21 @@ define([ columns: { fullPath: editor({ label: this.i18n.SourcePath, - width: 144, + width: 100, autoSave: true, - editor: "text" - }) + editor: "text", + editorArgs: { + style: "width: 100%;" + } + }, TextBox), + targetNumParts: editor({ + editorArgs: { + promptMessage: this.i18n.ValidationErrorEnterNumber, + }, + label: this.i18n.NumberofParts, + width: 40, + autoSave: true, + }, ValidationTextBox) } }); @@ -887,6 +972,7 @@ define([ lang.mixin(item, lang.mixin({ targetName: item.displayName, targetRecordLength: "", + targetNumParts: "", targetRowTag: "Row", targetRowPath: "/" }, item)); diff --git a/esp/src/eclwatch/SystemServersQueryWidget.js b/esp/src/eclwatch/SystemServersQueryWidget.js index 7622fd535e1..12a7e9c7546 100644 --- a/esp/src/eclwatch/SystemServersQueryWidget.js +++ b/esp/src/eclwatch/SystemServersQueryWidget.js @@ -68,10 +68,14 @@ define([ initTab: function () { var currSel = this.getSelectedChild(); if (currSel && !currSel.initalized) { - if (currSel.id === this.systemServersQueryWidgetIframeWidget.id && !this.systemServersQueryWidgetIframeWidget.initalized) { + if (currSel.id === this.id + "_Grid") { + this.refreshGrid(); + } else if (currSel.id === this.systemServersQueryWidgetIframeWidget.id && !this.systemServersQueryWidgetIframeWidget.initalized) { this.systemServersQueryWidgetIframeWidget.init({ src: ESPRequest.getBaseURL("WsTopology") + "/TpServiceQuery?Type=ALLSERVICES" }); + } else { + currSel.init(currSel.params); } } }, @@ -278,7 +282,7 @@ define([ retVal.on(".dgrid-cell .gridClick:click", function (evt) { var item = retVal.row(evt).data; if (evt.target.title === "Audit Log" || evt.target.title === "Component Log") { - context._onOpenLog(item); + context._onOpenLog(item, evt.target.title); } else { context._onOpenConfiguration(item); } @@ -349,11 +353,11 @@ define([ }); }, - _onOpenLog: function (item) { + _onOpenLog: function (item, type) { var nodeTab = this.ensureLogsPane(item.Name + ": " + item.Parent.LogDirectory, { params: item, ParentName: item.Parent.Name, - LogDirectory: item.Parent.LogDirectory, + LogDirectory: type === "Audit Log" ? item.Parent.AuditLogDirectory : item.Parent.LogDirectory, NetAddress: item.Netaddress, OS: item.OS, newPreflight: true diff --git a/esp/src/eclwatch/TargetClustersQueryWidget.js b/esp/src/eclwatch/TargetClustersQueryWidget.js index 93b71755abd..5487b39ad5c 100644 --- a/esp/src/eclwatch/TargetClustersQueryWidget.js +++ b/esp/src/eclwatch/TargetClustersQueryWidget.js @@ -56,10 +56,14 @@ define([ initTab: function () { var currSel = this.getSelectedChild(); if (currSel && !currSel.initalized) { - if (currSel.id === this.legacyTargetClustersIframeWidget.id && !this.legacyTargetClustersIframeWidget.initalized) { + if (currSel.id === this.id + "_Grid") { + this.refreshGrid(); + } else if (currSel.id === this.legacyTargetClustersIframeWidget.id && !this.legacyTargetClustersIframeWidget.initalized) { this.legacyTargetClustersIframeWidget.init({ src: ESPRequest.getBaseURL("WsTopology") + "/TpTargetClusterQuery?Type=ROOT" }); + } else if (currSel.params.newPreflight || currSel.params.Usergenerated) { //prevents loop of pfTab.init above + currSel.init(currSel.params); } } }, @@ -81,7 +85,7 @@ define([ title: this.i18n.TargetClustersLegacy, style: "border: 0; width: 100%; height: 100%" }); - this.legacyTargetClustersIframeWidget.placeAt(this._tabContainer, "first"); + this.legacyTargetClustersIframeWidget.placeAt(this._tabContainer, "last"); this.machineFilter.disable(); }, diff --git a/esp/src/eclwatch/css/hpcc.css b/esp/src/eclwatch/css/hpcc.css index b6c322f43a3..d979c113288 100644 --- a/esp/src/eclwatch/css/hpcc.css +++ b/esp/src/eclwatch/css/hpcc.css @@ -15,57 +15,58 @@ ############################################################################## */ /*ELEMENT STYLES***************/ -html, body { +html, +body { background: white; width: 100%; height: 100%; margin: 0px; color: rgb(51, 51, 51); - font-family: Lucida Sans,Lucida Grande,Arial !important; + font-family: Lucida Sans, Lucida Grande, Arial !important; font-size: 13px !important; padding: 0; } button:hover { - color: rgb(0, 0, 0); - background-color: rgb(175, 217, 255); - } + color: rgb(0, 0, 0); + background-color: rgb(175, 217, 255); +} h1 { font-size: 1.5em; } /*Use this when creating a small popup form*/ -.smallForm label{ - float: left; +.smallForm label { + float: left; width: 26%; margin: 0 15px 0 0; text-align: left; padding-top: 4px; - font-weight:bold; - height:20px; + font-weight: bold; + height: 20px; } -form label{ +form label { margin: 0 8px 0 0; - font-weight:bold; + font-weight: bold; } -form ul{ - list-style:none; - margin:0; - padding:0; +form ul { + list-style: none; + margin: 0; + padding: 0; } -form li{ +form li { margin: 0; padding: 6px 1% 9px 1%; clear: both; position: relative; - height:20px; + height: 20px; } -form li label{ +form li label { float: left; width: 14%; margin: 0 15px 0 0; @@ -81,26 +82,26 @@ form li label{ padding-top: 4px; } -form li textarea{ +form li textarea { font-size: 13px; font-family: Arial; - width:auto; - height:auto; - float:left; + width: auto; + height: auto; + float: left; } -form h1{ +form h1 { font-size: 1.5em; - margin-left:15px; + margin-left: 15px; } -form h2{ - padding:5px 0; - color:rgb(22, 22, 22); +form h2 { + padding: 5px 0; + color: rgb(22, 22, 22); } /* Double-color dashed line */ - + hr.dashedLine { border: 0; border-bottom: 1px dashed #ccc; @@ -108,15 +109,16 @@ hr.dashedLine { background: none; } - h2 img:first-of-type{ - margin-left:15px; +h2 img:first-of-type { + margin-left: 15px; } + /*IDs************************/ .flat .hpccMainpage { margin: 0; padding: 0; - width: 100%; - height: 100%; + width: 100%; + height: 100%; } .flat .hpccTitlebar { @@ -130,7 +132,7 @@ hr.dashedLine { justify-content: space-between; } -.flat #stubStackController{ +.flat #stubStackController { height: 32px; margin-top: 6px; } @@ -141,8 +143,8 @@ hr.dashedLine { flex-grow: 1; } -.flat .glow :hover{ - background-color:rgb(118, 157, 192); +.flat .glow :hover { + background-color: rgb(118, 157, 192); border-radius: 4px; cursor: pointer; } @@ -185,24 +187,24 @@ hr.dashedLine { .flat .glow .dijitToggleButton .dijitButtonNode { background: none; - border:none; + border: none; box-shadow: none; - margin:0; - align-content:center; + margin: 0; + align-content: center; } .flat .hpccTitlebar .dijitToggleButtonChecked .dijitButtonNode { border-width: 0px; margin: 0px; - align-content:center; + align-content: center; } .flat .hpccTitlebar .dijitDropDownButton .dijitButtonNode { background: none; - border:none; + border: none; box-shadow: none; - margin:0px; - align-content:center; + margin: 0px; + align-content: center; } .flat .miniTitlebar { @@ -211,7 +213,7 @@ hr.dashedLine { padding: 0px; padding-left: 6px; padding-right: 6px; - width:100%; + width: 100%; overflow: hidden; } @@ -245,29 +247,32 @@ hr.dashedLine { height: 0px; } -.flat #stubTitlebar .dijitToggleButton, .dijitButton, .dijitDropDownButton, .dijitComboButton{ - margin:0px; +.flat #stubTitlebar .dijitToggleButton, +.dijitButton, +.dijitDropDownButton, +.dijitComboButton { + margin: 0px; cursor: pointer; } -.flat .dijitPopup .dijitMenuPopup{ - top:56px !important; +.flat .dijitPopup .dijitMenuPopup { + top: 56px !important; } .flat .dgridInfo { - background-position:left center; + background-position: left center; background-repeat: no-repeat; - padding-left:25px; + padding-left: 25px; } -.flat .dgrid-cell { - text-overflow: ellipsis; - white-space: nowrap; +.flat .dgrid-cell { + text-overflow: ellipsis; + white-space: nowrap; } -.flat .wrap .dgrid-cell { - text-overflow: initial; - white-space: normal; +.flat .wrap .dgrid-cell { + text-overflow: initial; + white-space: normal; } .justify-right { @@ -275,57 +280,58 @@ hr.dashedLine { } .centerInCell { - text-align: center !important; /*overwrite the default grid cell text-align */ + text-align: center !important; + /*overwrite the default grid cell text-align */ } -.flat .hpccCentered { - text-align: center; +.flat .hpccCentered { + text-align: center; } .layoutTable { vertical-align: left; border: solid 1px #B5BCC7; - width:100%; + width: 100%; border-collapse: collapse; border-spacing: 0; - } +} - .layoutTable thead { +.layoutTable thead { vertical-align: left; background-color: #e2e2e2; height: 5px; - padding:0; - border-spacing:0; - } + padding: 0; + border-spacing: 0; +} .layoutTable th { vertical-align: left; - text-align:left; + text-align: left; background-color: #e2e2e2; - width:33%; + width: 33%; height: 5px; - padding-left:10px; - border-spacing:0; + padding-left: 10px; + border-spacing: 0; } .layoutTable tr { vertical-align: left; height: 5px; - padding:0; - border-spacing:0; + padding: 0; + border-spacing: 0; } .layoutTable td { text-align: left; - padding:10px; - border-spacing:0; + padding: 10px; + border-spacing: 0; } #stubTitlebar :focus { outline: none; } -#stubTitlebar .dijitStackController .dijitToggleButtonChecked *{ +#stubTitlebar .dijitStackController .dijitToggleButtonChecked * { cursor: pointer; } @@ -338,10 +344,11 @@ hr.dashedLine { z-index: 950; background-color: #1A9BD7; } -.lockLogo{ - display:block; - margin:auto; - padding-bottom:10px; + +.lockLogo { + display: block; + margin: auto; + padding-bottom: 10px; } #teaser { @@ -352,7 +359,7 @@ hr.dashedLine { display: inline; } -@media screen and (max-width: 1100px){ +@media screen and (max-width: 1100px) { #MonitorStatus { display: none; } @@ -362,7 +369,7 @@ hr.dashedLine { } } -@media screen and (max-width: 1024px){ +@media screen and (max-width: 1024px) { #userAccount { display: none; } @@ -373,7 +380,7 @@ hr.dashedLine { } -@media screen and (max-width: 920px){ +@media screen and (max-width: 920px) { #teaser { display: none; } @@ -383,248 +390,249 @@ hr.dashedLine { } } -@media screen and (max-width: 790px){ +@media screen and (max-width: 790px) { #search-form { display: none; } } -#search-form{ - padding:0; +#search-form { + padding: 0; margin: 10px 10px 0 0; min-width: 230px; } -#search-form :focus{ +#search-form :focus { outline: none; } -#search-form input{ - color:#666; +#search-form input { + color: #666; } .roundForm { - width:250px; + width: 250px; border-radius: 5px; padding: 1px 1px 1px 1px; } -#userAccount{ - float:left; +#userAccount { + float: left; text-align: right; - padding:5px 5px 0 0; - padding-top:10px; - color:rgb(164, 220, 245); + padding: 5px 5px 0 0; + padding-top: 10px; + color: rgb(164, 220, 245); } -#userAccount a{ - color:rgb(164, 220, 245); +#userAccount a { + color: rgb(164, 220, 245); } -#userIcons{ - float:left; +#userIcons { + float: left; text-align: center; } -#userIcons img{ - border:none; - margin-top:8px; +#userIcons img { + border: none; + margin-top: 8px; } #userIcons .dijitDropDownButton .dijitButtonNode { - border:none; + border: none; background: none; } #userIcons .holder span:nth-child(1) { - border:none; - margin:0 0 0 0; - padding:0; + border: none; + margin: 0 0 0 0; + padding: 0; outline: none; } -#userIcons .dijitButtonText{ - padding:0px; +#userIcons .dijitButtonText { + padding: 0px; } -#userIcons .dijitFocused{ - float:left; - border:none; +#userIcons .dijitFocused { + float: left; + border: none; } -.flat #stubMore{ - padding:0; - margin:0; +.flat #stubMore { + padding: 0; + margin: 0; height: 32px; margin-top: 6px; } -#myProgressBar{ - width:200px; +#myProgressBar { + width: 200px; } #borderContainer { - width:100%; - height:100%; + width: 100%; + height: 100%; } -#helpAction, #helpScope{ - width:12px; - height:12px; +#helpAction, +#helpScope { + width: 12px; + height: 12px; } -.iconLogo{ +.iconLogo { background-image: url("../img/hpcc_systems_logo.png"); width: 175px; height: 32px; cursor: pointer; } -.iconConfiguration{ +.iconConfiguration { background-image: url("../img/configuration.png"); width: 16px; height: 16px; cursor: pointer; } -.iconWu{ +.iconWu { background-image: url("../img/WUCog.png"); width: 32px; height: 32px; cursor: pointer; } -.iconDFU{ +.iconDFU { background-image: url("../img/FolderSmart.png"); width: 32px; height: 32px; cursor: pointer; } -.iconGetDFU{ +.iconGetDFU { background-image: url("../img/LZFolder.png"); width: 32px; height: 32px; cursor: pointer; } -.iconOperations{ +.iconOperations { background-image: url("../img/Operations.png"); width: 32px; height: 32px; cursor: pointer; } -.iconPlugins{ +.iconPlugins { background-image: url("../img/Plugins.png"); width: 32px; height: 32px; cursor: pointer; } -.iconLandingZone{ +.iconLandingZone { background-image: url("../img/LandingZone.png"); width: 32px; height: 32px; cursor: pointer; } -.iconTargets{ +.iconTargets { background-image: url("../img/Targets.png"); width: 32px; height: 32px; cursor: pointer; } -.iconFind{ +.iconFind { background-image: url("../img/search_icon.png"); width: 32px; height: 32px; cursor: pointer; } -.iconAdvanced{ +.iconAdvanced { background-image: url("../img/Info.png"); width: 32px; height: 32px; cursor: pointer; } -.iconZap{ - background-image: url("../img/zap.png"); +.iconZap { + background-image: url("../img/zap.png"); width: 16px; height: 16px; display: inline-block; } -.iconChart{ - background-image: url("../img/chart.png"); +.iconChart { + background-image: url("../img/chart.png"); width: 16px; height: 16px; } -.iconResult{ - background-image: url("../img/result.png"); +.iconResult { + background-image: url("../img/result.png"); width: 16px; height: 16px; } -.iconErrWarn{ - background-image: url("../img/errwarn.png"); +.iconErrWarn { + background-image: url("../img/errwarn.png"); width: 16px; height: 16px; } -.iconFolderTree{ - background-image: url("../img/folderTree.png"); +.iconFolderTree { + background-image: url("../img/folderTree.png"); width: 16px; height: 16px; } -.iconFolderList{ - background-image: url("../img/folderList.png"); +.iconFolderList { + background-image: url("../img/folderList.png"); width: 16px; height: 16px; } -.iconFileList{ - background-image: url("../img/fileList.png"); +.iconFileList { + background-image: url("../img/fileList.png"); width: 16px; height: 16px; } -.iconEdgeList{ - background-image: url("../img/edgeList.png"); +.iconEdgeList { + background-image: url("../img/edgeList.png"); width: 16px; height: 16px; } -.iconTreeMap{ - background-image: url("../img/treeMap.png"); +.iconTreeMap { + background-image: url("../img/treeMap.png"); width: 16px; height: 16px; } -.iconPerson{ - background-image: url("../img/person.png"); +.iconPerson { + background-image: url("../img/person.png"); width: 16px; height: 16px; } -.iconPeople{ - background-image: url("../img/people.png"); +.iconPeople { + background-image: url("../img/people.png"); width: 16px; height: 16px; } -.iconKey{ +.iconKey { background-image: url("../img/key.png"); width: 16px; height: 16px; } -.None{ - background: url("../img/nodata.png") no-repeat; +.None { + background: url("../img/nodata.png") no-repeat; width: 16px; height: 16px; display: block; @@ -634,8 +642,8 @@ hr.dashedLine { cursor: pointer; } -.Normal{ - background: url("../img/normal.png") no-repeat; +.Normal { + background: url("../img/normal.png") no-repeat; width: 16px; height: 16px; display: block; @@ -645,8 +653,8 @@ hr.dashedLine { cursor: pointer; } -.Warning{ - background: url("../img/warning.png") no-repeat; +.Warning { + background: url("../img/warning.png") no-repeat; width: 16px; height: 16px; display: block; @@ -656,8 +664,8 @@ hr.dashedLine { cursor: pointer; } -.Error{ - background: url("../img/error.png") no-repeat; +.Error { + background: url("../img/error.png") no-repeat; width: 16px; height: 16px; display: block; @@ -667,49 +675,50 @@ hr.dashedLine { cursor: pointer; } -.bold{ - font-weight:bold; +.bold { + font-weight: bold; } -.boldRed{ - font-weight:bold; +.boldRed { + font-weight: bold; color: rgb(237, 28, 36); } -.unlockStatus{ - font-weight:bold; - font-size:1em; - color:rgb(218, 4, 0); +.unlockStatus { + font-weight: bold; + font-size: 1em; + color: rgb(218, 4, 0); text-align: center; } -table.miniSelect span { - width:20px; +table.miniSelect span { + width: 20px; } + /*###############################*/ #appLayout { height: 100%; } -#longList label{ +#longList label { float: left; width: 14%; margin: 0 15px 0 0; text-align: right; padding-top: 4px; - font-weight:bold; - height:20px; + font-weight: bold; + height: 20px; } #loadingOverlay { background: url("../img/loadingBar.gif") no-repeat 10px 23px; background-position: center center; - background-attachment:fixed; + background-attachment: fixed; font-family: Arial, Verdana, sans-serif; margin: 0; padding: 0; - z-index:999; - position:absolute; + z-index: 999; + position: absolute; } #loadingOverlay .loadingMessage { @@ -717,48 +726,50 @@ table.miniSelect span { color: rgb(153, 153, 153); } -#timings, #properties { +#timings, +#properties { padding: 0; overflow: hidden; } -#container{ - width:960px; +#container { + width: 960px; } -#mainMenu{ - margin-bottom:10px; +#mainMenu { + margin-bottom: 10px; } -#widgetWUInfoResponse{ - padding-left:10px; +#widgetWUInfoResponse { + padding-left: 10px; } -.unlockStatus{ - font-weight:bold; - font-size:1em; - color:rgb(218, 4, 0); +.unlockStatus { + font-weight: bold; + font-size: 1em; + color: rgb(218, 4, 0); text-align: center; } + /*CLASSES******************/ -.flat #userIcons .dijitArrowButtonInner{ - margin:5px auto 0 5px; +.flat #userIcons .dijitArrowButtonInner { + margin: 5px auto 0 5px; } -.holder :focus{ +.holder :focus { outline: none; } -.holder{ - width:40px; - height:60px; - float:left; +.holder { + width: 40px; + height: 60px; + float: left; } -.seperator{ - width:1px; - height:32px; - float:left; +.seperator { + width: 1px; + height: 32px; + float: left; margin-left: 4px; margin-top: 9px; margin-right: 12px; @@ -781,6 +792,7 @@ table.miniSelect span { .hpccWhite { background-color: rgb(255, 255, 255); } + /* Secondart colour palette */ .hpccGreyLight { background-color: rgb(188, 190, 192); @@ -842,29 +854,29 @@ table.miniSelect span { background-color: rgb(221, 191, 221); } -.grey{ +.grey { background-color: rgb(80, 80, 80); } -.white{ - background-color:rgb(255,255,255); +.white { + background-color: rgb(255, 255, 255); } -.left{ - float:left; +.left { + float: left; } -.right{ - float:right; +.right { + float: right; } -.hidden{ - color:rgb(214, 214, 214); +.hidden { + color: rgb(214, 214, 214); display: none !important; } -.show{ - display:block; +.show { + display: block; } .hpccApp { @@ -875,13 +887,13 @@ table.miniSelect span { background: #1A9BD7; } -.searchUserMoreComponents{ +.searchUserMoreComponents { display: flex; } -.navBarLoggedin{ +.navBarLoggedin { text-transform: uppercase; - color:rgb(255,255,255); + color: rgb(255, 255, 255); display: block; } @@ -889,8 +901,8 @@ table.miniSelect span { background-color: #2196F3; } -.hidden{ - color:rgb(214, 214, 214); +.hidden { + color: rgb(214, 214, 214); display: none !important; } @@ -898,17 +910,17 @@ table.miniSelect span { height: 100%; } -.toolTip{ -width:inherit; +.toolTip { + width: inherit; } -.toolTip img{ -vertical-align: middle; -margin-left:-20px; +.toolTip img { + vertical-align: middle; + margin-left: -20px; } -.pageOverlay{ +.pageOverlay { left: 0; top: 0; width: 100%; @@ -928,11 +940,11 @@ margin-left:-20px; } .TimingTreeMapWidget p { - padding-left:5px; + padding-left: 5px; } .dijitValidationTextBoxLabel { - width:170px; + width: 170px; text-align: left; } @@ -948,25 +960,25 @@ margin-left:-20px; width: auto; } -.iconAlign{ +.iconAlign { vertical-align: middle; } -.iconFilter{ +.iconFilter { background-image: url("../img/filter.png"); width: 16px; height: 16px; - border:none; - display:inline-block; + border: none; + display: inline-block; vertical-align: middle; } -.iconNoFilter{ +.iconNoFilter { background-image: url("../img/noFilter.png"); width: 16px; height: 16px; - border:none; - display:inline-block; + border: none; + display: inline-block; vertical-align: middle; } @@ -994,18 +1006,33 @@ margin-left:-20px; height: 16px; } -.iconAutoRefreshTrue{ +.iconAutoRefreshTrue { background-image: url("../img/autoRefresh.png"); width: 16px; height: 16px; - -webkit-animation:spin 4s linear infinite; - -moz-animation:spin 4s linear infinite; - animation:spin 4s linear infinite; + -webkit-animation: spin 4s linear infinite; + -moz-animation: spin 4s linear infinite; + animation: spin 4s linear infinite; } -@-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } } -@-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } } -@keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } } +@-webkit-keyframes spin { + 100% { + -webkit-transform: rotate(360deg); + } +} + +@-moz-keyframes spin { + 100% { + -moz-transform: rotate(360deg); + } +} + +@keyframes spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} .iconAutoRefreshDisabled { background-image: url("../img/autoRefresh_disabled.png"); @@ -1014,19 +1041,19 @@ margin-left:-20px; } .iconNewPage { - background-image: url("../img/openNewPage.png"); + background-image: url("../img/openNewPage.png"); width: 16px; height: 16px; } .iconMaximize { - background-image: url("../img/maximize.png"); + background-image: url("../img/maximize.png"); width: 16px; height: 16px; } .iconNewPageNoFrame { - background-image: url("../img/openNewPageNoFrame.png"); + background-image: url("../img/openNewPageNoFrame.png"); width: 16px; height: 16px; } @@ -1068,96 +1095,105 @@ margin-left:-20px; } .iconLogicalFile { - background-image: url("../img/logicalfile.png"); + background-image: url("../img/logicalfile.png"); width: 16px; height: 16px; } .iconLogicalFileDeleted { - background-image: url("../img/logicalfile_deleted.png"); + background-image: url("../img/logicalfile_deleted.png"); width: 16px; height: 16px; } .iconSuperFile { - background-image: url("../img/superfile.png"); + background-image: url("../img/superfile.png"); width: 16px; height: 16px; } .iconSuperFileDeleted { - background-image: url("../img/superfile_deleted.png"); + background-image: url("../img/superfile_deleted.png"); width: 16px; height: 16px; } /*WUSTATES*/ .iconWorkunit { - background-image: url("../img/workunit.png"); + background-image: url("../img/workunit.png"); width: 16px; height: 16px; display: inline-block; } -.iconCompiled, .iconCompleted{ - background-image: url("../img/workunit_completed.png"); +.iconCompiled, +.iconCompleted { + background-image: url("../img/workunit_completed.png"); width: 16px; height: 16px; display: inline-block; } -.iconRunning, .iconCompiling, .iconDebugRunning { - background-image: url("../img/workunit_running.png"); +.iconRunning, +.iconCompiling, +.iconDebugRunning { + background-image: url("../img/workunit_running.png"); width: 16px; - height: 16px; + height: 16px; display: inline-block; } -.iconFailed, .iconStateAborted{ - background-image: url("../img/workunit_failed.png"); +.iconFailed, +.iconStateAborted { + background-image: url("../img/workunit_failed.png"); width: 16px; height: 16px; display: inline-block; } -.iconArchived, .iconBlocked, .iconScheduled, .iconWait, .iconUploadingFiles, .iconDebugPaused{ - background-image: url("../img/workunit_warning.png"); +.iconArchived, +.iconBlocked, +.iconScheduled, +.iconWait, +.iconUploadingFiles, +.iconDebugPaused { + background-image: url("../img/workunit_warning.png"); width: 16px; height: 16px; display: inline-block; } -.iconAborting{ - background-image: url("../img/workunit_aborting.png"); +.iconAborting { + background-image: url("../img/workunit_aborting.png"); width: 16px; height: 16px; display: inline-block; } -.iconSubmitted{ - background-image: url("../img/workunit_submitted.png"); +.iconSubmitted { + background-image: url("../img/workunit_submitted.png"); width: 16px; height: 16px; display: inline-block; } -.iconArchived{ - background-image: url("../img/workunit_archived.png"); +.iconArchived { + background-image: url("../img/workunit_archived.png"); width: 16px; height: 16px; display: inline-block; } -.iconDeleted{ - background-image: url("../img/workunit_deleted.png"); +.iconDeleted { + background-image: url("../img/workunit_deleted.png"); width: 16px; height: 16px; display: inline-block; } -.iconCluster{ - background-image: url("../img/server.png"); +.iconCluster { + background-image: url("../img/server.png"); width: 16px; height: 16px; display: inline-block; @@ -1230,41 +1266,41 @@ margin-left:-20px; } .iconSync { - background-image: url("../img/sync.png"); + background-image: url("../img/sync.png"); width: 16px; height: 16px; } .iconSyncDisabled { - background-image: url("../img/sync_disabled.png"); + background-image: url("../img/sync_disabled.png"); width: 16px; height: 16px; } -.ErrorCell{ +.ErrorCell { background: red; color: white; } -.AlertCell{ +.AlertCell { background: #febe47; } -.WarningCell{ +.WarningCell { background: yellow; } -.NormalCell{ - background: rgba(0,181,0,1); +.NormalCell { + background: rgba(0, 181, 0, 1); } -.Prompt{ - font-weight:bold; +.Prompt { + font-weight: bold; white-space: nowrap; } .resultGridCell { - vertical-align:text-top; + vertical-align: text-top; font-family: monospace; } @@ -1287,31 +1323,31 @@ margin-left:-20px; } .flat .graph_Graph .graphVertex .common_Menu { - visibility:hidden; + visibility: hidden; } -.flat .graph_Graph .graphVertex > .subgraph { +.flat .graph_Graph .graphVertex>.subgraph { pointer-events: none; } -.flat .graph_Graph .graphVertex > .graph_Vertex * { +.flat .graph_Graph .graphVertex>.graph_Vertex * { cursor: pointer; } -.flat .graph_Graph .graphEdge > .graph_Edge * { +.flat .graph_Graph .graphEdge>.graph_Edge * { cursor: pointer; } -.flat .graph_Graph .graphVertex > .subgraph .title rect { +.flat .graph_Graph .graphVertex>.subgraph .title rect { fill: #dcf1ff; - border-bottom-width:0px; + border-bottom-width: 0px; } -.flat .graph_Graph .graphVertex > .subgraph .title text { +.flat .graph_Graph .graphVertex>.subgraph .title text { fill: black; } -.flat .graph_Graph .graphVertex > .subgraph rect { +.flat .graph_Graph .graphVertex>.subgraph rect { fill: none; } @@ -1324,44 +1360,44 @@ margin-left:-20px; fill: white; } -.flat .graph_Graph .graphVertex > .subgraph.selected rect { - stroke:red !important; +.flat .graph_Graph .graphVertex>.subgraph.selected rect { + stroke: red !important; } .flat .graph_Graph .graphVertex .graph_Vertex.selected .common_Shape { - stroke:red !important; + stroke: red !important; } .flat .graph_Graph .graphEdge .graph_Edge { - stroke:lightgray; + stroke: lightgray; } .flat .graph_Graph .graphEdge .graph_Edge .common_Text { - fill:lightgray; + fill: lightgray; } .flat .graph_Graph .graphEdge .graph_Edge.active { - stroke:green; + stroke: green; } .flat .graph_Graph .graphEdge .graph_Edge.active .common_Text { - fill:green; + fill: green; } .flat .graph_Graph .graphEdge .graph_Edge.finished { - stroke:black; + stroke: black; } .flat .graph_Graph .graphEdge .graph_Edge.finished .common_Text { - fill:black; + fill: black; } .flat .graph_Graph .graphEdge .graph_Edge.selected { - stroke:red !important; + stroke: red !important; } .flat .graph_Graph .graphEdge .graph_Edge.selected .common_Text { - fill:red !important; + fill: red !important; } .smallSelect .dijitSelectLabel { @@ -1371,18 +1407,18 @@ margin-left:-20px; } .dojoxUploaderFileListHeader th { - background-color:#eee; - padding:3px; + background-color: #eee; + padding: 3px; text-align: left; } .dojoxColorPicker { - padding:8px; - border-radius:4pt; - -moz-border-radius:4pt; - border-radius:5pt; - -webkit-border-radius:5pt; - -webkit-drop-shadow:3pt; + padding: 8px; + border-radius: 4pt; + -moz-border-radius: 4pt; + border-radius: 5pt; + -webkit-border-radius: 5pt; + -webkit-drop-shadow: 3pt; } .dojoxColorPickerRightPad { @@ -1390,90 +1426,99 @@ margin-left:-20px; } .tundra .dojoxColorPicker { - background:#ededed; - border:1px solid #ccc; + background: #ededed; + border: 1px solid #ccc; } .dojoxColorPickerBox { - position:relative; - width:150px; - height:150px; - margin:0; - padding:0; + position: relative; + width: 150px; + height: 150px; + margin: 0; + padding: 0; } .dojoxColorPickerUnderlay { - position:relative; - top:0; left:0; - width:150px; - height:150px; - z-index:1; + position: relative; + top: 0; + left: 0; + width: 150px; + height: 150px; + z-index: 1; } .tundra .dojoxColorPickerUnderlay { - border:1px solid #a0a0a0; + border: 1px solid #a0a0a0; } .claro .dojoxColorPicker { - background:#ededed; - border:1px solid #cdcdcd; + background: #ededed; + border: 1px solid #cdcdcd; } .claro .dojoxColorPickerUnderlay { - border:1px solid #cccccc; + border: 1px solid #cccccc; } .dojoxHuePickerUnderlay { - position:relative; - top:0; left:0; - height:150px; - width:20px; - z-index:1; + position: relative; + top: 0; + left: 0; + height: 150px; + width: 20px; + z-index: 1; text-align: center; } -.dojoxHuePicker { position:relative; top: 0px; left: 0px; padding: 0px;} +.dojoxHuePicker { + position: relative; + top: 0px; + left: 0px; + padding: 0px; +} .dojoxHuePickerPoint { - position:absolute; - top:0; left:0; - width:20px; - height:8px; - z-index:3; - cursor:move; + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 8px; + z-index: 3; + cursor: move; } .dojoxColorPickerPoint { - position:absolute; - width:10px; - height:10px; - border:0; - z-index:3; - cursor:move; + position: absolute; + width: 10px; + height: 10px; + border: 0; + z-index: 3; + cursor: move; } .dojoxColorPickerPreview { - display:block; - width:45px; - height:45px; - border:1px solid #333; - background-color:#fff; - position:relative; + display: block; + width: 45px; + height: 45px; + border: 1px solid #333; + background-color: #fff; + position: relative; top: 0px; - left: 0px; + left: 0px; } + .dojoxColorPickerWebSafePreview { - display:block; - width:25px; - height:25px; - position:relative; + display: block; + width: 25px; + height: 25px; + position: relative; top: 0px; - left: 0px; - border:1px solid #333; + left: 0px; + border: 1px solid #333; } .dojoxColorPickerOptional { - position:relative; + position: relative; top: 0px; left: 0px; height: 100%; @@ -1488,57 +1533,50 @@ margin-left:-20px; } .dojoxColorPickerOptional input { - border:1px solid #a7a7a7; - width:25px; - padding:1px 3px 1px 3px; - line-height:1.1em; + border: 1px solid #a7a7a7; + width: 25px; + padding: 1px 3px 1px 3px; + line-height: 1.1em; } .dojoxColorPickerHex input { - width:55px; + width: 55px; } .dojoxUpgradeBar { - position:absolute; - left:0; - top:0; - width:100%; - height:32px; - overflow:hidden; - z-index:100; - background:#f3f2af; - box-shadow:0 2px 6px #444; - -webkit-box-shadow:0 1px 6px #444; - -moz-box-shadow:0 1px 6px #444; - font-size:.8em; + position: absolute; + left: 0; + top: 0; + width: 100%; + overflow: hidden; + z-index: 100; + background: #f3f2af; + box-shadow: 0 2px 6px #444; + -webkit-box-shadow: 0 1px 6px #444; + -moz-box-shadow: 0 1px 6px #444; } .dj_ie .dojoxUpgradeBar { - border-bottom:#665F48 2px solid; + border-bottom: #665F48 2px solid; } -.dojoxUpgradeBarMessage { - position:absolute; - padding-left:10px; - top:50%; - margin-top:-.75em; - left:5px; - width:100%; -} -.dojoxUpgradeBarMessage a{ - margin-left:10px; + +.dojoxUpgradeBarMessage a { + margin-left: 10px; } + .dojoxUpgradeBarReminderButton { - position:absolute; - top:25%; - margin-right:50px; - font-size:11px; - text-decoration:underline; - text-align:right; - cursor:pointer; - right:-20px; + position: absolute; + top: 25%; + margin-right: 50px; + font-size: 11px; + text-decoration: underline; + text-align: right; + cursor: pointer; + right: -20px; } + .dj_ie6 .dojoxUpgradeBarReminderButton { - margin-top:2px; + margin-top: 2px; } .dojoxUpgradeBarCloseIcon { @@ -1551,14 +1589,17 @@ margin-left:-20px; width: 15px; cursor: pointer; } + .dj_ie6 .dojoxUpgradeBarCloseIcon { - background : url("../../node_modules/dijit/themes/tundra/images/tabClose.gif") no-repeat right top; + background: url("../../node_modules/dijit/themes/tundra/images/tabClose.gif") no-repeat right top; } + .dojoxUpgradeBarCloseIcon-hover { background: url("../../node_modules/dijit/themes/tundra/images/tabCloseHover.png") no-repeat right top; } + .dj_ie6 .dojoxUpgradeBarCloseIcon-hover { - background : url("../../node_modules/dijit/themes/tundra/images/tabCloseHover.gif") no-repeat right top; + background: url("../../node_modules/dijit/themes/tundra/images/tabCloseHover.gif") no-repeat right top; } .dojoxTreeMap { @@ -1623,65 +1664,65 @@ margin-left:-20px; z-index: 20; } -.dojoxTreeMapGroup.dojoxTreeMapSelected{ - border:2px dashed red; +.dojoxTreeMapGroup.dojoxTreeMapSelected { + border: 2px dashed red; } .dj_iequircks .dojoxTreeMapIEHack.dojoxTreeMapSelected, -.dj_ie7 .dojoxTreeMapIEHack.dojoxTreeMapSelected + div, -.dj_ie8 .dojoxTreeMapIEHack.dojoxTreeMapSelected + div { - border: 1px solid red; +.dj_ie7 .dojoxTreeMapIEHack.dojoxTreeMapSelected+div, +.dj_ie8 .dojoxTreeMapIEHack.dojoxTreeMapSelected+div { + border: 1px solid red; z-index: 20; } /* main classes for dojox.widget.Toaster */ .dijitToasterContent { - padding:1em; - padding-top:0.25em; - background:#73c74a; + padding: 1em; + padding-top: 0.25em; + background: #73c74a; } -.dijitToasterMessage{ - color:#fff; +.dijitToasterMessage { + color: #fff; } .dijitToasterWarning, .dijitToasterError, -.dijitToasterFatal{ - font-weight:bold; - color:#fff; +.dijitToasterFatal { + font-weight: bold; + color: #fff; } -.dijitToasterWarning .dijitToasterContent{ - background:#d4d943; -} +.dijitToasterWarning .dijitToasterContent { + background: #d4d943; +} -.dijitToasterError .dijitToasterContent{ - background:#c46600; +.dijitToasterError .dijitToasterContent { + background: #c46600; } /* imported from dijit.css */ - + .dijitToasterClip { - position: absolute; - z-index: 949; - overflow: hidden; + position: absolute; + z-index: 949; + overflow: hidden; } .dijitToasterContainer { - display: block; - position: absolute; - width: 17.5em; - margin: 0px; - font:0.75em; + display: block; + position: absolute; + width: 17.5em; + margin: 0px; + font: 0.75em; } button.clippy img { - margin:0px 0 0; - padding:0px; - width:13px; - height:16px; + margin: 0px 0 0; + padding: 0px; + width: 13px; + height: 16px; } .eclwatch_WUGraph_Tooltip table { @@ -1699,14 +1740,14 @@ button.clippy img { .dijitIcon.fa { font-family: "FontAwesome"; - color:#2D97D6; + color: #2D97D6; min-width: 16px; min-height: 16px; } span.dijitReset.dijitInline.dijitIcon.fa.disabled { font-family: "FontAwesome"; - color:darkgray; + color: darkgray; min-width: 16px; min-height: 16px; } @@ -1756,8 +1797,8 @@ span.dijitReset.dijitInline.dijitIcon.fa.disabled { .flat .fui-FluentProvider .dijitToolbar, .flat .fui-FluentProvider .dijitContentPane, .flat .fui-FluentProvider .dijitToolbar .dijitToggleButtonChecked .dijitButtonNode, -.flat .fui-FluentProvider .dgrid-header, -.flat .fui-FluentProvider .dgrid-header-row, +.flat .fui-FluentProvider .dgrid-header, +.flat .fui-FluentProvider .dgrid-header-row, .flat .fui-FluentProvider .dgrid-footer { background-color: inherit; } @@ -1781,7 +1822,7 @@ span.dijitReset.dijitInline.dijitIcon.fa.disabled { } .flat:has(.fui-FluentProvider) .dijitPopup { - background-color: var(--white); + background-color: var(--white, white); } .flat-dark:has(.fui-FluentProvider) .dijitPopup { diff --git a/esp/src/package-lock.json b/esp/src/package-lock.json index 975eaaae4d4..220d8863655 100644 --- a/esp/src/package-lock.json +++ b/esp/src/package-lock.json @@ -1,7 +1,7 @@ { "name": "eclwatch", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,17 +9,17 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@fluentui/react": "8.110.2", - "@fluentui/react-components": "9.21.0", - "@fluentui/react-experiments": "8.14.90", - "@fluentui/react-hooks": "8.6.27", - "@fluentui/react-icons-mdl2": "1.3.45", + "@fluentui/react": "8.110.7", + "@fluentui/react-components": "9.23.1", + "@fluentui/react-experiments": "8.14.95", + "@fluentui/react-hooks": "8.6.29", + "@fluentui/react-icons-mdl2": "1.3.47", "@hpcc-js/chart": "2.81.4", "@hpcc-js/codemirror": "2.60.9", "@hpcc-js/common": "2.71.9", - "@hpcc-js/comms": "2.82.3", + "@hpcc-js/comms": "2.83.1", "@hpcc-js/dataflow": "8.1.4", - "@hpcc-js/eclwatch": "2.73.18", + "@hpcc-js/eclwatch": "2.73.20", "@hpcc-js/graph": "2.85.5", "@hpcc-js/html": "2.42.10", "@hpcc-js/layout": "2.49.9", @@ -153,22 +153,22 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", - "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", + "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" }, "node_modules/@floating-ui/dom": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz", - "integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.3.tgz", + "integrity": "sha512-nB/68NyaQlcdY22L+Fgd1HERQ7UGv7XFN+tPxwrEfQL4nKtAP/jIZnZtpUlXbtV+VEGHh6W/63Gy2C5biWI3sA==", "dependencies": { - "@floating-ui/core": "^1.2.6" + "@floating-ui/core": "^1.3.1" } }, "node_modules/@fluentui/date-time-utilities": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.5.12.tgz", - "integrity": "sha512-N4Dt7MDJiEASF73hz1kWkNfGLdGa+joi+f1b5Pi57PI4SBpZ89OGumT+Z/iyuYwcTdz5aVeq03wTJkLdJQo2Gg==", + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.5.13.tgz", + "integrity": "sha512-X3clbPKh0URkDj21QoARw6SNec7dWg7Gt7SkTlkVYFzmZUdC4ZIrYk3n36xKe3U1wcGp26EVmKjhAhB262ugpw==", "dependencies": { "@fluentui/set-version": "^8.2.11", "tslib": "^2.1.0" @@ -192,25 +192,25 @@ } }, "node_modules/@fluentui/font-icons-mdl2": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.21.tgz", - "integrity": "sha512-B4w1jx/gNxDI/AbVwZtmcvb/5lG8HngWVwsDDtP2ZM4HEFZduY1XrQMak5mP1O9lTEpQKD+kv+uK70ocsfpUig==", + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.23.tgz", + "integrity": "sha512-jZjUtfQm9/84jX34zhwwsoZME86xXXgKAgBYuMvRStKzXGdZcd7YSOlmuT8lbISmtFL/SWwUGOEal1nLCUNeNA==", "dependencies": { "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/utilities": "^8.13.16", + "@fluentui/style-utilities": "^8.9.16", + "@fluentui/utilities": "^8.13.18", "tslib": "^2.1.0" } }, "node_modules/@fluentui/foundation-legacy": { - "version": "8.2.41", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.41.tgz", - "integrity": "sha512-HgLWOjNwC0FkV9kN283E8AzGmswFJbu7AKQ+cyefPnOUdH3iopD2oW7Lqz7QBzIPgMV/8FHE+nCa2ZEbhvFPGg==", + "version": "8.2.43", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.43.tgz", + "integrity": "sha512-rXr71KxNcWDH2LmTsFZbP75p8HssLlVLaFAqEdLE+sKf/LNKmqkDVTNhDbHZxzxy0QnguI4aNHcyGhMZUH3MPA==", "dependencies": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/utilities": "^8.13.16", + "@fluentui/style-utilities": "^8.9.16", + "@fluentui/utilities": "^8.13.18", "tslib": "^2.1.0" }, "peerDependencies": { @@ -244,30 +244,30 @@ } }, "node_modules/@fluentui/priority-overflow": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.0.3.tgz", - "integrity": "sha512-lOUfZX3PMyb+nHWcNGQu+EBz2cvRxHgTObG97UTmGBB0nL0cEJCqVL7PKVWhto7zp3moSgRUWyUN/EQVVpZ/hg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.1.1.tgz", + "integrity": "sha512-wYCZbGHrApTaVnlpvWkgIy/NPSyexl7pRO14lSo9LW9dDcojiHI3KWtpRxO3/tf6LtHuUBNe/+vonGJUsSI68w==", "dependencies": { "@swc/helpers": "^0.4.14" } }, "node_modules/@fluentui/react": { - "version": "8.110.2", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.110.2.tgz", - "integrity": "sha512-xCAUaKs20LlhHHeNba+Vkq28xfkWnzHcWrXtiFFt2q9fKo8QnlnLdrqmmVKAcMH59lxH5o2I1CkMa+6zpE30iA==", + "version": "8.110.7", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.110.7.tgz", + "integrity": "sha512-3sn4HZL10jghiYFF+Ouc7pNDJ5pR2ueU6ZY1IdmVFgYXTJJ/IwQhVc37mXVf8VoUM7hF4vRcGE4z+loNTpTX0w==", "dependencies": { - "@fluentui/date-time-utilities": "^8.5.12", - "@fluentui/font-icons-mdl2": "^8.5.21", - "@fluentui/foundation-legacy": "^8.2.41", + "@fluentui/date-time-utilities": "^8.5.13", + "@fluentui/font-icons-mdl2": "^8.5.23", + "@fluentui/foundation-legacy": "^8.2.43", "@fluentui/merge-styles": "^8.5.12", - "@fluentui/react-focus": "^8.8.28", - "@fluentui/react-hooks": "^8.6.27", + "@fluentui/react-focus": "^8.8.30", + "@fluentui/react-hooks": "^8.6.29", "@fluentui/react-portal-compat-context": "^9.0.6", "@fluentui/react-window-provider": "^2.2.15", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/theme": "^2.6.32", - "@fluentui/utilities": "^8.13.16", + "@fluentui/style-utilities": "^8.9.16", + "@fluentui/theme": "^2.6.34", + "@fluentui/utilities": "^8.13.18", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" }, @@ -279,18 +279,18 @@ } }, "node_modules/@fluentui/react-accordion": { - "version": "9.1.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.1.16.tgz", - "integrity": "sha512-nfvmDIbZU7Ioe3HU4TnRTLowgNS6ZrJOM0CVRtbxM3F0NAUqigjVnwWXnNyXHWSWKkzKVcF9CYvxQavtnvh2fg==", - "dependencies": { - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.20", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.1.20.tgz", + "integrity": "sha512-bzlLLaOFZ+1K86eq+1mZ1goxqNSbU3m6+P3d9EZYKdZ+Hp0uMqWYayDUeFUBuWIZkN/x8llvtjg8ypYWsO5ivA==", + "dependencies": { + "@fluentui/react-aria": "^9.3.25", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -303,17 +303,17 @@ } }, "node_modules/@fluentui/react-alert": { - "version": "9.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.51.tgz", - "integrity": "sha512-0LR4ThWBZO3hA7n7yluvzm3ytE8QRj+WHVdmg21Iu6f8S9EECcMmOwN4TINzXuuyKBbjERl3heuqjeriRLzANg==", - "dependencies": { - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-button": "^9.3.16", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.0.0-beta.55", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.55.tgz", + "integrity": "sha512-GcJvDI3HfRpWa8f0WgkgTuRiLPe91A41LsvWqjMSNpBPKcTv/zYTP7oabCGgHLwU9RgPzRsxhfAbTb9okaL++g==", + "dependencies": { + "@fluentui/react-avatar": "^9.5.9", + "@fluentui/react-button": "^9.3.20", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -325,12 +325,12 @@ } }, "node_modules/@fluentui/react-aria": { - "version": "9.3.22", - "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.3.22.tgz", - "integrity": "sha512-H/WUp2TKg9XkF5B12Vpv1NN2/UPoV6NTgZZtsHs1kaZvHiBwhgODE5f8DFyUhoWUH4577r5X1kxjlEmfIvg5gw==", + "version": "9.3.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.3.25.tgz", + "integrity": "sha512-KFOEPrur6HIW4NknYLMbuXE44BIefYvitqR3r7Qw84vcMf8AEgenHxuzdHkUr+el6gJYRGZIOF0Nb//rOYJKzQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-utilities": "^9.10.0", "@swc/helpers": "^0.4.14" }, "peerDependencies": { @@ -341,20 +341,20 @@ } }, "node_modules/@fluentui/react-avatar": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.5.5.tgz", - "integrity": "sha512-p9CwOxa7+AoMGSa/WPYY7NvgjuSYe54+F4OcuhoM5FVktPPmlDuwXkc7Z/Ud9AiEoqK1z2kUuqizW4k0cVqP0A==", - "dependencies": { - "@fluentui/react-badge": "^9.1.15", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-popover": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-tooltip": "^9.2.16", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.5.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.5.9.tgz", + "integrity": "sha512-otRBNU7YbT1gnVQMFzLxApeAtsmlnKY0MwCpPYCQE5h9UcUcHHOowOSSThqMDUxzcYTyBmnoBjkm5NadGrOtlA==", + "dependencies": { + "@fluentui/react-badge": "^9.1.18", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-popover": "^9.7.3", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-tooltip": "^9.2.20", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -367,15 +367,15 @@ } }, "node_modules/@fluentui/react-badge": { - "version": "9.1.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.1.15.tgz", - "integrity": "sha512-CgxKzG0Kbm7GRewWn583nTxY41maSLpf99WOaa8TjaFjRx2SdWwh4qPrJj9NxnkqgItdS80ck1NnoSdoF0WueA==", - "dependencies": { - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.18", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.1.18.tgz", + "integrity": "sha512-lZkR9wIxhzjDr/s3n2sq6jy3B6ExypiRKPQmlNGQEyyMP/52zkUNtqk0tSM8+/mfJYh/yrqcjM45L6qHT65Vxw==", + "dependencies": { + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -387,18 +387,18 @@ } }, "node_modules/@fluentui/react-button": { - "version": "9.3.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.16.tgz", - "integrity": "sha512-fZ5hkmA/RIcke1/lt2YW4q2dyWHgF330yayu3JuR4nhmFqKM/eZFdwQS4mYDBCMkllcbBeeF69lRKGftQ6MX0A==", + "version": "9.3.20", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.20.tgz", + "integrity": "sha512-89ATJHBjBB67lKt/oFRew6J5LAHTC/Rdng7Y/WDhJRzsYXZzkhh3JulSGbZ6x5SKy2F8t6gpGTgHiXk01yWWHg==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-aria": "^9.3.25", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -410,15 +410,15 @@ } }, "node_modules/@fluentui/react-card": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.14.tgz", - "integrity": "sha512-HifE4x+kREZmeXD6YqtcpFIas12RoymeZFDyRx5iy58/H6sL6wwKHchoF5QGWGsQq7In+6QFfoWUPxWou46yMQ==", + "version": "9.0.18", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.18.tgz", + "integrity": "sha512-ziNaayISbwSG8Ybi3tZM84138AhDJQvlwbYdDY+Ku7REncwzj2UAOLVhV01wps8pQ4vYmR3wFYD/7vwBCUxmHA==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -430,18 +430,18 @@ } }, "node_modules/@fluentui/react-checkbox": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.1.17.tgz", - "integrity": "sha512-qgH292TTOBlWGViLtMn4MxJxPaCJHoF1zuygMRgIb988E6W5NUpRZPbROKDyiAYDhAf8S9h1sL6ZkCwff03Bbw==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.1.21.tgz", + "integrity": "sha512-wjFnyP0v25VOJlcfCUn3X/8viaMcOyES3ty7zOqCRdJGkIDXl8Gz8djj23sEDG346AmovvbXH1iEN545anuEIw==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-label": "^9.1.18", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -453,20 +453,20 @@ } }, "node_modules/@fluentui/react-combobox": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.4.0.tgz", - "integrity": "sha512-VFPY56PsoyYSdEgH2VsgOGIvwP6FqJ1+YIs77VFL20ZJteI0Escs9KqLukpPrEdQSfNoysKSZA6ntmt6t2rB+w==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.4.4.tgz", + "integrity": "sha512-onoo6X0Td65FNqSwb9K1DtAluQ/ErLltOtuNVbfvaYOpyC5mC3jHuxRDbB3WtkdpjpvxdrKB/bshr6ntXN0mTg==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-portal": "^9.2.16", + "@fluentui/react-positioning": "^9.7.2", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -479,54 +479,54 @@ } }, "node_modules/@fluentui/react-components": { - "version": "9.21.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.21.0.tgz", - "integrity": "sha512-SysBfRH7dCgfLC/HmyEcwuZFs/RjsNjlY5rTiKjdmQcHVb/mkXvNZD7uMdcDU9zHAkk9ZkV0/45EtDJaw95cTQ==", - "dependencies": { - "@fluentui/react-accordion": "^9.1.16", - "@fluentui/react-alert": "9.0.0-beta.51", - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-badge": "^9.1.15", - "@fluentui/react-button": "^9.3.16", - "@fluentui/react-card": "^9.0.14", - "@fluentui/react-checkbox": "^9.1.17", - "@fluentui/react-combobox": "^9.4.0", - "@fluentui/react-dialog": "^9.5.9", - "@fluentui/react-divider": "^9.2.15", - "@fluentui/react-drawer": "9.0.0-beta.1", - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-image": "^9.1.12", - "@fluentui/react-infobutton": "9.0.0-beta.34", - "@fluentui/react-input": "^9.4.16", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-link": "^9.0.42", - "@fluentui/react-menu": "^9.7.16", - "@fluentui/react-overflow": "^9.0.19", - "@fluentui/react-persona": "^9.2.15", - "@fluentui/react-popover": "^9.6.0", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-progress": "^9.1.16", - "@fluentui/react-provider": "^9.7.2", - "@fluentui/react-radio": "^9.1.17", - "@fluentui/react-select": "^9.1.16", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-skeleton": "^9.0.4", - "@fluentui/react-slider": "^9.1.17", - "@fluentui/react-spinbutton": "^9.2.16", - "@fluentui/react-spinner": "^9.2.2", - "@fluentui/react-switch": "^9.1.17", - "@fluentui/react-table": "^9.3.0", - "@fluentui/react-tabs": "^9.3.17", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-text": "^9.3.12", - "@fluentui/react-textarea": "^9.3.16", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-toolbar": "^9.1.17", - "@fluentui/react-tooltip": "^9.2.16", - "@fluentui/react-tree": "9.0.0-beta.18", - "@fluentui/react-utilities": "^9.9.2", - "@fluentui/react-virtualizer": "9.0.0-alpha.22", + "version": "9.23.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.23.1.tgz", + "integrity": "sha512-Wnvh44hPShegdlbcU1zlKkS0Sve7HURggtXzQ6LfbjwS3qwzugZYjhl+v9xXSGyQxAfQkV2LuTSGil1ZAKfiYA==", + "dependencies": { + "@fluentui/react-accordion": "^9.1.20", + "@fluentui/react-alert": "9.0.0-beta.55", + "@fluentui/react-avatar": "^9.5.9", + "@fluentui/react-badge": "^9.1.18", + "@fluentui/react-button": "^9.3.20", + "@fluentui/react-card": "^9.0.18", + "@fluentui/react-checkbox": "^9.1.21", + "@fluentui/react-combobox": "^9.4.4", + "@fluentui/react-dialog": "^9.5.13", + "@fluentui/react-divider": "^9.2.18", + "@fluentui/react-drawer": "9.0.0-beta.5", + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-image": "^9.1.15", + "@fluentui/react-infobutton": "9.0.0-beta.38", + "@fluentui/react-input": "^9.4.19", + "@fluentui/react-label": "^9.1.18", + "@fluentui/react-link": "^9.0.46", + "@fluentui/react-menu": "^9.8.3", + "@fluentui/react-overflow": "^9.0.22", + "@fluentui/react-persona": "^9.2.19", + "@fluentui/react-popover": "^9.7.3", + "@fluentui/react-portal": "^9.2.16", + "@fluentui/react-positioning": "^9.7.2", + "@fluentui/react-progress": "^9.1.19", + "@fluentui/react-provider": "^9.7.6", + "@fluentui/react-radio": "^9.1.21", + "@fluentui/react-select": "^9.1.19", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-skeleton": "^9.0.7", + "@fluentui/react-slider": "^9.1.21", + "@fluentui/react-spinbutton": "^9.2.19", + "@fluentui/react-spinner": "^9.2.5", + "@fluentui/react-switch": "^9.1.21", + "@fluentui/react-table": "^9.4.3", + "@fluentui/react-tabs": "^9.3.21", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-text": "^9.3.15", + "@fluentui/react-textarea": "^9.3.19", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-toolbar": "^9.1.21", + "@fluentui/react-tooltip": "^9.2.20", + "@fluentui/react-tree": "9.0.0-beta.22", + "@fluentui/react-utilities": "^9.10.0", + "@fluentui/react-virtualizer": "9.0.0-alpha.25", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -539,11 +539,11 @@ } }, "node_modules/@fluentui/react-context-selector": { - "version": "9.1.22", - "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.22.tgz", - "integrity": "sha512-iPXjx8QkEc8kV2YdAz7z17phb+ZDDDecRz/DygI7qdiZPtPTyJxZoelpzA8jb6cbz1+P7kzlbaNz9It24+a0qA==", + "version": "9.1.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.25.tgz", + "integrity": "sha512-aoEtOFTS2XZlEgdzXBYJCvm8ykr28ZFbgmGb0umoY9pwPiwtqO1hQMoQ8djOK0fDIeOiERKfZuvheHTTO+i4Ww==", "dependencies": { - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-utilities": "^9.10.0", "@swc/helpers": "^0.4.14" }, "peerDependencies": { @@ -555,20 +555,20 @@ } }, "node_modules/@fluentui/react-dialog": { - "version": "9.5.9", - "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.5.9.tgz", - "integrity": "sha512-6kZafolihGDggZjH30rjwFBE/QDxTqRpHRLaPur5WBzGv0wkXyYLCVKomFUH4pN0fCPZ8tT7vy1Tm4GAe9SYMw==", + "version": "9.5.13", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.5.13.tgz", + "integrity": "sha512-JAXnEeAZbCJkpGmE2FDL4sn6zhAZSPsU7HrbNm+D0/wwC152imLUQeBmIQOwwk3fTsRZqkSb4iFj7YQp3rabig==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-aria": "^9.3.25", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-portal": "^9.2.16", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -580,14 +580,14 @@ } }, "node_modules/@fluentui/react-divider": { - "version": "9.2.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.15.tgz", - "integrity": "sha512-AHGFkd/g4hBQX5WmFyG9WKisnvloPS7aJuI8zIBPcJ8LQdaDhQKMdXenIBTknOm4mnnUG4ytPZVAijVhb/yxgQ==", - "dependencies": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.2.18", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.18.tgz", + "integrity": "sha512-iBBHSzf5znfSjCwA+B9a+Wy2ctUYNwLxswtn/CN15f8PKbVm6SZ5FehAZwQadA9X5HKMatk3eUcUIcsMyCijag==", + "dependencies": { + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -599,15 +599,15 @@ } }, "node_modules/@fluentui/react-drawer": { - "version": "9.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.0.0-beta.1.tgz", - "integrity": "sha512-lFlkMI2iJbFKhxLYZQLM+bDtCgg9x2VkznJx62yclcBOJ/BI2k1w7sQ3RBHl/VPxFJCdm5KpuyHDcuR86VJunA==", - "dependencies": { - "@fluentui/react-dialog": "^9.5.9", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.0.0-beta.5.tgz", + "integrity": "sha512-i57n6/ltCqziQ08xMw5Gw2htcLB3oyV2Fn0N4GaBkQA0R7Rvv3X1TKEgRy5Nksa8Jr24p3rx/1SNpB1EZwrXKw==", + "dependencies": { + "@fluentui/react-dialog": "^9.5.13", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -619,20 +619,20 @@ } }, "node_modules/@fluentui/react-experiments": { - "version": "8.14.90", - "resolved": "https://registry.npmjs.org/@fluentui/react-experiments/-/react-experiments-8.14.90.tgz", - "integrity": "sha512-HrwyY1ALt+vwYBSFIswdZZz/cTgsRfDZMRAjEPVp8fE+xTsq2i2RRMmfHgzbXE2ODFXFgLrEO3BitLd7A5p+VQ==", + "version": "8.14.95", + "resolved": "https://registry.npmjs.org/@fluentui/react-experiments/-/react-experiments-8.14.95.tgz", + "integrity": "sha512-JByRyCPmwBMobpyL2hJPEu+ZRftUVpnn5uPsjHfCI1I1g9YHma2BlDHdgl2BT+DJaI6e7i9Kl+z4JhyDMylRNg==", "dependencies": { "@fluentui/example-data": "^8.4.11", - "@fluentui/font-icons-mdl2": "^8.5.21", - "@fluentui/foundation-legacy": "^8.2.41", + "@fluentui/font-icons-mdl2": "^8.5.23", + "@fluentui/foundation-legacy": "^8.2.43", "@fluentui/merge-styles": "^8.5.12", - "@fluentui/react": "^8.110.2", - "@fluentui/react-hooks": "^8.6.27", + "@fluentui/react": "^8.110.7", + "@fluentui/react-hooks": "^8.6.29", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/theme": "^2.6.32", - "@fluentui/utilities": "^8.13.16", + "@fluentui/style-utilities": "^8.9.16", + "@fluentui/theme": "^2.6.34", + "@fluentui/utilities": "^8.13.18", "@microsoft/load-themed-styles": "^1.10.26", "deep-assign": "^2.0.0", "prop-types": "^15.7.2", @@ -646,16 +646,16 @@ } }, "node_modules/@fluentui/react-field": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.6.tgz", - "integrity": "sha512-vJqh8AFvo1G3gxHJglv5TyRgD1P+qEmN9BNaQvnr8sj+iquGDs3Mf7hal5rT+PetuF6Owrh6g0mOrzkaJMyTcQ==", - "dependencies": { - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.9.tgz", + "integrity": "sha512-Q6u/OdfvcvT4vrG0RRlS/+TkTTFoHP8H5ckIQzsMwxLYUzrWaMYDjL43t5unl101qNopftIcSb9P3jkEBKv8Ow==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-label": "^9.1.18", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -667,15 +667,15 @@ } }, "node_modules/@fluentui/react-focus": { - "version": "8.8.28", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.28.tgz", - "integrity": "sha512-gdBASqKW41tWnrNj3B3WQqYGXqnPOGZvQz9AILCY4g1oWv2QoQV1xRhVmzu6V/vJzUZDqOVyD/RseumGmIh8Yg==", + "version": "8.8.30", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.30.tgz", + "integrity": "sha512-dKQQtNTZbQOE+u/Tmh7AbtJPSpzQNI0L8o55a22y4U7s33rizUd++CIiToXsB+bPvlotcmpZswZQ8V06zM4KIw==", "dependencies": { "@fluentui/keyboard-key": "^0.4.11", "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/utilities": "^8.13.16", + "@fluentui/style-utilities": "^8.9.16", + "@fluentui/utilities": "^8.13.18", "tslib": "^2.1.0" }, "peerDependencies": { @@ -684,13 +684,13 @@ } }, "node_modules/@fluentui/react-hooks": { - "version": "8.6.27", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.27.tgz", - "integrity": "sha512-4Thtr8LgM3/aGExWrIFtTfPX1sHirPTD9DxEkD2/GOPniN/dFBKYp0q1eyMkRu2/KXV6HUVyQL9hK+yfD9sIQQ==", + "version": "8.6.29", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.29.tgz", + "integrity": "sha512-MeVevmGJtrYxdhoarrkVWE0Hs4XdzOc9A3tiOjMBIcwOvoOYOAoOELoHK/wuulPVwUn2R9Y+7JpJ6oCe4ImdJw==", "dependencies": { "@fluentui/react-window-provider": "^2.2.15", "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.16", + "@fluentui/utilities": "^8.13.18", "tslib": "^2.1.0" }, "peerDependencies": { @@ -711,13 +711,13 @@ } }, "node_modules/@fluentui/react-icons-mdl2": { - "version": "1.3.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.45.tgz", - "integrity": "sha512-4YkrbCGC3k47uEH32p1yWF6ZfbSZkLlcUYIExIlnlaO6k4XCEgGzsvAkdF96xo98dQp3lp8bwjrBs+Q+rTTnjg==", + "version": "1.3.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.47.tgz", + "integrity": "sha512-sLNVmXryaaEyU6WHxCZTD8pJDCauihB95YsFFl7OUgdqA0w9YW9gqmOCykQO37Sh17ZBYJhuvp3ug4ozgiQfkA==", "dependencies": { - "@fluentui/react-icon-provider": "^1.3.42", + "@fluentui/react-icon-provider": "^1.3.44", "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.16", + "@fluentui/utilities": "^8.13.18", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" }, @@ -726,12 +726,12 @@ } }, "node_modules/@fluentui/react-icons-mdl2/node_modules/@fluentui/react-icon-provider": { - "version": "1.3.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-icon-provider/-/react-icon-provider-1.3.42.tgz", - "integrity": "sha512-OlR7Mdoa9+8QFJQuYNX7CDg4gXByShLBaeRGS7F7UHm0ZJMbrqjOsqyqDcgdHNVZiW3/i0p6aslpioe3jJB5gQ==", + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@fluentui/react-icon-provider/-/react-icon-provider-1.3.44.tgz", + "integrity": "sha512-/RboAO8Odsk9Yld80hcq0Dmu5QXCPND5lD9i7NkHS+l8+2JI5wsCRFIu5YfKmVuV32a9MiSa80Rnh5Rw+6WCuA==", "dependencies": { "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", + "@fluentui/style-utilities": "^8.9.16", "tslib": "^2.1.0" }, "peerDependencies": { @@ -742,14 +742,14 @@ } }, "node_modules/@fluentui/react-image": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.12.tgz", - "integrity": "sha512-NI77BzDNO8wJJ0sDM9g86YC6cI1DH/hJQTqlHaXG8vRwM81qXrsPAqc/7Y9Jh+CBOe408E8d83yrEvoXUfj5cA==", - "dependencies": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.15.tgz", + "integrity": "sha512-tN0KgO7V2FtZVehiEOQlJ8lJt3nfT+mX7uPnaheuxpMP2T+k1tudpybIy2IOKLhGqgxNHZqso6M6NaSP5NCEbQ==", + "dependencies": { + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -761,17 +761,17 @@ } }, "node_modules/@fluentui/react-infobutton": { - "version": "9.0.0-beta.34", - "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.34.tgz", - "integrity": "sha512-0EhZ1iBFPbq1KH4dNTG3bB74fkzK5KLdBCaWlF1mGQyzGE5W1ukpn16Tr9Ul1O6tc8uAgTIJxf/VwRQO3amdjQ==", - "dependencies": { - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-popover": "^9.6.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.38.tgz", + "integrity": "sha512-AOXiB+fhW+4nJHucImnG+yRU8nF2RkL8Lw3BJWKJOxjN7GJkrRTXvp5KGv1k3oMxC/FOoZj5hAFNXKclkGct1A==", + "dependencies": { + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-label": "^9.1.18", + "@fluentui/react-popover": "^9.7.3", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -783,15 +783,15 @@ } }, "node_modules/@fluentui/react-input": { - "version": "9.4.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.16.tgz", - "integrity": "sha512-xbeV9jG3C99NOFT89pIQR+P2vpIll2Cm4/Iio/Gu5+86Epa9Wv0aeRRmEYskVWMp69dl7LKqs7bkhpvKYOmu+w==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.4.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.19.tgz", + "integrity": "sha512-T0/qpQeBBi9zlRLmIn6p85qImTaFNeRcs3WM75Hqi8lEIJTTd0SLHlN6spRvoCJbGQT0eWJ91bY6eoo5TqjhrA==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -803,11 +803,11 @@ } }, "node_modules/@fluentui/react-jsx-runtime": { - "version": "9.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.0-alpha.6.tgz", - "integrity": "sha512-in382HEVLAHfTVelJ0H+X5tpenydXe/8eaVTk64X/P48uLcye6MZBQG1jhUxCnRL7ZNu7bB8ya1VXF0GsdTt0g==", + "version": "9.0.0-alpha.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.0-alpha.9.tgz", + "integrity": "sha512-j54GCJpFGJc0ilB0zJEnakTefYLx0nEOtb8HEkctRB1fVLcjmxdz46t3pjHS3oA3AW/pdOSFPPHWPbNOcaG2vg==", "dependencies": { - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-utilities": "^9.10.0", "@swc/helpers": "^0.4.14" }, "peerDependencies": { @@ -816,14 +816,14 @@ } }, "node_modules/@fluentui/react-label": { - "version": "9.1.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.15.tgz", - "integrity": "sha512-LGPdzlOi6tasfFHqa+N3l9lgAQfipBniVpa0dd9IiGjNvx15ZZPGSSjGs6KkMiPxkIMizJN26OGZ8bXbR3ObgQ==", - "dependencies": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.18", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.18.tgz", + "integrity": "sha512-XYuCA1Ek8sfrMgigGkBXnucqmLvSZwuGK52vgdWdakY8LjmRK3k5knYse250bAkp19URdeB7jw/uyLZ/42NkOA==", + "dependencies": { + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -835,15 +835,15 @@ } }, "node_modules/@fluentui/react-link": { - "version": "9.0.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.0.42.tgz", - "integrity": "sha512-PJYSUbxikQQVq01v0UwT5hfaZ0jT/aUDvnLDrH96boY8SOyh1zyTIFbrjnOvgLpFeoE4rO+koXb0mVxBW5t4yg==", + "version": "9.0.46", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.0.46.tgz", + "integrity": "sha512-w+F0+U0VfIsYxi9eYT715VRG8umWaWrqdC/RQ9u40GZ1WRqDSW76a5KQuDQeuGkXiJhC4k+P/XqwObF+8F5fbQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -855,21 +855,21 @@ } }, "node_modules/@fluentui/react-menu": { - "version": "9.7.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.7.16.tgz", - "integrity": "sha512-iVbBlFpQRO8STLa5cLF4v4wYdfPTVZsT27+E7JYhA1nmHJI8pwED22sTCVSPIGXVT58I5N8aVnQS4o6qf1YMmQ==", + "version": "9.8.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.8.3.tgz", + "integrity": "sha512-jNvoT+0pdn59Gi917fKRr4KsTuI6HBdXAThQRwioAfrrGkW1U3f+IYZuBx3RpuduaUYfMZEiwI0sp64t+xZAyg==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-aria": "^9.3.25", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-portal": "^9.2.16", + "@fluentui/react-positioning": "^9.7.2", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -882,14 +882,14 @@ } }, "node_modules/@fluentui/react-overflow": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.0.19.tgz", - "integrity": "sha512-78bHljbIUiIkS9Qhdq7SSwefl7mUb92ps9N72P+AYz2oJITEXZyDtgt2LF7Ktb9qWTx1IOis4GzGeskhTTRZsw==", - "dependencies": { - "@fluentui/priority-overflow": "^9.0.3", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.0.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.0.22.tgz", + "integrity": "sha512-joicJvRnp5dJPX7mqSPjTmUCI2/3JeFU70ro7qhj0jNg9x9kZY8E83cdpvM+KsA8O7BcEc07bM6Sa+7Oyj8StQ==", + "dependencies": { + "@fluentui/priority-overflow": "^9.1.1", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -902,16 +902,16 @@ } }, "node_modules/@fluentui/react-persona": { - "version": "9.2.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.15.tgz", - "integrity": "sha512-7CZ8H6cTomHA2iGtjscFoGoJO0oHVTnf56IZahoo34V06QLZnnIfotDv+t1B+20tv6e2pEpdZOJqp/bD9AjpFQ==", - "dependencies": { - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-badge": "^9.1.15", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.2.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.19.tgz", + "integrity": "sha512-GtkK4La3Gzi5lG36lTwjE47Fm4dLL97tT0irdKELDTjoTPy5pVsjZTuTVTmajt8n9p8rs0wf4AHpwikG6MyfSg==", + "dependencies": { + "@fluentui/react-avatar": "^9.5.9", + "@fluentui/react-badge": "^9.1.18", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -923,20 +923,20 @@ } }, "node_modules/@fluentui/react-popover": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.6.0.tgz", - "integrity": "sha512-0OAjUICqP7UqNm0tMT+AfVs7OWmITfPThUsvEUJmQQsmFhAmHCgwIt5QwdLv5z5IGe+ZDWL8GBAkAgflECDcgw==", + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.7.3.tgz", + "integrity": "sha512-Ry7wZ3wNbQlIk2JqUelM8ZkA8KXhCi+lVYK6syiNMWC2WseMgeIPLI8CVhDK4sBVV+ga5VXhFtkb9u4XpLFlkQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-aria": "^9.3.25", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-portal": "^9.2.16", + "@fluentui/react-positioning": "^9.7.2", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -949,13 +949,13 @@ } }, "node_modules/@fluentui/react-portal": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.2.12.tgz", - "integrity": "sha512-VEdd8v/12p+oIY37ZYf3FCqW2H7q/mwbcieDJI9NeziZoN/zQYPQgyU3bXh/OsafC5vnIIwbNhV/jKFOaKhqow==", + "version": "9.2.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.2.16.tgz", + "integrity": "sha512-vQHuW+k0MtTO8bVtTc2DegsEkvhgI2yp/TxXkwQzNheL4gBTvHlKY/TDpZ1Ud9gqEYMeyYfDFksvB3Wf99Ei6A==", "dependencies": { - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14", "use-disposable": "^1.0.1" @@ -980,14 +980,14 @@ } }, "node_modules/@fluentui/react-positioning": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.6.0.tgz", - "integrity": "sha512-Sx1gXj2SMm+iF0bTDhevsCZkR6QpvBFuvJ8P447ts/1pN+XT9vXq/WJsrIbCLqK7TLeT9Xxl0rjevGoTt9yaSw==", + "version": "9.7.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.7.2.tgz", + "integrity": "sha512-hwhuQpfq9iNndt9TUiE/cGZaJKlY+keAamUmklRcQCTwy16oA2m9QHMLE8kVPhEFRRE1oq3Yapq5sXIsGN9Oew==", "dependencies": { "@floating-ui/dom": "^1.2.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -999,15 +999,15 @@ } }, "node_modules/@fluentui/react-progress": { - "version": "9.1.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.16.tgz", - "integrity": "sha512-eVmKu1HcocQaDythgTZgSSzXt+f8NW6fOCdDX5hTG0Xug/5ohpBcbuumhNiZNTxyWHgN4l6ZzPr+h4jyHZdmvQ==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.19.tgz", + "integrity": "sha512-EL0mT6UfTwdaeLGWJ1QL/FOzOhP1KbWtd9YLrj0g5haaN6EzuoBHszs7Xhmgh5IwgvT8kkr8HFmZDOTNLvHgLA==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1019,15 +1019,15 @@ } }, "node_modules/@fluentui/react-provider": { - "version": "9.7.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.7.2.tgz", - "integrity": "sha512-/D98JvSv8O7fEIv+h05LeWI9YeLw6azLSVG+9nhlETUXRVaLs0tPD94WF8hmFat9YE9CtWDcj/v502WpU/Dwdg==", - "dependencies": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.7.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.7.6.tgz", + "integrity": "sha512-dYSEqbahpPsvGcV1A1P3T8vAu03mIVS/OojIYmGIKwiRtb9e+wAAQizckQQ+hb5DsMX0BktUaAaW0sGZrOipVA==", + "dependencies": { + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/core": "^1.11.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" @@ -1040,18 +1040,18 @@ } }, "node_modules/@fluentui/react-radio": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.1.17.tgz", - "integrity": "sha512-bmpGBmYzkN0G/XbtT+slxU9BsltdmcS2wTIYgkNT1SipHzd5oFErMs4j1zjS6kgIYOfNe3N+fAMB2THR6iB13Q==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.1.21.tgz", + "integrity": "sha512-AW90PugncKq//fQ9MhgUBjcWCjgEyjBXW6fBECl52lVMZkCAalg4scoCFFY8hjRdlwdyxvMqeltQMiWQkEen5Q==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-label": "^9.1.18", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1064,16 +1064,16 @@ } }, "node_modules/@fluentui/react-select": { - "version": "9.1.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.16.tgz", - "integrity": "sha512-LDM+wOA91FDNuvkCJZrb8cQsG5/pG7gYDjBAsRQ1SSuxmKAEx5PcPM6QwmDaU7l6E6rcMI7dndzcB94LqehzZg==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.19.tgz", + "integrity": "sha512-sbwE8vsrO6N7JGcBTo4IwkKVQHIrGhj8EYmngmNJwaDsOD9OxlJ9S2OOCSGHjSkRVeizRW70JLzmnn7YwL0qCQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1085,11 +1085,11 @@ } }, "node_modules/@fluentui/react-shared-contexts": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.5.0.tgz", - "integrity": "sha512-7mPrXx81eudpwloO44VREXc710RtZrzmQVw91EGJeTUfMRdg2MgjNGcwG6C3x+K0RkAgdQ8RAMfR3MSbCQvILA==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.5.1.tgz", + "integrity": "sha512-n5gsYr372h39Y2+mqqQGi2u4bgmJgQL4aoQOf+wilC5g+g22s+3RHR3y0/dFi3plMiloioQh7ULN6FJgLvfYpQ==", "dependencies": { - "@fluentui/react-theme": "^9.1.8", + "@fluentui/react-theme": "^9.1.9", "@swc/helpers": "^0.4.14" }, "peerDependencies": { @@ -1098,15 +1098,15 @@ } }, "node_modules/@fluentui/react-skeleton": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.4.tgz", - "integrity": "sha512-ImGcbjpI5URcG4v5PfCOS/PZgEBVHhMBJ9HEyLriQMjUgT8QgTiwg+y9JRA+uPq4siioffRkElOqKqJHZLRMlg==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.7.tgz", + "integrity": "sha512-/C3lDH42rVdBuPsAtcv3JbhJMxMUcZuy2PA7QQ/QJtIeOfVLdg5G0Ud6bt+jUKeBI/E/W/afxEGefR5emUFJpQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1118,16 +1118,16 @@ } }, "node_modules/@fluentui/react-slider": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.17.tgz", - "integrity": "sha512-2gg3JKyPb8O3bpsAEwoFLGMf6ZFeXvsvxtpHh0mbH6rVR6yazPAW0zSPGS+Y7xPw///A9iup8R9Ar46dWctlrw==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.21.tgz", + "integrity": "sha512-uiSDFz6oLXTbZjJIMPnvrMJfwu2pnGtynrRwoeN15OaPphrZ5rDiVWRS+qlGkeOtRLOrzkKV/RPv/o3LC77v+Q==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1139,17 +1139,17 @@ } }, "node_modules/@fluentui/react-spinbutton": { - "version": "9.2.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.16.tgz", - "integrity": "sha512-PO3IcV11evj0WFYQ5ntY05ISDtIRAE8E9Q0qe27lWGRDXEeuqRrydfbZuF02rLb6IzNAV+QYXXntxXcO/+ofLA==", + "version": "9.2.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.19.tgz", + "integrity": "sha512-6sSpRHg9AWM1xjLNfRK/1/aAwc5PdozziGdhKGeMUrBRmNfuKh2iZ6XwCgRAVpJkkgRyUw9PjLXBx9s1xPDVAg==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1161,15 +1161,15 @@ } }, "node_modules/@fluentui/react-spinner": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.2.2.tgz", - "integrity": "sha512-QVzWLUbTZA/pIhmj3/6KYmS66S+cnVmtb4DXT1WbHFtjxaVNhbYzRPiEKqEv9uvXQdVDcWR55aAVGYtTa/AXpQ==", - "dependencies": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.2.5.tgz", + "integrity": "sha512-6pWlKJEE9eW6+9pJiaUJ8+NvaiKLxtG3B3jyIFFukuV/3U0kDtxMJ25ESsdzOc8L1wDHO6CDNnoMyEh+w5clyg==", + "dependencies": { + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-label": "^9.1.18", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1181,18 +1181,18 @@ } }, "node_modules/@fluentui/react-switch": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.17.tgz", - "integrity": "sha512-6lmzvASB2BIWy+bld29V+fNCQJZbUDxWhjni2fRz6g4mynIROB1zgqNa1E7wJMjx32c4PZCmJAQo3PomZTOi7w==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.21.tgz", + "integrity": "sha512-iPOWmpLyP5TPQXk7S2s0NkAmnLeF7UOgEXPWmMGzyiFLYHSdrHXGqyzW66HLioikfzmJHlnnJIyfo6Dy3X/fyQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-label": "^9.1.18", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1204,22 +1204,22 @@ } }, "node_modules/@fluentui/react-table": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.3.0.tgz", - "integrity": "sha512-KikpnQwXOYVtLVdYUH9DWxSUCL+zUzcAvizFOPbkfyi2PRh510Huftz1JATDp303SSLJyJZ/BpOiQ9fWNGbnCg==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.4.3.tgz", + "integrity": "sha512-v7btoMYk2vam4EMTQ17cEPRQDeoIdxvbGlobgfo5bpUrBDmIwpF8wT2YJLMxDtlkLqttUVwcu8t9BLXkSWzD0w==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-checkbox": "^9.1.17", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-radio": "^9.1.17", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-aria": "^9.3.25", + "@fluentui/react-avatar": "^9.5.9", + "@fluentui/react-checkbox": "^9.1.21", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-radio": "^9.1.21", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1231,16 +1231,16 @@ } }, "node_modules/@fluentui/react-tabs": { - "version": "9.3.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.3.17.tgz", - "integrity": "sha512-Eh8ga30dvr8OuqaZm2+B9dOCozIlvkzwXdE2+gF0AyrbWcnTg5R4s4s+qYVAzUyGnTtHrSmIVzwPxSDn/ZY3bA==", - "dependencies": { - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.3.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.3.21.tgz", + "integrity": "sha512-nzg/Emm+CqxZRD0RuKfmXvzUHogqibstybQRK3Fbd7iPNHTxLWNoDMrDlTW7zJx0xRQRxIdlP2NXfUoD0NAorA==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1253,17 +1253,17 @@ } }, "node_modules/@fluentui/react-tabster": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.7.5.tgz", - "integrity": "sha512-1dQEDAzhurKup+DLA4xRktVBDdxnx5xXo2h0TXTuHtVOk59QheQewlTzYR5i0UHtTN3hTyo04AguLg8nnzgbTw==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.9.1.tgz", + "integrity": "sha512-FF9SMPiQlMdeyyZKYrjKoFUhxTg2R6b34JgEZTwI22LMlln1u6AUMfU9OpJMeBTYLGrlz9QkuM7/RoaofkGY0g==", "dependencies": { - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14", "keyborg": "^2.0.0", - "tabster": "^4.4.2" + "tabster": "^4.5.1" }, "peerDependencies": { "@types/react": ">=16.8.0 <19.0.0", @@ -1273,14 +1273,14 @@ } }, "node_modules/@fluentui/react-text": { - "version": "9.3.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.3.12.tgz", - "integrity": "sha512-h4Mq4nKslIi8TR9ysn4Cy1AYtg9j896qQ2HZiTYZmGP9HYCqF3X/3A7ce0eyZimrcXn1zl4iaR6t1LUFRqOC5Q==", - "dependencies": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.3.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.3.15.tgz", + "integrity": "sha512-ClK7T9T7/Il0qXuW8akIcLQ9SS5EzzDUTT9L5+oVEI/Xo0dmYvvKaFpsNc4eJBWl8IZGkqkbnXTebATjcuuVow==", + "dependencies": { + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1292,15 +1292,15 @@ } }, "node_modules/@fluentui/react-textarea": { - "version": "9.3.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.16.tgz", - "integrity": "sha512-hMccy65V4QTBMJCI3jR79+nGKh+vIQi+5pdmhEsAZ5fjODDvi/JViGf12MDxbKnmSz1IHKhFayvdhNlt41nQRg==", - "dependencies": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.3.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.19.tgz", + "integrity": "sha512-H7sQoUDPs2WGOxoMmPAFImyWl9Ez234BZK0lPKfWFW2Bhyb+Hx0aCwfvCqRWM9y0GobWiciusBfuD/11N9pDkw==", + "dependencies": { + "@fluentui/react-field": "^9.1.9", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1312,28 +1312,28 @@ } }, "node_modules/@fluentui/react-theme": { - "version": "9.1.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.8.tgz", - "integrity": "sha512-KXSPSfg29sHEHw9rFpZjKTU4KwY4F4kxZIcqA83Kz8Khnfw17NiWmz8XcmxXaMUlqfwVRxBIM9um2uFE5gjcpw==", + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.9.tgz", + "integrity": "sha512-xzcc8uhNyVEqy5XGqbKE4Obg/8sFj356L8scBJdYq+iIAySmu0SRn8qvfLajzVDayqCgEfZ64h1qmeS1K//R1w==", "dependencies": { - "@fluentui/tokens": "1.0.0-alpha.5", + "@fluentui/tokens": "1.0.0-alpha.6", "@swc/helpers": "^0.4.14" } }, "node_modules/@fluentui/react-toolbar": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.17.tgz", - "integrity": "sha512-+i3B/CCA3yMAWuFU5Tg3fex2UEK0yw60gw8M4zzbK/AOzej2AXoH0lU2SIWzN7Y/zDWyzYHMWH+Uj1YQD3DSjw==", - "dependencies": { - "@fluentui/react-button": "^9.3.16", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-divider": "^9.2.15", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-radio": "^9.1.17", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "version": "9.1.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.21.tgz", + "integrity": "sha512-hgOV/DzKmB0DaKlMgLNP7/yErhIpytY/fc6V1aniX2kqJHpkoltvTdlyAvSzz07Wa3eL+p/aqZerX3SzC0oZKg==", + "dependencies": { + "@fluentui/react-button": "^9.3.20", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-divider": "^9.2.18", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-radio": "^9.1.21", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1345,17 +1345,17 @@ } }, "node_modules/@fluentui/react-tooltip": { - "version": "9.2.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.2.16.tgz", - "integrity": "sha512-R1DhKCILILzSLCJPig01KqKhqnEH91NoBjHwCfwua8qE9neWUwSD3JSO+dmEfbxFTPfCkrkPrbnuCXb8imu2ig==", + "version": "9.2.20", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.2.20.tgz", + "integrity": "sha512-2ZYntqCHHOhASGac077+rACIzQDAEr4R/B3vxWnJSnmLq4BcNZxBuCmqt6pavg/pDWq35UjtJ7/wLPML7fwL8g==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-portal": "^9.2.16", + "@fluentui/react-positioning": "^9.7.2", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1367,22 +1367,22 @@ } }, "node_modules/@fluentui/react-tree": { - "version": "9.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.0.0-beta.18.tgz", - "integrity": "sha512-ILbm+REJhuYXV88XXyL31Vwqx9vo/LLQE/pOom0iAjG+P6FYm8w1YemSJ+1IQ5PAkKUbfnYWTujx1fLEdXHNAQ==", + "version": "9.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.0.0-beta.22.tgz", + "integrity": "sha512-tTWFlLxn/DsNxpV3QP/h5Boq63s6XwNtVSfUX0KsCwJHTqKf4WcBj85WTpbIakm4FG4v5GySblHXP1KcxpUMpg==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-button": "^9.3.16", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-aria": "^9.3.25", + "@fluentui/react-avatar": "^9.5.9", + "@fluentui/react-button": "^9.3.20", + "@fluentui/react-context-selector": "^9.1.25", + "@fluentui/react-icons": "^2.0.203", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-portal": "^9.2.16", + "@fluentui/react-shared-contexts": "^9.5.1", + "@fluentui/react-tabster": "^9.9.1", + "@fluentui/react-theme": "^9.1.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1394,9 +1394,9 @@ } }, "node_modules/@fluentui/react-utilities": { - "version": "9.9.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.9.2.tgz", - "integrity": "sha512-jFUI11aTpk+EbVm3zYWJwW57Wz4TbR0RSoNPqERpSiOCw4tTEd1Xp4PiBWeknhreXsYwSdrxYBGMXOKIrY3zdg==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.10.0.tgz", + "integrity": "sha512-pMpvRSEKpSSEAdozu2w3MTmJ2+B0/4L5aNQ2lTURvrbicmZfhs4YMo64A2J3ICZedb4H4vPkv6xWe5BgFTHXWA==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.3", "@swc/helpers": "^0.4.14" @@ -1407,12 +1407,12 @@ } }, "node_modules/@fluentui/react-virtualizer": { - "version": "9.0.0-alpha.22", - "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.22.tgz", - "integrity": "sha512-w/86u6MwZGo11kwAT32dCLstd23No7BhHJzo0HO13A4rjjN6vUrdh6NTKzyAxRcdHJp0hVG+TJMbs8oWZo2Bww==", + "version": "9.0.0-alpha.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.25.tgz", + "integrity": "sha512-H00BoYtNQYgeq4wzRxjVF60L9PDF77nHiQ3rIb92fpbgb9AEktwLUbcVtJF2lM6xj7EUb7rsvzDve03hgbMkog==", "dependencies": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-utilities": "^9.9.2", + "@fluentui/react-jsx-runtime": "9.0.0-alpha.9", + "@fluentui/react-utilities": "^9.10.0", "@griffel/react": "^1.5.7", "@swc/helpers": "^0.4.14" }, @@ -1445,26 +1445,26 @@ } }, "node_modules/@fluentui/style-utilities": { - "version": "8.9.14", - "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.14.tgz", - "integrity": "sha512-On48B9biXgV6PgimFdSwRuYLzue9PjwqxT31UP3w5uvwANL+Hqile5AbkR5g9RartoJiDIk1bHAP7QQkqI1jEg==", + "version": "8.9.16", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.16.tgz", + "integrity": "sha512-8hS5HscCFYvcWjAdk37frPZJZthr7f/cu5db7gjrPy+DEhf13WAZRHsropWm17+8GhJhvKt98BQf/Kzxtt34Eg==", "dependencies": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/theme": "^2.6.32", - "@fluentui/utilities": "^8.13.16", + "@fluentui/theme": "^2.6.34", + "@fluentui/utilities": "^8.13.18", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" } }, "node_modules/@fluentui/theme": { - "version": "2.6.32", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.32.tgz", - "integrity": "sha512-UkDsCdQQTQb7Ib+tux2Octz3opTvnRDknXoVnC6yluQVd6ugM8eWDUphOgB7Vnsf1Ou7EhPKdIN6OHXHXuoIyA==", + "version": "2.6.34", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.34.tgz", + "integrity": "sha512-2Ssi3sX2snnbPJ4PmxbpCDCGePRE36tvGj2qKgdKiSh/fPVsg1b+Q50YlpFl9sXmbhl1uFmxjAx6WPsVGTl7vQ==", "dependencies": { "@fluentui/merge-styles": "^8.5.12", "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.16", + "@fluentui/utilities": "^8.13.18", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1473,17 +1473,17 @@ } }, "node_modules/@fluentui/tokens": { - "version": "1.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.5.tgz", - "integrity": "sha512-4xCNP/tmeDywmo+PoFqDaUADSvNNzoZHVknC4D77S1RWxVuYmcM15eumKcVRrDuW3wS8eEX4/ZsIlDfqAhnU8g==", + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.6.tgz", + "integrity": "sha512-3fF2rWSltn4HUdg3Q1Sb9qS6gCT6XsCDeEgbwMt93BWT2qu3cn8n4IQKbeqT/WUv4yd1AhMt7D8JUze2A1I9Kg==", "dependencies": { "@swc/helpers": "^0.4.14" } }, "node_modules/@fluentui/utilities": { - "version": "8.13.16", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.16.tgz", - "integrity": "sha512-NAz7892Fjf4SNj7QCXuL/WGaZHc5GfCkT2trRFAhduSDXTib1dFANmS/yH2u9dH+27WAtu9pD9p9KbEhrWK4MQ==", + "version": "8.13.18", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.18.tgz", + "integrity": "sha512-/0rX9EzltLKwU1SS14VV7agWoOzruVTU3oagZq1QgFAvoj8qi7fNqvSX/VEeRy+0gmbsCkrEViUPkmC7drKzPg==", "dependencies": { "@fluentui/dom-utilities": "^2.2.11", "@fluentui/merge-styles": "^8.5.12", @@ -1569,9 +1569,9 @@ } }, "node_modules/@hpcc-js/comms": { - "version": "2.82.3", - "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.82.3.tgz", - "integrity": "sha512-Y0VVHI7Ex96gWpXJFls0rz5aonL/2HNIqohtPOcTVmI59vZLyc9tayOLMatcT0j6aHCAHs01tbVtd4Q24+O/Ow==", + "version": "2.83.1", + "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.83.1.tgz", + "integrity": "sha512-mBhHT0bggh9vxOOJbFjlsJpkr+/lYTmZVl6JhfLaUWYkp45vwAWXejYkaUJZtirmqe1YzuQu8FhEy2HB6EDyCA==", "dependencies": { "@hpcc-js/ddl-shim": "^2.20.3", "@hpcc-js/util": "^2.50.3", @@ -1582,14 +1582,6 @@ "tmp": "0.2.1" } }, - "node_modules/@hpcc-js/comms/node_modules/@hpcc-js/util": { - "version": "2.50.3", - "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.50.3.tgz", - "integrity": "sha512-zgwLaBnpXBJRd4RUYV/MHe2rP329tz4NR8/g5T7W6/VXlPBXR6fbZzy35Zsf7xv4yiTtTN27hi/7cgU5J3HOjA==", - "dependencies": { - "tslib": "2.4.1" - } - }, "node_modules/@hpcc-js/comms/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1609,11 +1601,6 @@ } ] }, - "node_modules/@hpcc-js/comms/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, "node_modules/@hpcc-js/dataflow": { "version": "8.1.4", "resolved": "https://registry.npmjs.org/@hpcc-js/dataflow/-/dataflow-8.1.4.tgz", @@ -1658,13 +1645,13 @@ } }, "node_modules/@hpcc-js/eclwatch": { - "version": "2.73.18", - "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.73.18.tgz", - "integrity": "sha512-KTxIlVr9CLLlJ8v+wmttSARUZsM4ftIi0ZZOzGewm/HXagb4gUPfyQuB6A7A8LsYXJNnYhT3ctzr9Xzv9OvtEg==", + "version": "2.73.20", + "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.73.20.tgz", + "integrity": "sha512-Ju/byvVB15sNlhlQi1h8bBWU0tmRpbLvlQl7c2zMTpDt0pXGz5O1ecI5ktcxZ7AEq94q58vgDqu6q6F1ZrnO9g==", "dependencies": { "@hpcc-js/codemirror": "^2.60.9", "@hpcc-js/common": "^2.71.9", - "@hpcc-js/comms": "^2.82.3", + "@hpcc-js/comms": "^2.83.1", "@hpcc-js/dgrid": "^2.32.9", "@hpcc-js/graph": "^2.85.5", "@hpcc-js/layout": "^2.49.9", @@ -8288,9 +8275,9 @@ } }, "node_modules/tabster": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/tabster/-/tabster-4.5.0.tgz", - "integrity": "sha512-o89Vm0QYK79fQPD6344hFhxSxxK6HCU5yW2FSkOWMpSNtYTuw1YWVfvKlcK1NMwm112f3TCT/sCFsgFQmvaing==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-4.6.0.tgz", + "integrity": "sha512-JTgjk0dPKjK3cfG3ZZVcLYnsZQAaK7cx6E8LpCNzCxrcKmPVVVtwrskUtX8oQqCnk7H1X36oxRRFlbJGGThLtw==", "dependencies": { "keyborg": "^2.0.0", "tslib": "^2.3.1" @@ -9117,6926 +9104,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@75lb/deep-merge": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", - "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", - "dev": true, - "requires": { - "lodash.assignwith": "^4.2.0", - "typical": "^7.1.1" - } - }, - "@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", - "dev": true - }, - "@floating-ui/core": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", - "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" - }, - "@floating-ui/dom": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz", - "integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==", - "requires": { - "@floating-ui/core": "^1.2.6" - } - }, - "@fluentui/date-time-utilities": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.5.12.tgz", - "integrity": "sha512-N4Dt7MDJiEASF73hz1kWkNfGLdGa+joi+f1b5Pi57PI4SBpZ89OGumT+Z/iyuYwcTdz5aVeq03wTJkLdJQo2Gg==", - "requires": { - "@fluentui/set-version": "^8.2.11", - "tslib": "^2.1.0" - } - }, - "@fluentui/dom-utilities": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.2.11.tgz", - "integrity": "sha512-2tXfg7/9PXu9nfU72/P3o3waHEFEQtHUfQbVexUaYqNNAxMj6sOfsqpUx4vd5nPgO+grSWrl+spqlLN2yej51w==", - "requires": { - "@fluentui/set-version": "^8.2.11", - "tslib": "^2.1.0" - } - }, - "@fluentui/example-data": { - "version": "8.4.11", - "resolved": "https://registry.npmjs.org/@fluentui/example-data/-/example-data-8.4.11.tgz", - "integrity": "sha512-MWUA9AY0pd4bCLCEP69USmFj+jKK61W1ZGW1h1VbEw5v6eMg65mmT+lbJhHivlYw/TZo7x4GRTvOx4XTIShCUQ==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@fluentui/font-icons-mdl2": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.21.tgz", - "integrity": "sha512-B4w1jx/gNxDI/AbVwZtmcvb/5lG8HngWVwsDDtP2ZM4HEFZduY1XrQMak5mP1O9lTEpQKD+kv+uK70ocsfpUig==", - "requires": { - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/utilities": "^8.13.16", - "tslib": "^2.1.0" - } - }, - "@fluentui/foundation-legacy": { - "version": "8.2.41", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.41.tgz", - "integrity": "sha512-HgLWOjNwC0FkV9kN283E8AzGmswFJbu7AKQ+cyefPnOUdH3iopD2oW7Lqz7QBzIPgMV/8FHE+nCa2ZEbhvFPGg==", - "requires": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/utilities": "^8.13.16", - "tslib": "^2.1.0" - } - }, - "@fluentui/keyboard-key": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.4.11.tgz", - "integrity": "sha512-TVB/EloWado9AVp1niChgcdDOQAHGP5B30Dinmtfe7zi8OnstwPoxwFP6dHJDdpLQ6ZEUTaEHViSzvewl7Chag==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@fluentui/keyboard-keys": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@fluentui/keyboard-keys/-/keyboard-keys-9.0.3.tgz", - "integrity": "sha512-40KBVJ9HzsvmPL3rwYaAvxCacNS0xnTmOt6TLxxrAVgVrZ1X7DLgd8OGFZcWROs0dhHdCk2D51bl4nK8Q1r3mQ==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/merge-styles": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.5.12.tgz", - "integrity": "sha512-ZnUo0YuMP7AYi68dkknFqVxopIAgbrUnqR/MZlemmRvBYyy1SMj1WQeHcoiLFA8mF8YKn7B+jxQgJbN2bfcrRw==", - "requires": { - "@fluentui/set-version": "^8.2.11", - "tslib": "^2.1.0" - } - }, - "@fluentui/priority-overflow": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.0.3.tgz", - "integrity": "sha512-lOUfZX3PMyb+nHWcNGQu+EBz2cvRxHgTObG97UTmGBB0nL0cEJCqVL7PKVWhto7zp3moSgRUWyUN/EQVVpZ/hg==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react": { - "version": "8.110.2", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.110.2.tgz", - "integrity": "sha512-xCAUaKs20LlhHHeNba+Vkq28xfkWnzHcWrXtiFFt2q9fKo8QnlnLdrqmmVKAcMH59lxH5o2I1CkMa+6zpE30iA==", - "requires": { - "@fluentui/date-time-utilities": "^8.5.12", - "@fluentui/font-icons-mdl2": "^8.5.21", - "@fluentui/foundation-legacy": "^8.2.41", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/react-focus": "^8.8.28", - "@fluentui/react-hooks": "^8.6.27", - "@fluentui/react-portal-compat-context": "^9.0.6", - "@fluentui/react-window-provider": "^2.2.15", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/theme": "^2.6.32", - "@fluentui/utilities": "^8.13.16", - "@microsoft/load-themed-styles": "^1.10.26", - "tslib": "^2.1.0" - } - }, - "@fluentui/react-accordion": { - "version": "9.1.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.1.16.tgz", - "integrity": "sha512-nfvmDIbZU7Ioe3HU4TnRTLowgNS6ZrJOM0CVRtbxM3F0NAUqigjVnwWXnNyXHWSWKkzKVcF9CYvxQavtnvh2fg==", - "requires": { - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-alert": { - "version": "9.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.51.tgz", - "integrity": "sha512-0LR4ThWBZO3hA7n7yluvzm3ytE8QRj+WHVdmg21Iu6f8S9EECcMmOwN4TINzXuuyKBbjERl3heuqjeriRLzANg==", - "requires": { - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-button": "^9.3.16", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-aria": { - "version": "9.3.22", - "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.3.22.tgz", - "integrity": "sha512-H/WUp2TKg9XkF5B12Vpv1NN2/UPoV6NTgZZtsHs1kaZvHiBwhgODE5f8DFyUhoWUH4577r5X1kxjlEmfIvg5gw==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-utilities": "^9.9.2", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-avatar": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.5.5.tgz", - "integrity": "sha512-p9CwOxa7+AoMGSa/WPYY7NvgjuSYe54+F4OcuhoM5FVktPPmlDuwXkc7Z/Ud9AiEoqK1z2kUuqizW4k0cVqP0A==", - "requires": { - "@fluentui/react-badge": "^9.1.15", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-popover": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-tooltip": "^9.2.16", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-badge": { - "version": "9.1.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.1.15.tgz", - "integrity": "sha512-CgxKzG0Kbm7GRewWn583nTxY41maSLpf99WOaa8TjaFjRx2SdWwh4qPrJj9NxnkqgItdS80ck1NnoSdoF0WueA==", - "requires": { - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-button": { - "version": "9.3.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.16.tgz", - "integrity": "sha512-fZ5hkmA/RIcke1/lt2YW4q2dyWHgF330yayu3JuR4nhmFqKM/eZFdwQS4mYDBCMkllcbBeeF69lRKGftQ6MX0A==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-card": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.14.tgz", - "integrity": "sha512-HifE4x+kREZmeXD6YqtcpFIas12RoymeZFDyRx5iy58/H6sL6wwKHchoF5QGWGsQq7In+6QFfoWUPxWou46yMQ==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-checkbox": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.1.17.tgz", - "integrity": "sha512-qgH292TTOBlWGViLtMn4MxJxPaCJHoF1zuygMRgIb988E6W5NUpRZPbROKDyiAYDhAf8S9h1sL6ZkCwff03Bbw==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-combobox": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.4.0.tgz", - "integrity": "sha512-VFPY56PsoyYSdEgH2VsgOGIvwP6FqJ1+YIs77VFL20ZJteI0Escs9KqLukpPrEdQSfNoysKSZA6ntmt6t2rB+w==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-components": { - "version": "9.21.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.21.0.tgz", - "integrity": "sha512-SysBfRH7dCgfLC/HmyEcwuZFs/RjsNjlY5rTiKjdmQcHVb/mkXvNZD7uMdcDU9zHAkk9ZkV0/45EtDJaw95cTQ==", - "requires": { - "@fluentui/react-accordion": "^9.1.16", - "@fluentui/react-alert": "9.0.0-beta.51", - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-badge": "^9.1.15", - "@fluentui/react-button": "^9.3.16", - "@fluentui/react-card": "^9.0.14", - "@fluentui/react-checkbox": "^9.1.17", - "@fluentui/react-combobox": "^9.4.0", - "@fluentui/react-dialog": "^9.5.9", - "@fluentui/react-divider": "^9.2.15", - "@fluentui/react-drawer": "9.0.0-beta.1", - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-image": "^9.1.12", - "@fluentui/react-infobutton": "9.0.0-beta.34", - "@fluentui/react-input": "^9.4.16", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-link": "^9.0.42", - "@fluentui/react-menu": "^9.7.16", - "@fluentui/react-overflow": "^9.0.19", - "@fluentui/react-persona": "^9.2.15", - "@fluentui/react-popover": "^9.6.0", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-progress": "^9.1.16", - "@fluentui/react-provider": "^9.7.2", - "@fluentui/react-radio": "^9.1.17", - "@fluentui/react-select": "^9.1.16", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-skeleton": "^9.0.4", - "@fluentui/react-slider": "^9.1.17", - "@fluentui/react-spinbutton": "^9.2.16", - "@fluentui/react-spinner": "^9.2.2", - "@fluentui/react-switch": "^9.1.17", - "@fluentui/react-table": "^9.3.0", - "@fluentui/react-tabs": "^9.3.17", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-text": "^9.3.12", - "@fluentui/react-textarea": "^9.3.16", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-toolbar": "^9.1.17", - "@fluentui/react-tooltip": "^9.2.16", - "@fluentui/react-tree": "9.0.0-beta.18", - "@fluentui/react-utilities": "^9.9.2", - "@fluentui/react-virtualizer": "9.0.0-alpha.22", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-context-selector": { - "version": "9.1.22", - "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.22.tgz", - "integrity": "sha512-iPXjx8QkEc8kV2YdAz7z17phb+ZDDDecRz/DygI7qdiZPtPTyJxZoelpzA8jb6cbz1+P7kzlbaNz9It24+a0qA==", - "requires": { - "@fluentui/react-utilities": "^9.9.2", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-dialog": { - "version": "9.5.9", - "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.5.9.tgz", - "integrity": "sha512-6kZafolihGDggZjH30rjwFBE/QDxTqRpHRLaPur5WBzGv0wkXyYLCVKomFUH4pN0fCPZ8tT7vy1Tm4GAe9SYMw==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-divider": { - "version": "9.2.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.15.tgz", - "integrity": "sha512-AHGFkd/g4hBQX5WmFyG9WKisnvloPS7aJuI8zIBPcJ8LQdaDhQKMdXenIBTknOm4mnnUG4ytPZVAijVhb/yxgQ==", - "requires": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-drawer": { - "version": "9.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.0.0-beta.1.tgz", - "integrity": "sha512-lFlkMI2iJbFKhxLYZQLM+bDtCgg9x2VkznJx62yclcBOJ/BI2k1w7sQ3RBHl/VPxFJCdm5KpuyHDcuR86VJunA==", - "requires": { - "@fluentui/react-dialog": "^9.5.9", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-experiments": { - "version": "8.14.90", - "resolved": "https://registry.npmjs.org/@fluentui/react-experiments/-/react-experiments-8.14.90.tgz", - "integrity": "sha512-HrwyY1ALt+vwYBSFIswdZZz/cTgsRfDZMRAjEPVp8fE+xTsq2i2RRMmfHgzbXE2ODFXFgLrEO3BitLd7A5p+VQ==", - "requires": { - "@fluentui/example-data": "^8.4.11", - "@fluentui/font-icons-mdl2": "^8.5.21", - "@fluentui/foundation-legacy": "^8.2.41", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/react": "^8.110.2", - "@fluentui/react-hooks": "^8.6.27", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/theme": "^2.6.32", - "@fluentui/utilities": "^8.13.16", - "@microsoft/load-themed-styles": "^1.10.26", - "deep-assign": "^2.0.0", - "prop-types": "^15.7.2", - "tslib": "^2.1.0" - } - }, - "@fluentui/react-field": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.6.tgz", - "integrity": "sha512-vJqh8AFvo1G3gxHJglv5TyRgD1P+qEmN9BNaQvnr8sj+iquGDs3Mf7hal5rT+PetuF6Owrh6g0mOrzkaJMyTcQ==", - "requires": { - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-focus": { - "version": "8.8.28", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.28.tgz", - "integrity": "sha512-gdBASqKW41tWnrNj3B3WQqYGXqnPOGZvQz9AILCY4g1oWv2QoQV1xRhVmzu6V/vJzUZDqOVyD/RseumGmIh8Yg==", - "requires": { - "@fluentui/keyboard-key": "^0.4.11", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "@fluentui/utilities": "^8.13.16", - "tslib": "^2.1.0" - } - }, - "@fluentui/react-hooks": { - "version": "8.6.27", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.27.tgz", - "integrity": "sha512-4Thtr8LgM3/aGExWrIFtTfPX1sHirPTD9DxEkD2/GOPniN/dFBKYp0q1eyMkRu2/KXV6HUVyQL9hK+yfD9sIQQ==", - "requires": { - "@fluentui/react-window-provider": "^2.2.15", - "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.16", - "tslib": "^2.1.0" - } - }, - "@fluentui/react-icons": { - "version": "2.0.203", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.203.tgz", - "integrity": "sha512-eOV9GnCFzEIgllHEYenfkVB2MYChMRj2B8Vlr4qqdL0Kts7gRMfBIb+0+ADr5a3KIN0GtdAvG7KtsJ99O6gNmw==", - "requires": { - "@griffel/react": "^1.0.0", - "tslib": "^2.1.0" - } - }, - "@fluentui/react-icons-mdl2": { - "version": "1.3.45", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.45.tgz", - "integrity": "sha512-4YkrbCGC3k47uEH32p1yWF6ZfbSZkLlcUYIExIlnlaO6k4XCEgGzsvAkdF96xo98dQp3lp8bwjrBs+Q+rTTnjg==", - "requires": { - "@fluentui/react-icon-provider": "^1.3.42", - "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.16", - "@microsoft/load-themed-styles": "^1.10.26", - "tslib": "^2.1.0" - }, - "dependencies": { - "@fluentui/react-icon-provider": { - "version": "1.3.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-icon-provider/-/react-icon-provider-1.3.42.tgz", - "integrity": "sha512-OlR7Mdoa9+8QFJQuYNX7CDg4gXByShLBaeRGS7F7UHm0ZJMbrqjOsqyqDcgdHNVZiW3/i0p6aslpioe3jJB5gQ==", - "requires": { - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.14", - "tslib": "^2.1.0" - } - } - } - }, - "@fluentui/react-image": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.12.tgz", - "integrity": "sha512-NI77BzDNO8wJJ0sDM9g86YC6cI1DH/hJQTqlHaXG8vRwM81qXrsPAqc/7Y9Jh+CBOe408E8d83yrEvoXUfj5cA==", - "requires": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-infobutton": { - "version": "9.0.0-beta.34", - "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.34.tgz", - "integrity": "sha512-0EhZ1iBFPbq1KH4dNTG3bB74fkzK5KLdBCaWlF1mGQyzGE5W1ukpn16Tr9Ul1O6tc8uAgTIJxf/VwRQO3amdjQ==", - "requires": { - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-popover": "^9.6.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-input": { - "version": "9.4.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.16.tgz", - "integrity": "sha512-xbeV9jG3C99NOFT89pIQR+P2vpIll2Cm4/Iio/Gu5+86Epa9Wv0aeRRmEYskVWMp69dl7LKqs7bkhpvKYOmu+w==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-jsx-runtime": { - "version": "9.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.0-alpha.6.tgz", - "integrity": "sha512-in382HEVLAHfTVelJ0H+X5tpenydXe/8eaVTk64X/P48uLcye6MZBQG1jhUxCnRL7ZNu7bB8ya1VXF0GsdTt0g==", - "requires": { - "@fluentui/react-utilities": "^9.9.2", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-label": { - "version": "9.1.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.15.tgz", - "integrity": "sha512-LGPdzlOi6tasfFHqa+N3l9lgAQfipBniVpa0dd9IiGjNvx15ZZPGSSjGs6KkMiPxkIMizJN26OGZ8bXbR3ObgQ==", - "requires": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-link": { - "version": "9.0.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.0.42.tgz", - "integrity": "sha512-PJYSUbxikQQVq01v0UwT5hfaZ0jT/aUDvnLDrH96boY8SOyh1zyTIFbrjnOvgLpFeoE4rO+koXb0mVxBW5t4yg==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-menu": { - "version": "9.7.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.7.16.tgz", - "integrity": "sha512-iVbBlFpQRO8STLa5cLF4v4wYdfPTVZsT27+E7JYhA1nmHJI8pwED22sTCVSPIGXVT58I5N8aVnQS4o6qf1YMmQ==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-overflow": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.0.19.tgz", - "integrity": "sha512-78bHljbIUiIkS9Qhdq7SSwefl7mUb92ps9N72P+AYz2oJITEXZyDtgt2LF7Ktb9qWTx1IOis4GzGeskhTTRZsw==", - "requires": { - "@fluentui/priority-overflow": "^9.0.3", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-persona": { - "version": "9.2.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.15.tgz", - "integrity": "sha512-7CZ8H6cTomHA2iGtjscFoGoJO0oHVTnf56IZahoo34V06QLZnnIfotDv+t1B+20tv6e2pEpdZOJqp/bD9AjpFQ==", - "requires": { - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-badge": "^9.1.15", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-popover": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.6.0.tgz", - "integrity": "sha512-0OAjUICqP7UqNm0tMT+AfVs7OWmITfPThUsvEUJmQQsmFhAmHCgwIt5QwdLv5z5IGe+ZDWL8GBAkAgflECDcgw==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-portal": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.2.12.tgz", - "integrity": "sha512-VEdd8v/12p+oIY37ZYf3FCqW2H7q/mwbcieDJI9NeziZoN/zQYPQgyU3bXh/OsafC5vnIIwbNhV/jKFOaKhqow==", - "requires": { - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14", - "use-disposable": "^1.0.1" - } - }, - "@fluentui/react-portal-compat-context": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.6.tgz", - "integrity": "sha512-HUt0/YXKRB4chtzlGbZ+7y7FHFyqaI0CeMFAe/QBXVOiOwA01QOr2j4Uky+30vupspIt6mjodLanuw1jMybmqQ==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-positioning": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.6.0.tgz", - "integrity": "sha512-Sx1gXj2SMm+iF0bTDhevsCZkR6QpvBFuvJ8P447ts/1pN+XT9vXq/WJsrIbCLqK7TLeT9Xxl0rjevGoTt9yaSw==", - "requires": { - "@floating-ui/dom": "^1.2.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-progress": { - "version": "9.1.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.16.tgz", - "integrity": "sha512-eVmKu1HcocQaDythgTZgSSzXt+f8NW6fOCdDX5hTG0Xug/5ohpBcbuumhNiZNTxyWHgN4l6ZzPr+h4jyHZdmvQ==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-provider": { - "version": "9.7.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.7.2.tgz", - "integrity": "sha512-/D98JvSv8O7fEIv+h05LeWI9YeLw6azLSVG+9nhlETUXRVaLs0tPD94WF8hmFat9YE9CtWDcj/v502WpU/Dwdg==", - "requires": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/core": "^1.11.0", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-radio": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.1.17.tgz", - "integrity": "sha512-bmpGBmYzkN0G/XbtT+slxU9BsltdmcS2wTIYgkNT1SipHzd5oFErMs4j1zjS6kgIYOfNe3N+fAMB2THR6iB13Q==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-select": { - "version": "9.1.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.16.tgz", - "integrity": "sha512-LDM+wOA91FDNuvkCJZrb8cQsG5/pG7gYDjBAsRQ1SSuxmKAEx5PcPM6QwmDaU7l6E6rcMI7dndzcB94LqehzZg==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-shared-contexts": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.5.0.tgz", - "integrity": "sha512-7mPrXx81eudpwloO44VREXc710RtZrzmQVw91EGJeTUfMRdg2MgjNGcwG6C3x+K0RkAgdQ8RAMfR3MSbCQvILA==", - "requires": { - "@fluentui/react-theme": "^9.1.8", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-skeleton": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.4.tgz", - "integrity": "sha512-ImGcbjpI5URcG4v5PfCOS/PZgEBVHhMBJ9HEyLriQMjUgT8QgTiwg+y9JRA+uPq4siioffRkElOqKqJHZLRMlg==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-slider": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.17.tgz", - "integrity": "sha512-2gg3JKyPb8O3bpsAEwoFLGMf6ZFeXvsvxtpHh0mbH6rVR6yazPAW0zSPGS+Y7xPw///A9iup8R9Ar46dWctlrw==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-spinbutton": { - "version": "9.2.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.16.tgz", - "integrity": "sha512-PO3IcV11evj0WFYQ5ntY05ISDtIRAE8E9Q0qe27lWGRDXEeuqRrydfbZuF02rLb6IzNAV+QYXXntxXcO/+ofLA==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-spinner": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.2.2.tgz", - "integrity": "sha512-QVzWLUbTZA/pIhmj3/6KYmS66S+cnVmtb4DXT1WbHFtjxaVNhbYzRPiEKqEv9uvXQdVDcWR55aAVGYtTa/AXpQ==", - "requires": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-switch": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.17.tgz", - "integrity": "sha512-6lmzvASB2BIWy+bld29V+fNCQJZbUDxWhjni2fRz6g4mynIROB1zgqNa1E7wJMjx32c4PZCmJAQo3PomZTOi7w==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-label": "^9.1.15", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-table": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.3.0.tgz", - "integrity": "sha512-KikpnQwXOYVtLVdYUH9DWxSUCL+zUzcAvizFOPbkfyi2PRh510Huftz1JATDp303SSLJyJZ/BpOiQ9fWNGbnCg==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-checkbox": "^9.1.17", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-radio": "^9.1.17", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-tabs": { - "version": "9.3.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.3.17.tgz", - "integrity": "sha512-Eh8ga30dvr8OuqaZm2+B9dOCozIlvkzwXdE2+gF0AyrbWcnTg5R4s4s+qYVAzUyGnTtHrSmIVzwPxSDn/ZY3bA==", - "requires": { - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-tabster": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.7.5.tgz", - "integrity": "sha512-1dQEDAzhurKup+DLA4xRktVBDdxnx5xXo2h0TXTuHtVOk59QheQewlTzYR5i0UHtTN3hTyo04AguLg8nnzgbTw==", - "requires": { - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14", - "keyborg": "^2.0.0", - "tabster": "^4.4.2" - } - }, - "@fluentui/react-text": { - "version": "9.3.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.3.12.tgz", - "integrity": "sha512-h4Mq4nKslIi8TR9ysn4Cy1AYtg9j896qQ2HZiTYZmGP9HYCqF3X/3A7ce0eyZimrcXn1zl4iaR6t1LUFRqOC5Q==", - "requires": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-textarea": { - "version": "9.3.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.16.tgz", - "integrity": "sha512-hMccy65V4QTBMJCI3jR79+nGKh+vIQi+5pdmhEsAZ5fjODDvi/JViGf12MDxbKnmSz1IHKhFayvdhNlt41nQRg==", - "requires": { - "@fluentui/react-field": "^9.1.6", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-theme": { - "version": "9.1.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.8.tgz", - "integrity": "sha512-KXSPSfg29sHEHw9rFpZjKTU4KwY4F4kxZIcqA83Kz8Khnfw17NiWmz8XcmxXaMUlqfwVRxBIM9um2uFE5gjcpw==", - "requires": { - "@fluentui/tokens": "1.0.0-alpha.5", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-toolbar": { - "version": "9.1.17", - "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.17.tgz", - "integrity": "sha512-+i3B/CCA3yMAWuFU5Tg3fex2UEK0yw60gw8M4zzbK/AOzej2AXoH0lU2SIWzN7Y/zDWyzYHMWH+Uj1YQD3DSjw==", - "requires": { - "@fluentui/react-button": "^9.3.16", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-divider": "^9.2.15", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-radio": "^9.1.17", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-tooltip": { - "version": "9.2.16", - "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.2.16.tgz", - "integrity": "sha512-R1DhKCILILzSLCJPig01KqKhqnEH91NoBjHwCfwua8qE9neWUwSD3JSO+dmEfbxFTPfCkrkPrbnuCXb8imu2ig==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-positioning": "^9.6.0", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-tree": { - "version": "9.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.0.0-beta.18.tgz", - "integrity": "sha512-ILbm+REJhuYXV88XXyL31Vwqx9vo/LLQE/pOom0iAjG+P6FYm8w1YemSJ+1IQ5PAkKUbfnYWTujx1fLEdXHNAQ==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@fluentui/react-aria": "^9.3.22", - "@fluentui/react-avatar": "^9.5.5", - "@fluentui/react-button": "^9.3.16", - "@fluentui/react-context-selector": "^9.1.22", - "@fluentui/react-icons": "^2.0.196", - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-portal": "^9.2.12", - "@fluentui/react-shared-contexts": "^9.5.0", - "@fluentui/react-tabster": "^9.7.5", - "@fluentui/react-theme": "^9.1.8", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-utilities": { - "version": "9.9.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.9.2.tgz", - "integrity": "sha512-jFUI11aTpk+EbVm3zYWJwW57Wz4TbR0RSoNPqERpSiOCw4tTEd1Xp4PiBWeknhreXsYwSdrxYBGMXOKIrY3zdg==", - "requires": { - "@fluentui/keyboard-keys": "^9.0.3", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-virtualizer": { - "version": "9.0.0-alpha.22", - "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.22.tgz", - "integrity": "sha512-w/86u6MwZGo11kwAT32dCLstd23No7BhHJzo0HO13A4rjjN6vUrdh6NTKzyAxRcdHJp0hVG+TJMbs8oWZo2Bww==", - "requires": { - "@fluentui/react-jsx-runtime": "9.0.0-alpha.6", - "@fluentui/react-utilities": "^9.9.2", - "@griffel/react": "^1.5.7", - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/react-window-provider": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.15.tgz", - "integrity": "sha512-RraWvRe7wakpPJRBX2tlCV/cybOKiqLJ1UBLPNf5xq7ZIs0T0g/hh3G3Zb5teOeipjuRnl6srkdDUT9Dy9wrBg==", - "requires": { - "@fluentui/set-version": "^8.2.11", - "tslib": "^2.1.0" - } - }, - "@fluentui/set-version": { - "version": "8.2.11", - "resolved": "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.11.tgz", - "integrity": "sha512-UI03tysau/adBO1a3q4uFZWQ3lfkiFcAWIFng4k5odWcCokfCm5IxA0urKqj5W5JRYdyoBUaq8QbcNGkFB4dCw==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@fluentui/style-utilities": { - "version": "8.9.14", - "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.14.tgz", - "integrity": "sha512-On48B9biXgV6PgimFdSwRuYLzue9PjwqxT31UP3w5uvwANL+Hqile5AbkR5g9RartoJiDIk1bHAP7QQkqI1jEg==", - "requires": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/theme": "^2.6.32", - "@fluentui/utilities": "^8.13.16", - "@microsoft/load-themed-styles": "^1.10.26", - "tslib": "^2.1.0" - } - }, - "@fluentui/theme": { - "version": "2.6.32", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.32.tgz", - "integrity": "sha512-UkDsCdQQTQb7Ib+tux2Octz3opTvnRDknXoVnC6yluQVd6ugM8eWDUphOgB7Vnsf1Ou7EhPKdIN6OHXHXuoIyA==", - "requires": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.16", - "tslib": "^2.1.0" - } - }, - "@fluentui/tokens": { - "version": "1.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.5.tgz", - "integrity": "sha512-4xCNP/tmeDywmo+PoFqDaUADSvNNzoZHVknC4D77S1RWxVuYmcM15eumKcVRrDuW3wS8eEX4/ZsIlDfqAhnU8g==", - "requires": { - "@swc/helpers": "^0.4.14" - } - }, - "@fluentui/utilities": { - "version": "8.13.16", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.16.tgz", - "integrity": "sha512-NAz7892Fjf4SNj7QCXuL/WGaZHc5GfCkT2trRFAhduSDXTib1dFANmS/yH2u9dH+27WAtu9pD9p9KbEhrWK4MQ==", - "requires": { - "@fluentui/dom-utilities": "^2.2.11", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "tslib": "^2.1.0" - } - }, - "@griffel/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.11.0.tgz", - "integrity": "sha512-3jlrsJVbNC0avRMfNGWmbklptmtH5s63Gt/xa0zY6+Oa3kU/StNAu+d0LqLChb5egwXrisQIeC+tzzJ+YozGjg==", - "requires": { - "@emotion/hash": "^0.9.0", - "csstype": "^3.1.2", - "rtl-css-js": "^1.16.1", - "stylis": "^4.0.13", - "tslib": "^2.1.0" - } - }, - "@griffel/react": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.7.tgz", - "integrity": "sha512-b9/LkkuO512O268jqRpJPso9ROng/kqh81YSTJUL13tT4qPZQnvrdiwoP7ZeqXbG0zzZHLZ3tWUZrCDOl549OQ==", - "requires": { - "@griffel/core": "^1.11.0", - "tslib": "^2.1.0" - } - }, - "@hpcc-js/api": { - "version": "2.12.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/api/-/api-2.12.9.tgz", - "integrity": "sha512-e5OY9fN8h+UGKrM5J3Z8+OFsXuYW6kH+PQcM0qcvFuIzuYp0UsDF1prKXPCDIutHvJK476EyXFZZayaw+/RGnQ==", - "requires": { - "@hpcc-js/common": "^2.71.9" - } - }, - "@hpcc-js/chart": { - "version": "2.81.4", - "resolved": "https://registry.npmjs.org/@hpcc-js/chart/-/chart-2.81.4.tgz", - "integrity": "sha512-uO6beO8aaDy47Vmx5kFJSnFI4EAMItiKniDCxZAG2uu61Vaqt3U+OIA9vfTIqOS/Z/MiuSnspgbmHR/SyRF+sQ==", - "requires": { - "@hpcc-js/api": "^2.12.9", - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/util": "^2.50.3" - } - }, - "@hpcc-js/codemirror": { - "version": "2.60.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/codemirror/-/codemirror-2.60.9.tgz", - "integrity": "sha512-36jMY/zrPevtfWsAwTwKAMrU+SqR0Ej/iXpwK4ixCWKu/EMf6kEZLl0esendEvK4r3znDWLXhqAC1hveNuD4cw==", - "requires": { - "@hpcc-js/common": "^2.71.9" - } - }, - "@hpcc-js/common": { - "version": "2.71.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/common/-/common-2.71.9.tgz", - "integrity": "sha512-TM3wGyJKgWtYlC+waQpuwhxZaqDbcbtXiBCwYAHeA4704WJr0UGkvTMo9znkqR3mrWpn5yxZGCV+o5QBRcWUgw==", - "requires": { - "@hpcc-js/util": "^2.50.3", - "@types/d3-array": "1.2.9", - "@types/d3-brush": "1.1.5", - "@types/d3-collection": "1.0.10", - "@types/d3-color": "1.4.2", - "@types/d3-dispatch": "1.0.9", - "@types/d3-drag": "1.2.5", - "@types/d3-dsv": "1.2.2", - "@types/d3-ease": "1.0.11", - "@types/d3-format": "1.4.2", - "@types/d3-interpolate": "1.4.2", - "@types/d3-scale": "1.0.18", - "@types/d3-selection": "1.4.3", - "@types/d3-time-format": "2.3.1", - "@types/d3-transition": "1.3.2", - "@types/d3-zoom": "1.8.4" - } - }, - "@hpcc-js/comms": { - "version": "2.82.3", - "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.82.3.tgz", - "integrity": "sha512-Y0VVHI7Ex96gWpXJFls0rz5aonL/2HNIqohtPOcTVmI59vZLyc9tayOLMatcT0j6aHCAHs01tbVtd4Q24+O/Ow==", - "requires": { - "@hpcc-js/ddl-shim": "^2.20.3", - "@hpcc-js/util": "^2.50.3", - "@xmldom/xmldom": "0.8.8", - "abort-controller": "3.0.0", - "node-fetch": "2.6.11", - "safe-buffer": "5.2.1", - "tmp": "0.2.1" - }, - "dependencies": { - "@hpcc-js/util": { - "version": "2.50.3", - "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.50.3.tgz", - "integrity": "sha512-zgwLaBnpXBJRd4RUYV/MHe2rP329tz4NR8/g5T7W6/VXlPBXR6fbZzy35Zsf7xv4yiTtTN27hi/7cgU5J3HOjA==", - "requires": { - "tslib": "2.4.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==" - }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@hpcc-js/dataflow": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@hpcc-js/dataflow/-/dataflow-8.1.4.tgz", - "integrity": "sha512-T6rz2FqwI+suNwCzvVTHwtGBAtxm5L+aNnnXjJpXO5+KzvdtIAOV+1+WBuRCAkogj/gRdhEwW3XPzK5x3DbYkw==" - }, - "@hpcc-js/ddl-shim": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/@hpcc-js/ddl-shim/-/ddl-shim-2.20.3.tgz", - "integrity": "sha512-2ZS1am7xCmLxzezM3CqTHmaPlAU7NQMQ4v6B5Mv7BMy6mkrSMeP2VAYYtNbwjrMUSa0ZFw4pimPFd3QWEH7bJQ==", - "requires": { - "ajv": "6.12.6" - } - }, - "@hpcc-js/dgrid": { - "version": "2.32.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid/-/dgrid-2.32.9.tgz", - "integrity": "sha512-Rcg64ah+q1hHIS9OKEPFZrOZbB5Nr20AvaRpUq7WQCUXKqhI4P/ZQ2RmF70q3yztgKQ3cdsPELkOI9dFlcFTqg==", - "requires": { - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/ddl-shim": "^2.20.3", - "@hpcc-js/dgrid-shim": "^2.24.3", - "@hpcc-js/util": "^2.50.3" - } - }, - "@hpcc-js/dgrid-shim": { - "version": "2.24.3", - "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid-shim/-/dgrid-shim-2.24.3.tgz", - "integrity": "sha512-OncYzt6Mlc/zm78f67Dszi+2htHvXX65eWqHB7MV9wl6MUiKFkw1ZNpLDGnaDzw1oDn0CdArbdM+hXGc3ZO6uQ==" - }, - "@hpcc-js/dgrid2": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/dgrid2/-/dgrid2-2.3.9.tgz", - "integrity": "sha512-CHzc5okZY163Si9um7FZb+p1XmkFqr3itUEfqD8MvZtZc4uK/DxUl2YlXiUNwYeMvj26aN9ZW94k22oNLPVQ/Q==", - "requires": { - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/preact-shim": "^2.16.4", - "@hpcc-js/util": "^2.50.3" - } - }, - "@hpcc-js/eclwatch": { - "version": "2.73.18", - "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.73.18.tgz", - "integrity": "sha512-KTxIlVr9CLLlJ8v+wmttSARUZsM4ftIi0ZZOzGewm/HXagb4gUPfyQuB6A7A8LsYXJNnYhT3ctzr9Xzv9OvtEg==", - "requires": { - "@hpcc-js/codemirror": "^2.60.9", - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/comms": "^2.82.3", - "@hpcc-js/dgrid": "^2.32.9", - "@hpcc-js/graph": "^2.85.5", - "@hpcc-js/layout": "^2.49.9", - "@hpcc-js/phosphor": "^2.16.9", - "@hpcc-js/timeline": "^2.51.12", - "@hpcc-js/tree": "^2.40.9", - "@hpcc-js/util": "^2.50.3" - } - }, - "@hpcc-js/graph": { - "version": "2.85.5", - "resolved": "https://registry.npmjs.org/@hpcc-js/graph/-/graph-2.85.5.tgz", - "integrity": "sha512-gzyKOlaJteM2/WskfWKNFF+qQU4q9pLOgQb2C4aZ+iMe22ErIlscuk4++80JFD2QUmSCG8t3oykL+gtcWz0exQ==", - "requires": { - "@hpcc-js/api": "^2.12.9", - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/html": "^2.42.10", - "@hpcc-js/react": "^2.53.6", - "@hpcc-js/util": "^2.50.3" - } - }, - "@hpcc-js/html": { - "version": "2.42.10", - "resolved": "https://registry.npmjs.org/@hpcc-js/html/-/html-2.42.10.tgz", - "integrity": "sha512-oz9I2QZV8U7DUPuWe7oItgJVnc054ygE/NaI4knMVedhJT0Eo758/Vgg8t4g3EsEVzji26sSZOtc06ODuO87rw==", - "requires": { - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/preact-shim": "^2.16.4", - "@hpcc-js/util": "^2.50.3" - } - }, - "@hpcc-js/layout": { - "version": "2.49.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/layout/-/layout-2.49.9.tgz", - "integrity": "sha512-2DOitZ8KbgOVKC46NU3b9PQ/zYPLoC+ekUnYOEUv4ADBgQmqq+HGmYXSiDx23wLROrvUX4JNC7ciN5vzYd+02g==", - "requires": { - "@hpcc-js/api": "^2.12.9", - "@hpcc-js/chart": "^2.81.4", - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/dgrid2": "^2.3.9" - } - }, - "@hpcc-js/leaflet-shim": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@hpcc-js/leaflet-shim/-/leaflet-shim-2.3.3.tgz", - "integrity": "sha512-Nub1qRuFWKz1xc8LFf453r7yP8jium0tolTYrVwFdj4Rc8oKsDh8xC2iTRJu/L79JZsCRlPU1GxZKomSnNEbMg==", - "requires": { - "@types/leaflet": "1.9.3", - "leaflet": "1.9.4" - } - }, - "@hpcc-js/map": { - "version": "2.77.8", - "resolved": "https://registry.npmjs.org/@hpcc-js/map/-/map-2.77.8.tgz", - "integrity": "sha512-M0AljPl4sZswR3U8qUDiHLVG537YZPuT5Z/uecFpgiWW9gHZy2hu4QNRqm+o6DfsOPcIsqXNy5UVnr+EvylFxQ==", - "requires": { - "@hpcc-js/api": "^2.12.9", - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/graph": "^2.85.5", - "@hpcc-js/layout": "^2.49.9", - "@hpcc-js/leaflet-shim": "^2.3.3", - "@hpcc-js/other": "^2.15.9", - "@hpcc-js/util": "^2.50.3" - } - }, - "@hpcc-js/other": { - "version": "2.15.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/other/-/other-2.15.9.tgz", - "integrity": "sha512-KAOtYVGQqOC1OyLzDDmRlwle+Xfutel4LvmedMeosHZngvTgDN7biscp5viPJQxy2IF0odnuIlqu0MG+vZEpCg==", - "requires": { - "@hpcc-js/api": "^2.12.9", - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/layout": "^2.49.9" - } - }, - "@hpcc-js/phosphor": { - "version": "2.16.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/phosphor/-/phosphor-2.16.9.tgz", - "integrity": "sha512-qx8kBjqw4llcygTMpzn++jbwzNofUibku8EUy6LBMSLE6Z5jQvghXAJqp/onmcyg0+4uwD8t/kKvKEDlstIiOQ==", - "requires": { - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/other": "^2.15.9", - "@hpcc-js/phosphor-shim": "^2.14.4", - "@hpcc-js/util": "^2.50.3" - } - }, - "@hpcc-js/phosphor-shim": { - "version": "2.14.4", - "resolved": "https://registry.npmjs.org/@hpcc-js/phosphor-shim/-/phosphor-shim-2.14.4.tgz", - "integrity": "sha512-6kuLkLlyAUEeeu2Jgc1SSaou5D9Ks3tTVOLTnktzlZvKMgq7L0K6jpsn9ts728ZCQ+P0VPKdzDY58yVVdBt98g==", - "requires": { - "@lumino/algorithm": "1.9.2", - "@lumino/commands": "1.21.1", - "@lumino/messaging": "1.10.3", - "@lumino/widgets": "1.37.2" - } - }, - "@hpcc-js/preact-shim": { - "version": "2.16.4", - "resolved": "https://registry.npmjs.org/@hpcc-js/preact-shim/-/preact-shim-2.16.4.tgz", - "integrity": "sha512-fuUXMWcOjCx3imFypR4CD9WLZSSU0MudbpIx5Zsb2ktQJagEOHOLuFnS57Ew9aTY9wLgwe1LM7JwLlr7MmPKaw==", - "requires": { - "preact": "10.15.1" - } - }, - "@hpcc-js/react": { - "version": "2.53.6", - "resolved": "https://registry.npmjs.org/@hpcc-js/react/-/react-2.53.6.tgz", - "integrity": "sha512-VEF7GsqzcEEC2EhuGmv87ORtE3PZpXef0cfppFmsMdRCEvPM4o4xpd025cVlVI7PWIG/vMafjJC8DR9iN7WjZA==", - "requires": { - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/preact-shim": "^2.16.4" - } - }, - "@hpcc-js/timeline": { - "version": "2.51.12", - "resolved": "https://registry.npmjs.org/@hpcc-js/timeline/-/timeline-2.51.12.tgz", - "integrity": "sha512-GSNaDgex61pCB8MggI0QakJ12lLImsm4H8GKbbfV6vcYr8/vSkDQ+f6RXm6gWW6kV0mrCOQlntA9gh2gFSWNGQ==", - "requires": { - "@hpcc-js/api": "^2.12.9", - "@hpcc-js/chart": "^2.81.4", - "@hpcc-js/common": "^2.71.9", - "@hpcc-js/html": "^2.42.10", - "@hpcc-js/layout": "^2.49.9", - "@hpcc-js/react": "^2.53.6" - } - }, - "@hpcc-js/tree": { - "version": "2.40.9", - "resolved": "https://registry.npmjs.org/@hpcc-js/tree/-/tree-2.40.9.tgz", - "integrity": "sha512-zyHgQhk9bZPlm65UdKz6DRfjLnGLur6wraOyN6DjsoiI342MVSJVC4MosolPTEq7xDpuJ1SEU49+qzlWqAXcKQ==", - "requires": { - "@hpcc-js/api": "^2.12.9", - "@hpcc-js/common": "^2.71.9" - } - }, - "@hpcc-js/util": { - "version": "2.50.3", - "resolved": "https://registry.npmjs.org/@hpcc-js/util/-/util-2.50.3.tgz", - "integrity": "sha512-zgwLaBnpXBJRd4RUYV/MHe2rP329tz4NR8/g5T7W6/VXlPBXR6fbZzy35Zsf7xv4yiTtTN27hi/7cgU5J3HOjA==", - "requires": { - "tslib": "2.4.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@koa/cors": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-3.4.3.tgz", - "integrity": "sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw==", - "dev": true, - "requires": { - "vary": "^1.1.2" - } - }, - "@kubernetes/client-node": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.18.1.tgz", - "integrity": "sha512-F3JiK9iZnbh81O/da1tD0h8fQMi/MDttWc/JydyUVnjPEom55wVfnpl4zQ/sWD4uKB8FlxYRPiLwV2ZXB+xPKw==", - "requires": { - "@types/js-yaml": "^4.0.1", - "@types/node": "^18.11.17", - "@types/request": "^2.47.1", - "@types/ws": "^8.5.3", - "byline": "^5.0.0", - "isomorphic-ws": "^5.0.0", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^7.2.0", - "openid-client": "^5.3.0", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "stream-buffers": "^3.0.2", - "tar": "^6.1.11", - "tmp-promise": "^3.0.2", - "tslib": "^2.4.1", - "underscore": "^1.13.6", - "ws": "^8.11.0" - } - }, - "@lumino/algorithm": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@lumino/algorithm/-/algorithm-1.9.2.tgz", - "integrity": "sha512-Z06lp/yuhz8CtIir3PNTGnuk7909eXt4ukJsCzChsGuot2l5Fbs96RJ/FOHgwCedaX74CtxPjXHXoszFbUA+4A==" - }, - "@lumino/collections": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@lumino/collections/-/collections-1.9.3.tgz", - "integrity": "sha512-2i2Wf1xnfTgEgdyKEpqM16bcYRIhUOGCDzaVCEZACVG9R1CgYwOe3zfn71slBQOVSjjRgwYrgLXu4MBpt6YK+g==", - "requires": { - "@lumino/algorithm": "^1.9.2" - } - }, - "@lumino/commands": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@lumino/commands/-/commands-1.21.1.tgz", - "integrity": "sha512-d1zJmwz5bHU0BM/Rl3tRdZ7/WgXnFB0bM7x7Bf0XDlmX++jnU9k0j3mh6/5JqCGLmIApKCRwVqSaV7jPmSJlcQ==", - "requires": { - "@lumino/algorithm": "^1.9.2", - "@lumino/coreutils": "^1.12.1", - "@lumino/disposable": "^1.10.4", - "@lumino/domutils": "^1.8.2", - "@lumino/keyboard": "^1.8.2", - "@lumino/signaling": "^1.11.1", - "@lumino/virtualdom": "^1.14.3" - } - }, - "@lumino/coreutils": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@lumino/coreutils/-/coreutils-1.12.1.tgz", - "integrity": "sha512-JLu3nTHzJk9N8ohZ85u75YxemMrmDzJdNgZztfP7F7T7mxND3YVNCkJG35a6aJ7edu1sIgCjBxOvV+hv27iYvQ==", - "requires": {} - }, - "@lumino/disposable": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@lumino/disposable/-/disposable-1.10.4.tgz", - "integrity": "sha512-4ZxyYcyzUS+ZeB2KAH9oAH3w0DUUceiVr+FIZHZ2TAYGWZI/85WlqJtfm0xjwEpCwLLW1TDqJrISuZu3iMmVMA==", - "requires": { - "@lumino/algorithm": "^1.9.2", - "@lumino/signaling": "^1.11.1" - } - }, - "@lumino/domutils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@lumino/domutils/-/domutils-1.8.2.tgz", - "integrity": "sha512-QIpMfkPJrs4GrWBuJf2Sn1fpyVPmvqUUAeD8xAQo8+4V5JAT0vUDLxZ9HijefMgNCi3+Bs8Z3lQwRCrz+cFP1A==" - }, - "@lumino/dragdrop": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/@lumino/dragdrop/-/dragdrop-1.14.5.tgz", - "integrity": "sha512-LC5xB82+xGF8hFyl716TMpV32OIMIMl+s3RU1PaqDkD6B7PkgiVk6NkJ4X9/GcEvl2igkvlGQt/3L7qxDAJNxw==", - "requires": { - "@lumino/coreutils": "^1.12.1", - "@lumino/disposable": "^1.10.4" - } - }, - "@lumino/keyboard": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@lumino/keyboard/-/keyboard-1.8.2.tgz", - "integrity": "sha512-Dy+XqQ1wXbcnuYtjys5A0pAqf4SpAFl9NY6owyIhXAo0Va7w3LYp3jgiP1xAaBAwMuUppiUAfrbjrysZuZ625g==" - }, - "@lumino/messaging": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@lumino/messaging/-/messaging-1.10.3.tgz", - "integrity": "sha512-F/KOwMCdqvdEG8CYAJcBSadzp6aI7a47Fr60zAKGqZATSRRRV41q53iXU7HjFPqQqQIvdn9Z7J32rBEAyQAzww==", - "requires": { - "@lumino/algorithm": "^1.9.2", - "@lumino/collections": "^1.9.3" - } - }, - "@lumino/properties": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@lumino/properties/-/properties-1.8.2.tgz", - "integrity": "sha512-EkjI9Cw8R0U+xC9HxdFSu7X1tz1H1vKu20cGvJ2gU+CXlMB1DvoYJCYxCThByHZ+kURTAap4SE5x8HvKwNPbig==" - }, - "@lumino/signaling": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@lumino/signaling/-/signaling-1.11.1.tgz", - "integrity": "sha512-YCUmgw08VoyMN5KxzqPO3KMx+cwdPv28tAN06C0K7Q/dQf+oufb1XocuhZb5selTrTmmuXeizaYxgLIQGdS1fA==", - "requires": { - "@lumino/algorithm": "^1.9.2", - "@lumino/properties": "^1.8.2" - } - }, - "@lumino/virtualdom": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@lumino/virtualdom/-/virtualdom-1.14.3.tgz", - "integrity": "sha512-5joUC1yuxeXbpfbSBm/OR8Mu9HoTo6PDX0RKqzlJ9o97iml7zayFN/ynzcxScKGQAo9iaXOY8uVIvGUT8FnsGw==", - "requires": { - "@lumino/algorithm": "^1.9.2" - } - }, - "@lumino/widgets": { - "version": "1.37.2", - "resolved": "https://registry.npmjs.org/@lumino/widgets/-/widgets-1.37.2.tgz", - "integrity": "sha512-NHKu1NBDo6ETBDoNrqSkornfUCwc8EFFzw6+LWBfYVxn2PIwciq2SdiJGEyNqL+0h/A9eVKb5ui5z4cwpRekmQ==", - "requires": { - "@lumino/algorithm": "^1.9.2", - "@lumino/commands": "^1.21.1", - "@lumino/coreutils": "^1.12.1", - "@lumino/disposable": "^1.10.4", - "@lumino/domutils": "^1.8.2", - "@lumino/dragdrop": "^1.14.5", - "@lumino/keyboard": "^1.8.2", - "@lumino/messaging": "^1.10.3", - "@lumino/properties": "^1.8.2", - "@lumino/signaling": "^1.11.1", - "@lumino/virtualdom": "^1.14.3" - } - }, - "@microsoft/load-themed-styles": { - "version": "1.10.247", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.247.tgz", - "integrity": "sha512-vKbuG3Mcbc4kkNAcIE13aIv5KoI2g+tHFFIZnFhtUilpYHc0VsMd4Fw7Jz81A8AB7L3wWu3OZB2CNiRnr1a3ew==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@simbathesailor/use-what-changed": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@simbathesailor/use-what-changed/-/use-what-changed-2.0.0.tgz", - "integrity": "sha512-ulBNrPSvfho9UN6zS2fii3AsdEcp2fMaKeqUZZeCNPaZbB6aXyTUhpEN9atjMAbu/eyK3AY8L4SYJUG62Ekocw==", - "dev": true, - "requires": {} - }, - "@swc/helpers": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "@types/d3-array": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.9.tgz", - "integrity": "sha512-E/7RgPr2ylT5dWG0CswMi9NpFcjIEDqLcUSBgNHe/EMahfqYaTx4zhcggG3khqoEB/leY4Vl6nTSbwLUPjXceA==" - }, - "@types/d3-brush": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.5.tgz", - "integrity": "sha512-4zGkBafJf5zCsBtLtvDj/pNMo5X9+Ii/1hUz0GvQ+wEwelUBm2AbIDAzJnp2hLDFF307o0fhxmmocHclhXC+tw==", - "requires": { - "@types/d3-selection": "^1" - } - }, - "@types/d3-collection": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.10.tgz", - "integrity": "sha512-54Fdv8u5JbuXymtmXm2SYzi1x/Svt+jfWBU5junkhrCewL92VjqtCBDn97coBRVwVFmYNnVTNDyV8gQyPYfm+A==" - }, - "@types/d3-color": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.2.tgz", - "integrity": "sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA==" - }, - "@types/d3-dispatch": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz", - "integrity": "sha512-zJ44YgjqALmyps+II7b1mZLhrtfV/FOxw9owT87mrweGWcg+WK5oiJX2M3SYJ0XUAExBduarysfgbR11YxzojQ==" - }, - "@types/d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-7NeTnfolst1Js3Vs7myctBkmJWu6DMI3k597AaHUX98saHjHWJ6vouT83UrpE+xfbSceHV+8A0JgxuwgqgmqWw==", - "requires": { - "@types/d3-selection": "^1" - } - }, - "@types/d3-dsv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.2.2.tgz", - "integrity": "sha512-GRnz9z8ypqb7OsQ/xw/BmFAp0/k3pgM1s19FTZZSlCMY0EvyVTkU8xzZKKDXzytGXPpTNC4R5pGl9oxEvVSnHQ==" - }, - "@types/d3-ease": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.11.tgz", - "integrity": "sha512-wUigPL0kleGZ9u3RhzBP07lxxkMcUjL5IODP42mN/05UNL+JJCDnpEPpFbJiPvLcTeRKGIRpBBJyP/1BNwYsVA==" - }, - "@types/d3-format": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.2.tgz", - "integrity": "sha512-WeGCHAs7PHdZYq6lwl/+jsl+Nfc1J2W1kNcMeIMYzQsT6mtBDBgtJ/rcdjZ0k0rVIvqEZqhhuD5TK/v3P2gFHQ==" - }, - "@types/d3-interpolate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz", - "integrity": "sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg==", - "requires": { - "@types/d3-color": "^1" - } - }, - "@types/d3-scale": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-1.0.18.tgz", - "integrity": "sha512-IJ5RvxaesIDSY6z2tGFjt++GxIAm5DSOCVJmt2llqW1T2rP4a3nrJZCsm1HkOFEGcXp5GK3kY8tSBWzj2xqCkQ==", - "requires": { - "@types/d3-time": "^1" - } - }, - "@types/d3-selection": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.3.tgz", - "integrity": "sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA==" - }, - "@types/d3-time": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.1.tgz", - "integrity": "sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw==" - }, - "@types/d3-time-format": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.1.tgz", - "integrity": "sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA==" - }, - "@types/d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-J+a3SuF/E7wXbOSN19p8ZieQSFIm5hU2Egqtndbc54LXaAEOpLfDx4sBu/PKAKzHOdgKK1wkMhINKqNh4aoZAg==", - "requires": { - "@types/d3-selection": "^1" - } - }, - "@types/d3-zoom": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.8.4.tgz", - "integrity": "sha512-K+6jCM9llyC5U4WvkmiXbCoOIuUX03Wi72C/L9PMPVxymWDaxTHzDgHD/HYlEyDRGiVp7D77m7XPcD/m/TRDrw==", - "requires": { - "@types/d3-interpolate": "^1", - "@types/d3-selection": "^1" - } - }, - "@types/dojo": { - "version": "1.9.44", - "resolved": "https://registry.npmjs.org/@types/dojo/-/dojo-1.9.44.tgz", - "integrity": "sha512-PXRBomRsnsKOntYqDmamJE9pJ95Bkcuynrvb46PHunClyek+AkuQQdF+MQpaUZUk/FhP+DQrleedtIWAfJe7Rg==", - "dev": true - }, - "@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" - }, - "@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/leaflet": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.3.tgz", - "integrity": "sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==", - "requires": { - "@types/geojson": "*" - } - }, - "@types/node": { - "version": "18.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", - "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==" - }, - "@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" - }, - "@types/react": { - "version": "17.0.62", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz", - "integrity": "sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "requires": { - "@types/react": "^17" - } - }, - "@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" - }, - "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz", - "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/type-utils": "5.54.0", - "@typescript-eslint/utils": "5.54.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz", - "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/typescript-estree": "5.54.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz", - "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/visitor-keys": "5.54.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz", - "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.54.0", - "@typescript-eslint/utils": "5.54.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz", - "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz", - "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/visitor-keys": "5.54.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz", - "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/typescript-estree": "5.54.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz", - "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.54.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} - }, - "@xmldom/xmldom": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.8.tgz", - "integrity": "sha512-0LNz4EY8B/8xXY86wMrQ4tz6zEHZv9ehFMJPm8u2gq5lQ71cfRKdaKyxfJAx5aUoyzx0qzgURblTisPGgz3d+Q==" - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "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" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-escape-sequences": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-6.2.1.tgz", - "integrity": "sha512-0gK95MrLXv+Vy5h4eKGvSX1yXopBqSYBi3/w4hekUxs/hHakF6asH9Gg7UXbb7IH9weAlVIrUzVOITNBr8Imag==", - "dev": true, - "requires": { - "array-back": "^6.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "batch-processor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz", - "integrity": "sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "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" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "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==", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" - }, - "byte-size": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.0.tgz", - "integrity": "sha512-FkgMTAg44I0JtEaUAvuZTtU2a2YDmBRbQxdsQNSMtLCjhG0hMcF5b1IMN9UjSCJaU4nvlj/GER7B9sI4nKdCgA==", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dev": true, - "requires": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001314", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", - "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", - "dev": true, - "requires": { - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - } - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", - "dev": true - }, - "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" - } - }, - "command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true - }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true - } - } - }, - "command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "requires": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "common-log-format": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/common-log-format/-/common-log-format-1.0.0.tgz", - "integrity": "sha512-fFn/WPNbsTCGTTwdCpZfVZSa5mgqMEkA0gMTRApFSlEsYN+9B2FPfiqch5FT+jsv5IV1RHV3GeZvCa7Qg+jssw==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", - "dev": true, - "requires": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - } - }, - "copy-to": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", - "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=", - "dev": true - }, - "copyfiles": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", - "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", - "dev": true, - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^16.1.0" - } - }, - "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==", - "dev": true - }, - "create-mixin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/create-mixin/-/create-mixin-3.0.0.tgz", - "integrity": "sha512-LkdMqnWT9LaqBN4huqpUnMz56Yr1mVSoCduAd2xXefgH/YZP2sXCMAyztXjk4q8hTF/TlcDa+zQW2aTgGdjjKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", - "peer": true - }, - "css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "current-module-paths": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/current-module-paths/-/current-module-paths-1.1.0.tgz", - "integrity": "sha512-HGhLUszcgprjKmzvQoCQda8iEWsQn3sWVzPdttyJVR5cjfVDYcoyozQA5D1YXgab9v84SPMpSuD+YrPX6i1IMQ==", - "dev": true - }, - "d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "requires": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" - }, - "deep-assign": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz", - "integrity": "sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI=", - "requires": { - "is-obj": "^1.0.0" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-browser": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", - "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" - }, - "dijit": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/dijit/-/dijit-1.17.3.tgz", - "integrity": "sha512-QS+1bNhPT+BF9E+iomQSi5qI+o3oUNSx1r5TF8WlGH4LybGZP+IIGJBOO5/41YduBPljVXhY7vaPsgrycxC6UQ==", - "requires": { - "dojo": "1.17.3" - } - }, - "dijit-themes": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/dijit-themes/-/dijit-themes-1.17.3.tgz", - "integrity": "sha512-AxQvinSkvA0PyOszdNIhIQdmF0PS0s9hqBnXRgKMZPkLT6ody4k1+SdHhs6Eq0zKVKnQXcZLxHnx07AtnU7FEQ==", - "requires": {} - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dojo": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/dojo/-/dojo-1.17.3.tgz", - "integrity": "sha512-iWDx1oSfCEDnIrs8cMW7Zh9Fbjgxu8iRagFz+Qi2eya3MXIAxFXKhv2A7dpi+bfpMpFozLwcsLV8URLw6BsHsA==" - }, - "dojo-util": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/dojo-util/-/dojo-util-1.17.3.tgz", - "integrity": "sha512-3hZMwVh9XmofCJh3v3epTlODTnk3FJoGHZiZKVlbhvYLtRC8pkLg6zitOpT2Zg4Jn5URYmPrMmAdwxRHrG736A==" - }, - "dojo-webpack-plugin": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/dojo-webpack-plugin/-/dojo-webpack-plugin-3.0.5.tgz", - "integrity": "sha512-uow7UfHL9M41DW60IOT/BnZc1wxnaw16nWGe39ScbD0prbLW9INysL3nIXwTcWiJxrG9lcsMuLIyVt6p6vdVaw==", - "dev": true, - "requires": { - "loader-utils": "2.0.4", - "node-stringify": "0.2.1", - "raw-loader": "0.5.1", - "tmp": "0.0.30" - }, - "dependencies": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "dojox": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/dojox/-/dojox-1.17.3.tgz", - "integrity": "sha512-n2SvGoVTZlOQUQmoqEfW6oGAfmyBtjl4DzWkxoojdTxBq8O0r7pDKBrW3nRrpQW9uZFHfB1XIA3BXS0cnrue/Q==", - "requires": { - "dijit": "1.17.3", - "dojo": "1.17.3" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.80", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.80.tgz", - "integrity": "sha512-COsbJCGVYCc/aAY4cd94x1Js3q0r406YKGbdL8LXHg0O9dEjuFEFU/vZneRxBxKo/f1lLHi0YyAR7sbFM+i8Bg==", - "dev": true - }, - "element-resize-detector": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz", - "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==", - "requires": { - "batch-processor": "1.0.0" - } - }, - "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==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "dev": true - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "eslint-plugin-eclwatch": { - "version": "file:eslint" - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true - }, - "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "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-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==" - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "requires": { - "array-back": "^3.0.1" - }, - "dependencies": { - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "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" - } - }, - "formik": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", - "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", - "requires": { - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-node-dimensions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz", - "integrity": "sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ==" - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "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" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "goober": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.10.tgz", - "integrity": "sha512-7PpuQMH10jaTWm33sQgBQvz45pHR8N4l3Cu3WMGEWmHShAcTuuP7I+5/DwKo39fwti5A80WAjvqgz6SSlgWmGA==", - "requires": {} - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "requires": { - "delegate": "^3.1.2" - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "dev": true, - "requires": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - } - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - } - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", - "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=", - "dev": true - }, - "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==" - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "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==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "requires": {} - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jose": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", - "integrity": "sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==", - "optional": true - }, - "js-sdsl": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.1.tgz", - "integrity": "sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "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==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsonpath-plus": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", - "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==" - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "keyborg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.0.0.tgz", - "integrity": "sha512-RWY8nWrzRkwTQLaKyDtbTu5SOb5L4B20UzAsBHlQDFZqVY/+Mid0bQ7MVTC8vbOTrWY2xkkzj8gZF9Ua7re4xA==" - }, - "keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "requires": { - "tsscmp": "1.0.6" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "koa": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.4.tgz", - "integrity": "sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==", - "dev": true, - "requires": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.8.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - } - }, - "koa-bodyparser": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", - "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", - "dev": true, - "requires": { - "co-body": "^6.0.0", - "copy-to": "^2.0.1" - } - }, - "koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true - }, - "koa-compress": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-5.1.0.tgz", - "integrity": "sha512-G3Ppo9jrUwlchp6qdoRgQNMiGZtM0TAHkxRZQ7EoVvIG8E47J4nAsMJxXHAUQ+0oc7t0MDxSdONWTFcbzX7/Bg==", - "dev": true, - "requires": { - "bytes": "^3.0.0", - "compressible": "^2.0.0", - "http-errors": "^1.8.0", - "koa-is-json": "^1.0.0", - "statuses": "^2.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "koa-conditional-get": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-conditional-get/-/koa-conditional-get-2.0.0.tgz", - "integrity": "sha1-pD83I8HQFLcwo07Oit8wuTyCM/I=", - "dev": true - }, - "koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "dev": true, - "requires": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - } - }, - "koa-etag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-3.0.0.tgz", - "integrity": "sha1-nvc4Ld1agqsN6xU0FckVg293HT8=", - "dev": true, - "requires": { - "etag": "^1.3.0", - "mz": "^2.1.0" - } - }, - "koa-is-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", - "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=", - "dev": true - }, - "koa-json": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/koa-json/-/koa-json-2.0.2.tgz", - "integrity": "sha1-Nq8U5uofXWRtfESihXAcb4Wk/eQ=", - "dev": true, - "requires": { - "koa-is-json": "1", - "streaming-json-stringify": "3" - } - }, - "koa-morgan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/koa-morgan/-/koa-morgan-1.0.1.tgz", - "integrity": "sha1-CAUuDODYOdPEMXi5CluzQkvvH5k=", - "dev": true, - "requires": { - "morgan": "^1.6.1" - } - }, - "koa-range": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/koa-range/-/koa-range-0.3.0.tgz", - "integrity": "sha1-NYjjSWRzqDmhvSZNKkKx2FvX/qw=", - "dev": true, - "requires": { - "stream-slice": "^0.1.2" - } - }, - "koa-route": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/koa-route/-/koa-route-3.2.0.tgz", - "integrity": "sha1-dimLmaa8+p44yrb+XHmocz51i84=", - "dev": true, - "requires": { - "debug": "*", - "methods": "~1.1.0", - "path-to-regexp": "^1.2.0" - }, - "dependencies": { - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - } - }, - "koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "leaflet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "load-module": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/load-module/-/load-module-4.2.1.tgz", - "integrity": "sha512-Sbfg6R4LjvyThJpqUoADHMjyoI2+cL4msbCQeZ9kkY/CqP/TT2938eftKm7x4I2gd4/A+DEe6nePkbfWYbXwSw==", - "dev": true, - "requires": { - "array-back": "^6.2.0" - } - }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "local-web-server": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/local-web-server/-/local-web-server-5.3.0.tgz", - "integrity": "sha512-TGZ/+4eQ+1HtmoDalTspX1Cnn9oopxkIji7nGwIfn9ae1pT83VCwifnoxDu0bYleLSpqodsboUFUq/hgWvEzDw==", - "dev": true, - "requires": { - "current-module-paths": "^1.1.0", - "lws": "^4.1.2", - "lws-basic-auth": "^2.0.0", - "lws-blacklist": "^3.0.0", - "lws-body-parser": "^3.0.0", - "lws-compress": "^3.1.0", - "lws-conditional-get": "^2.0.0", - "lws-cors": "^4.2.0", - "lws-index": "^3.1.1", - "lws-json": "^2.0.0", - "lws-log": "^2.0.0", - "lws-mime": "^2.0.0", - "lws-range": "^4.0.1", - "lws-request-monitor": "^2.0.0", - "lws-rewrite": "^3.1.1", - "lws-spa": "^4.1.0", - "lws-static": "^3.1.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "lodash.assignwith": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", - "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "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==", - "devOptional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lws": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lws/-/lws-4.1.2.tgz", - "integrity": "sha512-hm6mlYa5ZM+iLbFIEiifGnXJWbNRQL80DZ5gXfkdgBJSMIvjnVyVIPpw1fCU/IMcgHBvn1iCrFc391FP12NguQ==", - "dev": true, - "requires": { - "@75lb/deep-merge": "^1.1.1", - "ansi-escape-sequences": "^6.2.1", - "array-back": "^6.2.2", - "byte-size": "^8.1.0", - "command-line-args": "^5.2.1", - "command-line-usage": "^6.1.3", - "create-mixin": "^3.0.0", - "current-module-paths": "^1.1.0", - "koa": "^2.13.4", - "load-module": "^4.2.1", - "open": "^8.4.0", - "qrcode-terminal": "^0.12.0", - "typical": "^7.1.1", - "walk-back": "^5.1.0" - } - }, - "lws-basic-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lws-basic-auth/-/lws-basic-auth-2.0.0.tgz", - "integrity": "sha512-zzyoGFLQPuKaQJvHMLmmSyfT6lIvocwcDXllTVW5brD0t0YgHYopILkzja+x+MIlJX/YhNKniaTSasujniYVjw==", - "dev": true, - "requires": { - "basic-auth": "^2.0.1" - } - }, - "lws-blacklist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lws-blacklist/-/lws-blacklist-3.0.0.tgz", - "integrity": "sha512-KNXGDBmbj+UGfWMBAefe2vrfuWpEQms/9Fd7kfMScTqAKF6nrVoEs4pkxfefArG3bX0bu7jWLyB4tJGma5WC6Q==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "path-to-regexp": "^6.1.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - } - } - }, - "lws-body-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lws-body-parser/-/lws-body-parser-3.0.0.tgz", - "integrity": "sha512-led36Um61ppeQoMTG7yvphn+NQPMbzuFuGUYD09eEx1UT7e8bsaLw1gkBZB9vAIkeTlXRbXjPmOqlm26eUzhfg==", - "dev": true, - "requires": { - "koa-bodyparser": "^4.3.0" - } - }, - "lws-compress": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lws-compress/-/lws-compress-3.1.0.tgz", - "integrity": "sha512-uBlpYFNBUD3FuQjXbtwasvD90w3HH6GRivknvbibSSsDQf1MtIM8WZ5fS4795n1ozTYnQD+Ai8T+Cpy0q0xuhA==", - "dev": true, - "requires": { - "koa-compress": "^5.0.1" - } - }, - "lws-conditional-get": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lws-conditional-get/-/lws-conditional-get-2.0.0.tgz", - "integrity": "sha512-U05yDlFJKIYa7gJZYfnc1HIEuXbKpDJztgkvNYyxCqJC28j/k9ORoNnFNOIHpBh/jlPJgV8x7uH34mIxFAryWA==", - "dev": true, - "requires": { - "koa-conditional-get": "^2.0.0", - "koa-etag": "^3.0.0" - } - }, - "lws-cors": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lws-cors/-/lws-cors-4.2.0.tgz", - "integrity": "sha512-s0j1Ui5w8jLhicjcnjUvcC0Dd3VgJZNwHbYNo6aSZPddbszpJJEUeLe6//tdc7dA6kx6iZ60Bc9ih4ty93yzbg==", - "dev": true, - "requires": { - "@koa/cors": "^3.4.3" - } - }, - "lws-index": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lws-index/-/lws-index-3.1.1.tgz", - "integrity": "sha512-f1rjsCkrKHVbSe03lm6xQ1GNnqzq/tL5f0ge8kXJFRorpS8Sv7WDXzUsGswmGAgxPPvDj8L7E6zwD+BCjQRU8w==", - "dev": true, - "requires": { - "serve-index-75lb": "^2.0.1" - } - }, - "lws-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lws-json/-/lws-json-2.0.0.tgz", - "integrity": "sha512-vqUFrAQ5BGpkMS2Mm/ZhgvUMi6Tgia7YtESG7pKjNoiSsD+TxncG0nqp8YjUh2xrEzi/SYFc/ed+9ZOl/t0A0g==", - "dev": true, - "requires": { - "koa-json": "^2.0.2" - } - }, - "lws-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lws-log/-/lws-log-2.0.0.tgz", - "integrity": "sha512-YveoazSZ0Qb1Tljdm8G8yn9c+mAMXgvLMACZzh5aZIk7p8YJwiXf9r1S+xY7wbXEcKG629KfVO0B5G5gRFcyDQ==", - "dev": true, - "requires": { - "koa-morgan": "^1.0.1", - "stream-log-stats": "^3.0.2" - } - }, - "lws-mime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lws-mime/-/lws-mime-2.0.0.tgz", - "integrity": "sha512-mfrAgRQ5+hkQ7LJ6EAgwnUeymNeYxwLXZY3UQ6C2hSTr7BqMSzm9k5O0C8wWP2dzdhChzITYKwzWbUnAYVBwtA==", - "dev": true - }, - "lws-range": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lws-range/-/lws-range-4.0.1.tgz", - "integrity": "sha512-rUkHpsRv5Ixr+8/E4cDCz6jUi6En6hnEaDZhPb0a1GU1vasOHhGcW0qilkgf0dtS0xDJzdKixdfcCW40ankIeQ==", - "dev": true, - "requires": { - "koa-range": "^0.3.0" - } - }, - "lws-request-monitor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lws-request-monitor/-/lws-request-monitor-2.0.0.tgz", - "integrity": "sha512-ZTo0/pS42qiejcYlL+wlpurSbDSS0J7pDDohqBx7jjUQkgni2Qd8cPzn/kW8QI82gXgDmdZH+ps0vheLHlgdgg==", - "dev": true, - "requires": { - "byte-size": "^6.2.0" - }, - "dependencies": { - "byte-size": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-6.2.0.tgz", - "integrity": "sha512-6EspYUCAPMc7E2rltBgKwhG+Cmk0pDm9zDtF1Awe2dczNUL3YpZ8mTs/dueOTS1hqGWBOatqef4jYMGjln7WmA==", - "dev": true - } - } - }, - "lws-rewrite": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lws-rewrite/-/lws-rewrite-3.1.1.tgz", - "integrity": "sha512-cOeaPXIlLUVLxS6BZ52QzZVzI8JjCzlWD4RWizB5Hd+0YGO0SPa3Vgk7CIghtAOsSdjtXg/wSOap2H1h+tw8BQ==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "koa-route": "^3.2.0", - "path-to-regexp": "^6.1.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - } - } - }, - "lws-spa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lws-spa/-/lws-spa-4.1.0.tgz", - "integrity": "sha512-B1YhxAY02EYu7J9dKBQMpYRwOd4iOtKK3TDdUR2GnJ4nsnvoxsJnMUpg8yxGmWZ6NI8itdUdQJlwqKg/Gji/vQ==", - "dev": true, - "requires": { - "koa-send": "^5.0.1" - } - }, - "lws-static": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lws-static/-/lws-static-3.1.0.tgz", - "integrity": "sha512-0fWZRluPda0raMEzTd2mY/REWsa5LxDz03j+Zer8yhFfbicJGaocTK1jOlRo/H5UEDImBdfSDZGlrmzMaF9Xcg==", - "dev": true, - "requires": { - "koa-static": "^5.0.0" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - }, - "dependencies": { - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - } - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dev": true, - "requires": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "node-stringify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-stringify/-/node-stringify-0.2.1.tgz", - "integrity": "sha512-EdzBiPO2hmQOpG8eZtJmBK0bAWPTdla2GAU4Tb7fztLkAiMEYcJAHWvC/4FI8E9ZOxB1zmoAJpM6upTQ54xNDw==", - "dev": true - }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "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=", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "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==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", - "optional": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", - "dev": true - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "openid-client": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.0.tgz", - "integrity": "sha512-hgJa2aQKcM2hn3eyVtN12tEA45ECjTJPXCgUh5YzTzy9qwapCvmDTVPWOcWVL0d34zeQoQ/hbG9lJhl3AYxJlQ==", - "optional": true, - "requires": { - "jose": "^4.10.0", - "lru-cache": "^6.0.0", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.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==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", - "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "preact": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", - "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "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==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qrcode-terminal": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "requires": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" - }, - "react-hook-form": { - "version": "7.43.5", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.5.tgz", - "integrity": "sha512-YcaXhuFHoOPipu5pC7ckxrLrialiOcU91pKu8P+isAcXZyMgByUK9PkI9j5fENO4+6XU5PwWXRGMIFlk9u9UBQ==", - "requires": {} - }, - "react-hot-toast": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.0.tgz", - "integrity": "sha512-qnnVbXropKuwUpriVVosgo8QrB+IaPJCpL8oBI6Ov84uvHZ5QQcTp2qg6ku2wNfgJl6rlQXJIQU5q+5lmPOutA==", - "requires": { - "goober": "^2.1.10" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-reflex": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/react-reflex/-/react-reflex-4.0.9.tgz", - "integrity": "sha512-XFTNRekFK4ul8mzVd1lniKT/SI0FvNYhXyLNl5gagS1i3iW9QKlpFYcRfVhZlxxaYHb8UyLOs3+H4Ay5cjtbxQ==", - "requires": { - "@babel/runtime": "^7.0.0", - "lodash.throttle": "^4.1.1", - "prop-types": "^15.5.8", - "react-measure": "^2.0.2" - }, - "dependencies": { - "react-measure": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/react-measure/-/react-measure-2.5.2.tgz", - "integrity": "sha512-M+rpbTLWJ3FD6FXvYV6YEGvQ5tMayQ3fGrZhRPHrE9bVlBYfDCLuDcgNttYfk8IqfOI03jz6cbpqMRTUclQnaA==", - "requires": { - "@babel/runtime": "^7.2.0", - "get-node-dimensions": "^1.2.1", - "prop-types": "^15.6.2", - "resize-observer-polyfill": "^1.5.0" - } - } - } - }, - "react-sizeme": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-3.0.2.tgz", - "integrity": "sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==", - "requires": { - "element-resize-detector": "^1.2.2", - "invariant": "^2.2.4", - "shallowequal": "^1.1.0", - "throttle-debounce": "^3.0.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", - "dev": true, - "requires": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfc4648": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.1.tgz", - "integrity": "sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rtl-css-js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", - "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "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==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", - "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index-75lb": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/serve-index-75lb/-/serve-index-75lb-2.0.1.tgz", - "integrity": "sha512-/d9r8bqJlFQcwy0a0nb1KnWAA+Mno+V+VaoKocdkbW5aXKRQd/+4bfnRhQRQr6uEoYwTRJ4xgztOyCJvWcpBpQ==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.18", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", - "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==" - }, - "stream-log-stats": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-log-stats/-/stream-log-stats-3.0.2.tgz", - "integrity": "sha512-393j7aeF9iRdHvyANqEQU82UQmpw2CTxgsT83caefh+lOxavVLbVrw8Mr4zjXeZLh2+xeHZMKfVx4T0rJ/EchA==", - "dev": true, - "requires": { - "ansi-escape-sequences": "^5.1.2", - "byte-size": "^6.2.0", - "common-log-format": "^1.0.0", - "JSONStream": "^1.3.5", - "lodash.throttle": "^4.1.1", - "stream-via": "^1.0.4", - "table-layout": "~1.0.0" - }, - "dependencies": { - "ansi-escape-sequences": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-5.1.2.tgz", - "integrity": "sha512-JcpoVp1W1bl1Qn4cVuiXEhD6+dyXKSOgCn2zlzE8inYgCJCBy1aPnUhlz6I4DFum8D4ovb9Qi/iAjUcGvG2lqw==", - "dev": true, - "requires": { - "array-back": "^4.0.0" - } - }, - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "byte-size": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-6.2.0.tgz", - "integrity": "sha512-6EspYUCAPMc7E2rltBgKwhG+Cmk0pDm9zDtF1Awe2dczNUL3YpZ8mTs/dueOTS1hqGWBOatqef4jYMGjln7WmA==", - "dev": true - } - } - }, - "stream-slice": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz", - "integrity": "sha1-LcT04bk2+xPz6zmi3vGTJ5jQeks=", - "dev": true - }, - "stream-via": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz", - "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==", - "dev": true - }, - "streaming-json-stringify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/streaming-json-stringify/-/streaming-json-stringify-3.1.0.tgz", - "integrity": "sha1-gCAEN6mTzDnE/gAmO3s7kDrIevU=", - "dev": true, - "requires": { - "json-stringify-safe": "5", - "readable-stream": "2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "string-replace-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz", - "integrity": "sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", - "dev": true, - "requires": {} - }, - "stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "tabster": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/tabster/-/tabster-4.5.0.tgz", - "integrity": "sha512-o89Vm0QYK79fQPD6344hFhxSxxK6HCU5yW2FSkOWMpSNtYTuw1YWVfvKlcK1NMwm112f3TCT/sCFsgFQmvaing==", - "requires": { - "keyborg": "^2.0.0", - "tslib": "^2.3.1" - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "terser": { - "version": "5.17.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", - "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "throttle-debounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - }, - "tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "requires": { - "tmp": "^0.2.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, - "tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - }, - "typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, - "universal-router": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/universal-router/-/universal-router-9.1.0.tgz", - "integrity": "sha512-lvD+R3Qb36Ld9suZuQW2hGJ1PfrRRxd568GM2thw/wByLurQUvqEOImE/lLjgeS5lhvcwuhc4vDt1JNO9q3S/g==", - "requires": { - "path-to-regexp": "^6.2.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "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" - } - }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - } - }, - "use-disposable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/use-disposable/-/use-disposable-1.0.1.tgz", - "integrity": "sha512-5Sle1XEmK3lw3xyGqeIY7UKkiUgF+TxwUty7fTsqM5D5AxfQfo2ft+LY9xKCA+W5YbaBFbOkWfQsZY/y5JhInA==", - "requires": {} - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - } - } - }, - "walk-back": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz", - "integrity": "sha512-Uhxps5yZcVNbLEAnb+xaEEMdgTXl9qAQDzKYejG2AZ7qPwRQ81lozY9ECDbjLPNWm7YsO1IK5rsP1KoQzXAcGA==", - "dev": true - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "webpack": { - "version": "5.86.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", - "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - } - }, - "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", - "requires": {} - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true - }, - "ylru": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", - "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/esp/src/package.json b/esp/src/package.json index 66c6ea7e967..20820be5e9b 100644 --- a/esp/src/package.json +++ b/esp/src/package.json @@ -34,17 +34,17 @@ }, "main": "src/stub.js", "dependencies": { - "@fluentui/react": "8.110.2", - "@fluentui/react-components": "9.21.0", - "@fluentui/react-experiments": "8.14.90", - "@fluentui/react-hooks": "8.6.27", - "@fluentui/react-icons-mdl2": "1.3.45", + "@fluentui/react": "8.110.7", + "@fluentui/react-components": "9.23.1", + "@fluentui/react-experiments": "8.14.95", + "@fluentui/react-hooks": "8.6.29", + "@fluentui/react-icons-mdl2": "1.3.47", "@hpcc-js/chart": "2.81.4", "@hpcc-js/codemirror": "2.60.9", "@hpcc-js/common": "2.71.9", - "@hpcc-js/comms": "2.82.3", + "@hpcc-js/comms": "2.83.1", "@hpcc-js/dataflow": "8.1.4", - "@hpcc-js/eclwatch": "2.73.18", + "@hpcc-js/eclwatch": "2.73.20", "@hpcc-js/graph": "2.85.5", "@hpcc-js/html": "2.42.10", "@hpcc-js/layout": "2.49.9", diff --git a/esp/src/src-react/components/DFUWorkunitDetails.tsx b/esp/src/src-react/components/DFUWorkunitDetails.tsx index 0bdd66549bd..5b28af9388b 100644 --- a/esp/src/src-react/components/DFUWorkunitDetails.tsx +++ b/esp/src/src-react/components/DFUWorkunitDetails.tsx @@ -4,8 +4,8 @@ import { scopedLogger } from "@hpcc-js/util"; import { SizeMe } from "react-sizeme"; import nlsHPCC from "src/nlsHPCC"; import * as FileSpray from "src/FileSpray"; -import * as ESPDFUWorkunit from "src/ESPDFUWorkunit"; import { useConfirm } from "../hooks/confirm"; +import { useDfuWorkunit } from "../hooks/workunit"; import { pivotItemStyle } from "../layouts/pivot"; import { pushUrl, replaceUrl } from "../util/history"; import { ShortVerticalDivider } from "./Common"; @@ -24,7 +24,7 @@ export const DFUWorkunitDetails: React.FunctionComponent { - const [workunit, setWorkunit] = React.useState(null); + const [workunit, , , , refresh] = useDfuWorkunit(wuid, true); const [wuXML, setWuXML] = React.useState(""); const [jobname, setJobname] = React.useState(""); const [_protected, setProtected] = React.useState(false); @@ -36,27 +36,19 @@ export const DFUWorkunitDetails: React.FunctionComponent { - workunit?.doDelete().then(() => replaceUrl("/dfuworkunits")); + workunit?.delete() + .then(response => { + replaceUrl("/dfuworkunits"); + }) + .catch(err => logger.error(err)) + ; }, [workunit]) }); - React.useEffect(() => { - const wu = ESPDFUWorkunit.Get(wuid); - setWorkunit(wu); - wu.watch((name, oldValue, newValue) => { - if (name === "JobName") { - setJobname(newValue); - } else if (name === "isProtected") { - setProtected(newValue); - } - }); - wu.refresh(); - }, [wuid]); - React.useEffect(() => { if (!workunit) return; workunit?.fetchXML().then(response => { - setWuXML(response); + setWuXML(response.file); }).catch(err => logger.error(err)); }, [workunit]); @@ -78,7 +70,7 @@ export const DFUWorkunitDetails: React.FunctionComponent { - workunit?.update({ JobName: jobname, isProtected: _protected }) + workunit?.update({ wu: { JobName: jobname, isProtected: _protected } }) .then(_ => { setShowMessageBar(true); workunit.refresh(); @@ -93,11 +85,11 @@ export const DFUWorkunitDetails: React.FunctionComponent [ { key: "refresh", text: nlsHPCC.Refresh, iconProps: { iconName: "Refresh" }, - onClick: () => workunit?.refresh() + onClick: () => refresh() }, { key: "copy", text: nlsHPCC.CopyWUID, iconProps: { iconName: "Copy" }, - onClick: () => navigator?.clipboard?.writeText(wuid) + onClick: () => { navigator?.clipboard?.writeText(wuid); } }, { key: "divider_1", itemType: ContextualMenuItemType.Divider, onRender: () => }, { @@ -111,9 +103,9 @@ export const DFUWorkunitDetails: React.FunctionComponent }, { key: "abort", text: nlsHPCC.Abort, disabled: canAbort, - onClick: () => workunit?.abort() + onClick: () => { workunit?.abort().catch(err => logger.error(err)); } }, - ], [canAbort, canDelete, canSave, saveWorkunit, setShowDeleteConfirm, workunit, wuid]); + ], [canAbort, canDelete, canSave, refresh, saveWorkunit, setShowDeleteConfirm, workunit, wuid]); return <> {({ size }) => @@ -151,8 +143,9 @@ export const DFUWorkunitDetails: React.FunctionComponent { @@ -173,9 +166,9 @@ export const DFUWorkunitDetails: React.FunctionComponent

{nlsHPCC.Target}

@@ -183,7 +176,7 @@ export const DFUWorkunitDetails: React.FunctionComponent

{nlsHPCC.Other}

diff --git a/esp/src/src-react/components/DFUWorkunits.tsx b/esp/src/src-react/components/DFUWorkunits.tsx index 1222f07c409..7dd2a0a93d4 100644 --- a/esp/src/src-react/components/DFUWorkunits.tsx +++ b/esp/src/src-react/components/DFUWorkunits.tsx @@ -1,5 +1,6 @@ import * as React from "react"; import { CommandBar, ContextualMenuItemType, ICommandBarItemProps, Icon, Image, Link } from "@fluentui/react"; +import { SizeMe } from "react-sizeme"; import * as ESPDFUWorkunit from "src/ESPDFUWorkunit"; import * as FileSpray from "src/FileSpray"; import * as Utility from "src/Utility"; @@ -38,6 +39,8 @@ function formatQuery(_filter): { [id: string]: any } { if (filter.Type === true) { filter.Type = "archived workunits"; } + filter.includeTimings = true; + filter.includeTransferRate = true; return filter; } @@ -92,7 +95,7 @@ export const DFUWorkunits: React.FunctionComponent = ({ }), isProtected: { headerIcon: "LockSolid", - width: 25, + width: 18, sortable: false, formatter: React.useCallback(function (_protected) { if (_protected === true) { @@ -103,7 +106,7 @@ export const DFUWorkunits: React.FunctionComponent = ({ }, ID: { label: nlsHPCC.ID, - width: 180, + width: 130, formatter: React.useCallback(function (ID, idx) { const wu = ESPDFUWorkunit.Get(ID); return <> @@ -115,7 +118,7 @@ export const DFUWorkunits: React.FunctionComponent = ({ }, Command: { label: nlsHPCC.Type, - width: 117, + width: 110, formatter: React.useCallback(function (command) { if (command in FileSpray.CommandMessages) { return FileSpray.CommandMessages[command]; @@ -124,14 +127,28 @@ export const DFUWorkunits: React.FunctionComponent = ({ }, []) }, User: { label: nlsHPCC.Owner, width: 90 }, - JobName: { label: nlsHPCC.JobName, width: 500 }, - ClusterName: { label: nlsHPCC.Cluster, width: 126 }, - StateMessage: { label: nlsHPCC.State, width: 72 }, + JobName: { label: nlsHPCC.JobName, width: 220 }, + ClusterName: { label: nlsHPCC.Cluster, width: 70 }, + StateMessage: { label: nlsHPCC.State, width: 70 }, PCTDone: { - label: nlsHPCC.PctComplete, width: 90, sortable: true, + label: nlsHPCC.PctComplete, width: 80, sortable: true, formatter: React.useCallback(function (value, row) { return Utility.valueCleanUp(row.PercentDone); }, []) + }, + TimeStarted: { label: nlsHPCC.TimeStarted, width: 100, sortable: true }, + TimeStopped: { label: nlsHPCC.TimeStopped, width: 100, sortable: true }, + KbPerSec: { + label: nlsHPCC.TransferRate, width: 90, + formatter: React.useCallback(function (value, row) { + return Utility.convertedSize(row.KbPerSec * 1024) + " / sec"; + }, []) + }, + KbPerSecAve: { // KbPerSecAve seems to never be different than KbPerSec, see HPCC-29894 + label: nlsHPCC.TransferRateAvg, width: 90, + formatter: React.useCallback(function (value, row) { + return Utility.convertedSize(row.KbPerSecAve * 1024) + " / sec"; + }, []) } } }); @@ -232,7 +249,13 @@ export const DFUWorkunits: React.FunctionComponent = ({ header={} main={ <> - + {({ size }) => +
+
+ +
+
+ }
diff --git a/esp/src/src-react/components/Files.tsx b/esp/src/src-react/components/Files.tsx index fc31ce81bb7..45aaa89e3c5 100644 --- a/esp/src/src-react/components/Files.tsx +++ b/esp/src/src-react/components/Files.tsx @@ -1,5 +1,6 @@ import * as React from "react"; import { CommandBar, ContextualMenuItemType, ICommandBarItemProps, Icon, Link } from "@fluentui/react"; +import { scopedLogger } from "@hpcc-js/util"; import * as WsDfu from "src/WsDfu"; import { CreateDFUQueryStore } from "src/ESPLogicalFile"; import { formatCost } from "src/Session"; @@ -21,6 +22,8 @@ import { RenameFile } from "./forms/RenameFile"; import { ShortVerticalDivider } from "./Common"; import { SizeMe } from "react-sizeme"; +const logger = scopedLogger("src-react/components/Files.tsx"); + const FilterFields: Fields = { "LogicalName": { type: "string", label: nlsHPCC.Name, placeholder: nlsHPCC.somefile }, "Description": { type: "string", label: nlsHPCC.Description, placeholder: nlsHPCC.SomeDescription }, @@ -218,7 +221,13 @@ export const Files: React.FunctionComponent = ({ message: nlsHPCC.DeleteSelectedFiles, items: selection.map(s => s.Name), onSubmit: React.useCallback(() => { - WsDfu.DFUArrayAction(selection, "Delete").then(() => refreshTable(true)); + WsDfu.DFUArrayAction(selection, "Delete") + .then(({ DFUArrayActionResponse }) => { + const ActionResults = DFUArrayActionResponse?.ActionResults?.DFUActionInfo ?? []; + ActionResults.filter(action => action?.Failed).forEach(action => logger.error(action?.ActionResult)); + refreshTable(true); + }) + .catch(err => logger.error(err)); }, [refreshTable, selection]) }); diff --git a/esp/src/src-react/components/Helpers.tsx b/esp/src/src-react/components/Helpers.tsx index 39bc2c5115a..1e686d13819 100644 --- a/esp/src/src-react/components/Helpers.tsx +++ b/esp/src/src-react/components/Helpers.tsx @@ -43,7 +43,7 @@ function getURL(item: HelperRow, option) { params = `/WUFile/res.txt?Wuid=${uriEncodedParams.Wuid}&Type=${uriEncodedParams.Type}`; break; case "ComponentLog": - params = `/WUFile/${item.Type}?Wuid=${uriEncodedParams.Wuid}&Name=${uriEncodedParams.Name}&Type=${uriEncodedParams.Type}`; + params = `/WUFile/${item.Type}?Wuid=${uriEncodedParams.Wuid}&Name=${uriEncodedParams.Name}&Type=${uriEncodedParams.Type}&LogFormat=2`; break; case "postmortem": params = `/WUFile/${item.Type}?Wuid=${uriEncodedParams.Wuid}&Name=${uriEncodedParams.Name}&Type=${uriEncodedParams.Type}`; diff --git a/esp/src/src-react/components/LandingZone.tsx b/esp/src/src-react/components/LandingZone.tsx index 37c7aca6da3..d950e03dd69 100644 --- a/esp/src/src-react/components/LandingZone.tsx +++ b/esp/src/src-react/components/LandingZone.tsx @@ -77,6 +77,8 @@ interface LandingZoneProps { filter?: LandingZoneFilter; } +let dzExpanded = ""; + export const LandingZone: React.FunctionComponent = ({ filter = emptyFilter }) => { @@ -134,6 +136,13 @@ export const LandingZone: React.FunctionComponent = ({ displayName: tree({ label: nlsHPCC.Name, sortable: false, + shouldExpand: function (row, level) { + if ((dzExpanded === "" || dzExpanded === row.data.DropZone.Name) && level <= 1) { + dzExpanded = row.data.DropZone.Name; + return true; + } + return false; + }, formatter: function (_name, row) { let img = ""; let name = row.displayName; diff --git a/esp/src/src-react/components/LogicalFileSummary.tsx b/esp/src/src-react/components/LogicalFileSummary.tsx index 4201e1bdbd2..0416e253424 100644 --- a/esp/src/src-react/components/LogicalFileSummary.tsx +++ b/esp/src/src-react/components/LogicalFileSummary.tsx @@ -59,6 +59,8 @@ export const LogicalFileSummary: React.FunctionComponent logger.error(err)); }, [file]) diff --git a/esp/src/src-react/components/Menu.tsx b/esp/src/src-react/components/Menu.tsx index 9526c43b751..a322e4eda3a 100644 --- a/esp/src/src-react/components/Menu.tsx +++ b/esp/src/src-react/components/Menu.tsx @@ -1,11 +1,10 @@ import * as React from "react"; -import { IconButton, IContextualMenuItem, INavLink, INavLinkGroup, Nav, Pivot, PivotItem, Stack } from "@fluentui/react"; +import { IconButton, IContextualMenuItem, INavLink, INavLinkGroup, Link, mergeStyleSets, Nav, Stack } from "@fluentui/react"; import { useConst } from "@fluentui/react-hooks"; import nlsHPCC from "src/nlsHPCC"; import { hasLogAccess } from "src/ESPLog"; import { containerized, bare_metal } from "src/BuildInfo"; import { MainNav, routes } from "../routes"; -import { pushUrl } from "../util/history"; import { useFavorite, useFavorites, useHistory } from "../hooks/favorite"; import { useUserTheme } from "../hooks/theme"; import { usePivotItemDisable } from "../layouts/pivot"; @@ -192,12 +191,6 @@ function subNavSelectedKey(hashPath) { return !!subNavIdx[hashCategory] ? hashCategory : null; } -const handleLinkClick = (item?: PivotItem) => { - if (item?.props?.itemKey) { - pushUrl(item.props.itemKey); - } -}; - interface SubNavigationProps { hashPath: string; } @@ -229,6 +222,51 @@ export const SubNavigation: React.FunctionComponent = ({ return `/${hashPath?.split("/")[1]}`; }, [hashPath]); + const navStyles = React.useMemo(() => mergeStyleSets({ + wrapper: { + marginLeft: 4, + }, + link: { + background: theme.semanticColors.buttonBackground, + color: theme.semanticColors.buttonText, + display: "inline-block", + margin: 2, + padding: "0 10px", + fontSize: 14, + textDecoration: "none", + selectors: { + ":hover": { + background: theme.palette.themePrimary, + color: theme.palette.white, + textDecoration: "none", + }, + ":focus": { + color: theme.semanticColors.buttonText + }, + ":active": { + color: theme.semanticColors.buttonText, + textDecoration: "none" + }, + ":focus:hover": { + color: theme.palette.white, + }, + ":active:hover": { + color: theme.palette.white, + textDecoration: "none" + } + } + }, + active: { + background: theme.palette.themePrimary, + color: theme.palette.white, + selectors: { + ":focus": { + color: theme.palette.white + } + } + } + }), [theme]); + const [logsDisabled, setLogsDisabled] = React.useState(true); React.useEffect(() => { hasLogAccess().then(response => { @@ -254,14 +292,24 @@ export const SubNavigation: React.FunctionComponent = ({ return
- - - - {subMenuItems[mainNav]?.map(row => )} - + + + {subMenuItems[mainNav]?.map(row => { + return + {row.headerText} + ; + })} {!subNav && - + } diff --git a/esp/src/src-react/components/Metrics.tsx b/esp/src/src-react/components/Metrics.tsx index 5a0832c2228..1292c779860 100644 --- a/esp/src/src-react/components/Metrics.tsx +++ b/esp/src/src-react/components/Metrics.tsx @@ -6,6 +6,7 @@ import { Table } from "@hpcc-js/dgrid"; import { compare, scopedLogger } from "@hpcc-js/util"; import nlsHPCC from "src/nlsHPCC"; import { WUTimelinePatched } from "src/Timings"; +import * as Utility from "src/Utility"; import { useDeepEffect } from "../hooks/deepHooks"; import { useMetricsOptions, useWorkunitMetrics } from "../hooks/metrics"; import { HolyGrail } from "../layouts/HolyGrail"; @@ -117,7 +118,7 @@ export const Metrics: React.FunctionComponent = ({ const [timelineFilter, setTimelineFilter] = React.useState(""); const [selectedMetrics, setSelectedMetrics] = React.useState([]); const [selectedMetricsPtr, setSelectedMetricsPtr] = React.useState(-1); - const [metrics, _columns, _activities, _properties, _measures, _scopeTypes, refresh] = useWorkunitMetrics(wuid); + const [metrics, columns, _activities, _properties, _measures, _scopeTypes, refresh] = useWorkunitMetrics(wuid); const [showMetricOptions, setShowMetricOptions] = React.useState(false); const [options, setOptions, saveOptions] = useMetricsOptions(); const [dockpanel, setDockpanel] = React.useState(); @@ -165,7 +166,7 @@ export const Metrics: React.FunctionComponent = ({ }, { key: "divider_1", itemType: ContextualMenuItemType.Divider, onRender: () => }, { - key: "timeline", text: nlsHPCC.Timeline, canCheck: true, checked: showTimeline, iconProps: { iconName: "BarChartHorizontal" }, + key: "timeline", text: nlsHPCC.Timeline, canCheck: true, checked: showTimeline, iconProps: { iconName: "TimelineProgress" }, onClick: () => { setShowTimeline(!showTimeline); } @@ -179,12 +180,36 @@ export const Metrics: React.FunctionComponent = ({ } ], [dockpanel, hotspots, onHotspot, options, refresh, setOptions, showTimeline]); + const formatColumns = React.useMemo((): Utility.ColumnMap => { + const copyColumns: Utility.ColumnMap = {}; + for (const key in columns) { + copyColumns[key] = { + field: key, + label: key + }; + } + return copyColumns; + }, [columns]); + const rightButtons = React.useMemo((): ICommandBarItemProps[] => [ { + key: "copy", text: nlsHPCC.CopyToClipboard, disabled: !metrics.length || !navigator?.clipboard?.writeText, iconOnly: true, iconProps: { iconName: "Copy" }, + onClick: () => { + const tsv = Utility.formatAsDelim(formatColumns, metrics, "\t"); + navigator?.clipboard?.writeText(tsv); + } + }, + { + key: "download", text: nlsHPCC.DownloadToCSV, disabled: !metrics.length, iconOnly: true, iconProps: { iconName: "Download" }, + onClick: () => { + const csv = Utility.formatAsDelim(formatColumns, metrics, ","); + Utility.downloadText(csv, `metrics-${wuid}.csv`); + } + }, { key: "fullscreen", title: nlsHPCC.MaximizeRestore, iconProps: { iconName: fullscreen ? "ChromeRestore" : "FullScreen" }, onClick: () => setFullscreen(!fullscreen) } - ], [fullscreen]); + ], [formatColumns, fullscreen, metrics, wuid]); // Timeline --- const timeline = useConst(() => new WUTimelinePatched() diff --git a/esp/src/src-react/components/SourceEditor.tsx b/esp/src/src-react/components/SourceEditor.tsx index adca4cd89e9..47af5122e45 100644 --- a/esp/src/src-react/components/SourceEditor.tsx +++ b/esp/src/src-react/components/SourceEditor.tsx @@ -2,6 +2,7 @@ import * as React from "react"; import { CommandBar, ContextualMenuItemType, ICommandBarItemProps, useTheme } from "@fluentui/react"; import { useConst, useOnEvent } from "@fluentui/react-hooks"; import { Editor, ECLEditor, XMLEditor, JSONEditor } from "@hpcc-js/codemirror"; +import { Workunit } from "@hpcc-js/comms"; import nlsHPCC from "src/nlsHPCC"; import { HolyGrail } from "../layouts/HolyGrail"; import { AutosizeHpccJSComponent } from "../layouts/HpccJSAdapter"; @@ -219,12 +220,14 @@ export const ECLSourceEditor: React.FunctionComponent = ({ interface FetchEditor { url: string; + wuid?: string; readonly?: boolean; mode?: "ecl" | "xml" | "text"; } export const FetchEditor: React.FunctionComponent = ({ url, + wuid, readonly = true, mode = "text" }) => { @@ -232,12 +235,19 @@ export const FetchEditor: React.FunctionComponent = ({ const [text, setText] = React.useState(""); React.useEffect(() => { - fetch(url).then(response => { - return response.text(); - }).then(content => { - setText(content); - }); - }, [url]); + if (wuid) { + const wu = Workunit.attach({ baseUrl: "" }, wuid); + wu.fetchQuery().then(function (query) { + setText(query?.Text ?? ""); + }); + } else { + fetch(url).then(response => { + return response.text(); + }).then(content => { + setText(content); + }); + } + }, [url, wuid]); return ; }; diff --git a/esp/src/src-react/components/SuperFileSummary.tsx b/esp/src/src-react/components/SuperFileSummary.tsx index 69d0cb6f5b8..ba5e16172e1 100644 --- a/esp/src/src-react/components/SuperFileSummary.tsx +++ b/esp/src/src-react/components/SuperFileSummary.tsx @@ -46,7 +46,7 @@ export const SuperFileSummary: React.FunctionComponent = action: "remove", superfile: file.Name, subfiles: { Item: subfiles.map(file => file.Name) }, - delete: true + removeSuperfile: true }) .then(() => replaceUrl("/files")) .catch(err => logger.error(err)) diff --git a/esp/src/src-react/components/Title.tsx b/esp/src/src-react/components/Title.tsx index 1a933c45367..510b8fb17ce 100644 --- a/esp/src/src-react/components/Title.tsx +++ b/esp/src/src-react/components/Title.tsx @@ -202,7 +202,7 @@ export const DevTitle: React.FunctionComponent = ({ document.title = environmentTitle; }, [environmentTitle]); - return
+ return
@@ -213,7 +213,7 @@ export const DevTitle: React.FunctionComponent = ({ - + {showEnvironmentTitle && environmentTitle.length ? environmentTitle : "ECL Watch"} diff --git a/esp/src/src-react/components/WorkunitDetails.tsx b/esp/src/src-react/components/WorkunitDetails.tsx index f8f66be72b8..d28de9fc137 100644 --- a/esp/src/src-react/components/WorkunitDetails.tsx +++ b/esp/src/src-react/components/WorkunitDetails.tsx @@ -103,7 +103,7 @@ export const WorkunitDetails: React.FunctionComponent = ({ {state ? - : + : } diff --git a/esp/src/src-react/components/forms/Fields.tsx b/esp/src/src-react/components/forms/Fields.tsx index 1ee3fe1ef66..248319adfed 100644 --- a/esp/src/src-react/components/forms/Fields.tsx +++ b/esp/src/src-react/components/forms/Fields.tsx @@ -447,7 +447,7 @@ export const TargetServerTextField: React.FunctionComponent(); React.useEffect(() => { - TpDropZoneQuery({ Name: "" }).then(response => { + TpDropZoneQuery({ request: { Name: "" } }).then(response => { const { TpDropZoneQueryResponse } = response; setTargetServers(TpDropZoneQueryResponse?.TpDropZones?.TpDropZone?.filter(row => row.Name === props.dropzone)[0]?.TpMachines?.TpMachine?.map(n => { return { @@ -904,7 +904,7 @@ export function createInputs(fields: Fields, onChange?: (id: string, newValue: a label: field.label, field: + percentComplete={parseInt(field.value, 10) / 100} /> }); break; case "workunit-state": diff --git a/esp/src/src-react/components/forms/TitlebarConfig.tsx b/esp/src/src-react/components/forms/TitlebarConfig.tsx index 186510be708..b0682975468 100644 --- a/esp/src/src-react/components/forms/TitlebarConfig.tsx +++ b/esp/src/src-react/components/forms/TitlebarConfig.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { Checkbox, ColorPicker, DefaultButton, getColorFromString, IColor, Label, PrimaryButton, TextField } from "@fluentui/react"; +import { Checkbox, ColorPicker, DefaultButton, getColorFromString, IColor, Label, PrimaryButton, TextField, TooltipHost } from "@fluentui/react"; import { useForm, Controller } from "react-hook-form"; import { MessageBox } from "../../layouts/MessageBox"; import { useGlobalStore } from "../../hooks/store"; @@ -95,23 +95,28 @@ export const TitlebarConfig: React.FunctionComponent = ({ /> } /> - } - /> - - + + } + /> + + + + + ; }; \ No newline at end of file diff --git a/esp/src/src-react/components/forms/landing-zone/DelimitedImportForm.tsx b/esp/src/src-react/components/forms/landing-zone/DelimitedImportForm.tsx index d9428553c5b..0997de56b41 100644 --- a/esp/src/src-react/components/forms/landing-zone/DelimitedImportForm.tsx +++ b/esp/src/src-react/components/forms/landing-zone/DelimitedImportForm.tsx @@ -17,6 +17,7 @@ interface DelimitedImportFormValues { namePrefix: string; selectedFiles?: { TargetName: string, + NumParts: string, SourceFile: string, SourceIP: string }[], @@ -96,9 +97,10 @@ export const DelimitedImportForm: React.FunctionComponent { @@ -133,6 +135,7 @@ export const DelimitedImportForm: React.FunctionComponent { newValues.selectedFiles[idx] = { TargetName: file["name"], + NumParts: file["NumParts"], SourceFile: file["fullPath"], SourceIP: file["NetAddress"] }; @@ -213,6 +216,7 @@ export const DelimitedImportForm: React.FunctionComponent {nlsHPCC.TargetName} + {nlsHPCC.NumberofParts} @@ -238,6 +242,26 @@ export const DelimitedImportForm: React.FunctionComponent + + + } + rules={{ + pattern: { + value: /^[0-9]+$/i, + message: nlsHPCC.ValidationErrorEnterNumber + } + }} + /> diff --git a/esp/src/src-react/components/forms/landing-zone/FixedImportForm.tsx b/esp/src/src-react/components/forms/landing-zone/FixedImportForm.tsx index 7fe084b1a96..89221ea4d8e 100644 --- a/esp/src/src-react/components/forms/landing-zone/FixedImportForm.tsx +++ b/esp/src/src-react/components/forms/landing-zone/FixedImportForm.tsx @@ -18,6 +18,7 @@ interface FixedImportFormValues { selectedFiles?: { TargetName: string, RecordSize: string, + NumParts: string, SourceFile: string, SourceIP: string, }[], @@ -80,9 +81,10 @@ export const FixedImportForm: React.FunctionComponent = ({ request["sourcePath"] = file.SourceFile; request["sourceRecordSize"] = file.RecordSize; request["destLogicalName"] = data.namePrefix + (( - data.namePrefix && data.namePrefix.substr(-2) !== "::" && - file.TargetName && file.TargetName.substr(0, 2) !== "::" + data.namePrefix && data.namePrefix.substring(-2) !== "::" && + file.TargetName && file.TargetName.substring(0, 2) !== "::" ) ? "::" : "") + file.TargetName; + request["destNumParts"] = file.NumParts; FileSpray.SprayFixed({ request: request }).then((response) => { @@ -118,6 +120,7 @@ export const FixedImportForm: React.FunctionComponent = ({ newValues.selectedFiles[idx] = { TargetName: file["name"], RecordSize: "", + NumParts: "", SourceFile: file["fullPath"], SourceIP: file["NetAddress"] }; @@ -199,6 +202,7 @@ export const FixedImportForm: React.FunctionComponent = ({ {nlsHPCC.TargetName} {nlsHPCC.RecordLength} + {nlsHPCC.NumberofParts} @@ -245,6 +249,26 @@ export const FixedImportForm: React.FunctionComponent = ({ } }} /> + + + } + rules={{ + pattern: { + value: /^[0-9]+$/i, + message: nlsHPCC.ValidationErrorEnterNumber + } + }} + /> diff --git a/esp/src/src-react/components/forms/landing-zone/JsonImportForm.tsx b/esp/src/src-react/components/forms/landing-zone/JsonImportForm.tsx index ac52da461a2..0595006d6ac 100644 --- a/esp/src/src-react/components/forms/landing-zone/JsonImportForm.tsx +++ b/esp/src/src-react/components/forms/landing-zone/JsonImportForm.tsx @@ -18,6 +18,7 @@ interface JsonImportFormValues { selectedFiles?: { TargetName: string, TargetRowPath: string, + NumParts: string, SourceFile: string, SourceIP: string }[], @@ -83,10 +84,11 @@ export const JsonImportForm: React.FunctionComponent = ({ request["sourcePath"] = file.SourceFile; request["isJSON"] = true; request["destLogicalName"] = data.namePrefix + (( - data.namePrefix && data.namePrefix.substr(-2) !== "::" && - file.TargetName && file.TargetName.substr(0, 2) !== "::" + data.namePrefix && data.namePrefix.substring(-2) !== "::" && + file.TargetName && file.TargetName.substring(0, 2) !== "::" ) ? "::" : "") + file.TargetName; request["sourceRowTag"] = file.TargetRowPath; + request["destNumParts"] = file.NumParts; FileSpray.SprayVariable({ request: request }).then((response) => { @@ -122,6 +124,7 @@ export const JsonImportForm: React.FunctionComponent = ({ newValues.selectedFiles[idx] = { TargetName: file["name"], TargetRowPath: "/", + NumParts: "", SourceFile: file["fullPath"], SourceIP: file["NetAddress"] }; @@ -203,6 +206,7 @@ export const JsonImportForm: React.FunctionComponent = ({ {nlsHPCC.TargetName} {nlsHPCC.RowPath} + {nlsHPCC.NumberofParts} @@ -240,6 +244,26 @@ export const JsonImportForm: React.FunctionComponent = ({ errorMessage={error && error?.message} />} /> + + + } + rules={{ + pattern: { + value: /^[0-9]+$/i, + message: nlsHPCC.ValidationErrorEnterNumber + } + }} + /> diff --git a/esp/src/src-react/components/forms/landing-zone/XmlImportForm.tsx b/esp/src/src-react/components/forms/landing-zone/XmlImportForm.tsx index e587758a835..4b66e0e5fbd 100644 --- a/esp/src/src-react/components/forms/landing-zone/XmlImportForm.tsx +++ b/esp/src/src-react/components/forms/landing-zone/XmlImportForm.tsx @@ -18,6 +18,7 @@ interface XmlImportFormValues { selectedFiles?: { TargetName: string, TargetRowTag: string, + NumParts: string, SourceFile: string, SourceIP: string }[], @@ -82,10 +83,11 @@ export const XmlImportForm: React.FunctionComponent = ({ request["sourceIP"] = file.SourceIP; request["sourcePath"] = file.SourceFile; request["destLogicalName"] = data.namePrefix + (( - data.namePrefix && data.namePrefix.substr(-2) !== "::" && - file.TargetName && file.TargetName.substr(0, 2) !== "::" + data.namePrefix && data.namePrefix.substring(-2) !== "::" && + file.TargetName && file.TargetName.substring(0, 2) !== "::" ) ? "::" : "") + file.TargetName; request["sourceRowTag"] = file.TargetRowTag; + request["destNumParts"] = file.NumParts; FileSpray.SprayVariable({ request: request }).then((response) => { @@ -121,6 +123,7 @@ export const XmlImportForm: React.FunctionComponent = ({ newValues.selectedFiles[idx] = { TargetName: file["name"], TargetRowTag: "Row", + NumParts: "", SourceFile: file["fullPath"], SourceIP: file["NetAddress"] }; @@ -201,6 +204,8 @@ export const XmlImportForm: React.FunctionComponent = ({ {nlsHPCC.TargetName} + {nlsHPCC.RowTag} + {nlsHPCC.NumberofParts} @@ -238,6 +243,26 @@ export const XmlImportForm: React.FunctionComponent = ({ errorMessage={error && error?.message} />} /> + + + } + rules={{ + pattern: { + value: /^[0-9]+$/i, + message: nlsHPCC.ValidationErrorEnterNumber + } + }} + /> diff --git a/esp/src/src-react/hooks/banner.tsx b/esp/src/src-react/hooks/banner.tsx index 85c7793837f..6d75ed82b0d 100644 --- a/esp/src/src-react/hooks/banner.tsx +++ b/esp/src/src-react/hooks/banner.tsx @@ -101,16 +101,12 @@ export function useBanner({ showForm, setShowForm }: useBannerProps): [React.Fun }) => } - rules={{ - required: nlsHPCC.ValidationErrorRequired - }} /> { - this.doWrite(dateTime, level, id, `${ex.Code}: ${ex.Message}`); + const msg = Utility.decodeHTML(ex.Message); + this.doWrite(dateTime, level, id, `${ex.Code}: ${msg}`); }); - } else if (_msg instanceof Error) { - this.doWrite(dateTime, level, id, _msg.message); - } else if (typeof _msg !== "string") { - this.doWrite(dateTime, level, id, JSON.stringify(_msg, undefined, 2)); - } else if (typeof _msg === "string") { + } else { + if (_msg instanceof Error) { + _msg = _msg.message; + } else if (typeof _msg !== "string") { + _msg = JSON.stringify(_msg, undefined, 2); + } + _msg = Utility.decodeHTML(_msg); this.doWrite(dateTime, level, id, _msg); } } diff --git a/esp/src/src-react/hooks/workunit.ts b/esp/src/src-react/hooks/workunit.ts index c0b0f20f06d..783061de755 100644 --- a/esp/src/src-react/hooks/workunit.ts +++ b/esp/src/src-react/hooks/workunit.ts @@ -1,6 +1,6 @@ import * as React from "react"; import { useConst } from "@fluentui/react-hooks"; -import { Workunit, Result, WUDetails, WUStateID, WUInfo, WorkunitsService } from "@hpcc-js/comms"; +import { Workunit, DFUWorkunit, Result, WUDetails, WUStateID, WUInfo, WorkunitsService } from "@hpcc-js/comms"; import { scopedLogger } from "@hpcc-js/util"; import nlsHPCC from "src/nlsHPCC"; import * as Utility from "src/Utility"; @@ -329,3 +329,36 @@ export function useGlobalWorkunitNotes(): [WUDetails.Note[]] { return [notes]; } + +export function useDfuWorkunit(wuid: string, full: boolean = false): [DFUWorkunit, WUStateID, number, boolean, (full?: boolean) => Promise] { + + // eslint-disable-next-line func-call-spacing + const [retVal, setRetVal] = React.useState<{ workunit: DFUWorkunit, state: number, lastUpdate: number, isComplete: boolean, refresh: (full?: boolean) => Promise }>(); + + React.useEffect(() => { + if (wuid === undefined || wuid === null) { + setRetVal({ workunit: undefined, state: WUStateID.NotFound, lastUpdate: Date.now(), isComplete: undefined, refresh: () => Promise.resolve(undefined) }); + return; + } + const wu = DFUWorkunit.attach({ baseUrl: "" }, wuid); + let active = true; + let handle; + const refresh = singletonDebounce(wu, "refresh"); + refresh(full) + .then(() => { + if (active) { + setRetVal({ workunit: wu, state: wu.State, lastUpdate: Date.now(), isComplete: wu.isComplete(), refresh }); + handle = wu.watch(() => { + setRetVal({ workunit: wu, state: wu.State, lastUpdate: Date.now(), isComplete: wu.isComplete(), refresh }); + }); + } + }).catch(err => logger.error(err)); + + return () => { + active = false; + handle?.release(); + }; + }, [wuid, full]); + + return [retVal?.workunit, retVal?.state, retVal?.lastUpdate, retVal?.isComplete, retVal?.refresh]; +} diff --git a/esp/src/src-react/theme-shims/v9ThemeShim.ts b/esp/src/src-react/theme-shims/v9ThemeShim.ts index 67cc2adab99..dba55875677 100644 --- a/esp/src/src-react/theme-shims/v9ThemeShim.ts +++ b/esp/src/src-react/theme-shims/v9ThemeShim.ts @@ -1,7 +1,13 @@ // See https://github.com/microsoft/fluentui/blob/master/apps/public-docsite-v9/src/shims/ThemeShim/v9ThemeShim.ts import { IEffects, IPalette, Theme as ThemeV8 } from "@fluentui/react"; -import { BorderRadiusTokens, ColorTokens, ShadowTokens, Theme as ThemeV9, webLightTheme } from "@fluentui/react-components"; +import { + BorderRadiusTokens, + ColorTokens, + ShadowTokens, + Theme as ThemeV9, + webLightTheme, +} from "@fluentui/react-components"; import { blackAlpha, whiteAlpha, grey, grey10Alpha, grey12Alpha } from "./themeDuplicates"; /** @@ -43,6 +49,8 @@ const mapAliasColors = (palette: IPalette, inverted: boolean): ColorTokens => { colorCompoundBrandForeground1Pressed: palette.themeDark, colorBrandForeground1: palette.themePrimary, colorBrandForeground2: palette.themeDarkAlt, + colorBrandForeground2Hover: palette.themeDarkAlt, + colorBrandForeground2Pressed: palette.themeDarkAlt, colorNeutralForeground1Static: palette.neutralPrimary, colorNeutralForegroundInverted: palette.white, colorNeutralForegroundInvertedHover: palette.white, @@ -119,6 +127,8 @@ const mapAliasColors = (palette: IPalette, inverted: boolean): ColorTokens => { colorCompoundBrandBackgroundPressed: palette.themeDark, colorBrandBackgroundStatic: palette.themePrimary, colorBrandBackground2: palette.themeLighterAlt, + colorBrandBackground2Hover: palette.themeLighterAlt, + colorBrandBackground2Pressed: palette.themeLighterAlt, colorBrandBackgroundInverted: palette.white, colorBrandBackgroundInvertedHover: palette.themeLighterAlt, colorBrandBackgroundInvertedPressed: palette.themeLight, @@ -133,6 +143,7 @@ const mapAliasColors = (palette: IPalette, inverted: boolean): ColorTokens => { colorNeutralStroke1Selected: palette.neutralTertiaryAlt, colorNeutralStroke2: palette.neutralQuaternaryAlt, colorNeutralStroke3: palette.neutralLighter, + colorNeutralStrokeSubtle: palette.neutralQuaternaryAlt, colorNeutralStrokeOnBrand: palette.white, colorNeutralStrokeOnBrand2: palette.white, colorNeutralStrokeOnBrand2Hover: palette.white, @@ -140,6 +151,8 @@ const mapAliasColors = (palette: IPalette, inverted: boolean): ColorTokens => { colorNeutralStrokeOnBrand2Selected: palette.white, colorBrandStroke1: palette.themePrimary, colorBrandStroke2: palette.themeLight, + colorBrandStroke2Hover: palette.themeLight, + colorBrandStroke2Pressed: palette.themeLight, colorCompoundBrandStroke: palette.themePrimary, colorCompoundBrandStrokeHover: palette.themeDarkAlt, colorCompoundBrandStrokePressed: palette.themeDark, diff --git a/esp/src/src/ECLArchiveWidget.ts b/esp/src/src/ECLArchiveWidget.ts index eb28fcacd3f..7741afa794c 100644 --- a/esp/src/src/ECLArchiveWidget.ts +++ b/esp/src/src/ECLArchiveWidget.ts @@ -131,7 +131,7 @@ export class ECLArchiveWidget { const wu = Workunit.attach({ baseUrl: "" }, params.Wuid); wu.fetchQuery().then(function (query) { - context.editor.text(query.Text); + context.editor.text(query?.Text ?? ""); if (!wu.HasArchiveQuery) { context.archiveViewer .addWidget(context.editor) diff --git a/esp/src/src/ESPLogicalFile.ts b/esp/src/src/ESPLogicalFile.ts index b62354bf4e0..62f7a8a8e54 100644 --- a/esp/src/src/ESPLogicalFile.ts +++ b/esp/src/src/ESPLogicalFile.ts @@ -510,7 +510,7 @@ export function CreateDFUQueryStore(): BaseStore { return { - data: response.DFULogicalFiles.DFULogicalFile, + data: response?.DFULogicalFiles?.DFULogicalFile ?? [], total: response.NumFiles }; }); diff --git a/esp/src/src/Utility.ts b/esp/src/src/Utility.ts index 2361ba9db91..56f5cfec24f 100644 --- a/esp/src/src/Utility.ts +++ b/esp/src/src/Utility.ts @@ -232,7 +232,14 @@ export function espSkew2NumberTests() { }, this); } -export function formatAsDelim(columns, rows: any, delim = ",") { +export interface Column { + selectorType?: string; + id?: string; + field: string; + label: string; +} +export type ColumnMap = { [id: string]: Column }; +export function formatAsDelim(columns: ColumnMap, rows: any, delim = ",") { const container: string[] = []; const headerNames: string[] = []; diff --git a/esp/src/src/WsTopology.ts b/esp/src/src/WsTopology.ts index d6643abc218..d23e4bc97f3 100644 --- a/esp/src/src/WsTopology.ts +++ b/esp/src/src/WsTopology.ts @@ -225,7 +225,9 @@ export function TpGetServicePlugins(params) { return ESPRequest.send("WsTopology", "TpGetServicePlugins", params); } export function TpDropZoneQuery(params) { - return ESPRequest.send("WsTopology", "TpDropZoneQuery", params); + const _params = { request: {}, ...params }; + _params.request = { ...{ ECLWatchVisibleOnly: true }, ...params.request }; + return ESPRequest.send("WsTopology", "TpDropZoneQuery", _params); } export function TpGetComponentFile(params) { params.handleAs = "text"; diff --git a/esp/src/src/nls/bs/hpcc.ts b/esp/src/src/nls/bs/hpcc.ts index 9ab8227e54d..7e4d7510085 100644 --- a/esp/src/src/nls/bs/hpcc.ts +++ b/esp/src/src/nls/bs/hpcc.ts @@ -9,6 +9,7 @@ AboutHPCCSystemsGraphControl: "O Grafičkoj Kontroli HPCC Sistema", AboutToLoseSessionInformation: "Vi ćete se odjaviti i izgubiti sve informacije o sesiji. Da li želite da nastavite?", Account: "Račun", + AccountDisabled: "Račun je onemogućen. Kontaktirajte administratora sistema.", Action: "Akcija", Activate: "Aktivirajte", Activated: "Aktiviran", @@ -115,6 +116,7 @@ Columns: "Kolone", Command: "Komanda", Comment: "Komentar", + Compilation: "Kompilacija", CompileCost: "Cijena kompajliranja", Compiled: "Kompajlirano", Compiling: "U procesu kompajliranja", @@ -1073,7 +1075,9 @@ WSDL: "WSDL", WUID: "WUID", Wuidcannotbeempty: "Wuid Ne Može Biti Prazan.", + WUSnapshot: "Snimak radne jedinice", WUSnapShot: "Trenutna Slika Radne Jedinice", + WUSnapshots: "Snimci radne jedinice", XGMML: "XGMML", XLS: "XLS", XML: "XML", diff --git a/esp/src/src/nls/es/hpcc.ts b/esp/src/src/nls/es/hpcc.ts index 44b8707ad5e..837e4ea9001 100644 --- a/esp/src/src/nls/es/hpcc.ts +++ b/esp/src/src/nls/es/hpcc.ts @@ -9,6 +9,7 @@ export = { AboutHPCCSystemsGraphControl: "Acerca del controlador gráfico de HPCC Systems®", AboutToLoseSessionInformation: "Está a punto de cerrar la sesión y perder toda la información de la sesión. ¿Desea continuar?", Account: "Cuenta", + AccountDisabled: "Cuenta deshabilitada. Póngase en contacto con el administrador del sistema.", Action: "Acción", Activate: "Activar", Activated: "Activado", @@ -115,6 +116,7 @@ export = { Columns: "Columnas", Command: "Comando", Comment: "Comentario", + Compilation: "Compilacion", CompileCost: "Costo de compilación", Compiled: "Compilado", Compiling: "Compilando", @@ -1075,6 +1077,7 @@ export = { WUID: "WUID", Wuidcannotbeempty: "Wuid no puede estar vacío.", WUSnapShot: "Captura de Unidad de trabajo", + WUSnapshots: "Captura de Unidades de trabajo", XGMML: "XGMML", XLS: "XLS", XML: "XML", diff --git a/esp/src/src/nls/fr/hpcc.ts b/esp/src/src/nls/fr/hpcc.ts index 0e932359d85..9b92a56f674 100644 --- a/esp/src/src/nls/fr/hpcc.ts +++ b/esp/src/src/nls/fr/hpcc.ts @@ -9,6 +9,7 @@ export = { AboutHPCCSystemsGraphControl: "À propos de HPCC Systems® Graph Control", AboutToLoseSessionInformation: "Vous êtres en train de vous disconnecter et perdre toutes les information de cette session. Aimeriez-vous procéder à cette action?", Account: "Compte", + AccountDisabled: "Compte désactivé. Contactez l'administrateur du système.", Action: "Action", Activate: "Activer", Activated: "Activé", @@ -115,6 +116,7 @@ export = { Columns: "Colonnes", Command: "Commander", Comment: "Commenter", + Compilation: "Compilation", CompileCost: "Compiler le coût", Compiled: "Compilé", Compiling: "Compilant", @@ -1069,6 +1071,7 @@ export = { WUID: "WUID", Wuidcannotbeempty: "WUID peut pas être vide.", WUSnapShot: "Snap Shot de WU", + WUSnapshots: "WU Snapshots", XGMML: "XGMML", XLS: "XLS", XML: "XML", diff --git a/esp/src/src/nls/hpcc.ts b/esp/src/src/nls/hpcc.ts index fce3104fecc..3a616e15446 100644 --- a/esp/src/src/nls/hpcc.ts +++ b/esp/src/src/nls/hpcc.ts @@ -70,10 +70,12 @@ export = { AutoRefreshIncrement: "Auto Refresh Increment", AutoRefreshEvery: "Auto refresh every x minutes", Back: "Back", - BannerColor: "Banner Colour", + BannerColor: "Banner Color", + BannerColorTooltip: "Change the background color of the top navigation", BannerMessage: "Banner Message", + BannerMessageTooltip: "Change the title displayed in the top navigation (default \"ECL Watch\")", BannerScroll: "Banner Scroll", - BannerSize: "Banner Size", + BannerSize: "Banner Size (in pixels)", Bind: "Bind", Binding: "Binding", BindingDeleted: "Binding Deleted", @@ -993,6 +995,8 @@ export = { TotalSize: "Total Size", TotalClusterTime: "Total Cluster Time", ToTime: "To Time", + TransferRate: "Transfer Rate", + TransferRateAvg: "Transfer Rate (Avg)", TransitionGuide: "Transition Guide", Text: "Text", Tree: "Tree", diff --git a/esp/src/src/nls/hr/hpcc.ts b/esp/src/src/nls/hr/hpcc.ts index 41b70e5e26b..a4ed3ccabdf 100644 --- a/esp/src/src/nls/hr/hpcc.ts +++ b/esp/src/src/nls/hr/hpcc.ts @@ -9,6 +9,7 @@ AboutHPCCSystemsGraphControl: "O Grafičkoj Kontroli HPCC Sistema", AboutToLoseSessionInformation: "Odjavit ćete se i izgubit ćete sve informacije o sesiji. Želite li nastaviti?", Account: "Račun", + AccountDisabled: "Račun onemogućen. Kontaktirajte administratora sustava.", Action: "Akcija", Activate: "Aktivirajte", Activated: "Aktiviran", @@ -115,6 +116,7 @@ Columns: "Kolone", Command: "Komanda", Comment: "Komentar", + Compilation: "Kompilacija", CompileCost: "Trošak kompilacije", Compiled: "Kompajlirano", Compiling: "U procesu kompajliranja", @@ -1073,7 +1075,9 @@ WSDL: "WSDL", WUID: "WUID", Wuidcannotbeempty: "Wuid Ne Može Biti Prazan.", + WUSnapshot: "Snimak radne jedinice", WUSnapShot: "Trenutna Slika Radne Jedinice", + WUSnapshots: "Snimke radnih jedinica", XGMML: "XGMML", XLS: "XLS", XML: "XML", diff --git a/esp/src/src/nls/hu/hpcc.ts b/esp/src/src/nls/hu/hpcc.ts index cec33bdbdf8..ab3c6755ff4 100644 --- a/esp/src/src/nls/hu/hpcc.ts +++ b/esp/src/src/nls/hu/hpcc.ts @@ -9,6 +9,7 @@ export = { AboutHPCCSystemsGraphControl: "HPCC Systems® Graph Control névjegye", AboutToLoseSessionInformation: "Ön arra készül, hogy kilépjen a rendszerből és ezzel elveszti az összes aktív folyamatra vonatkozó információt. Kívánja folytatni?", Account: "Felhasználói fiók", + AccountDisabled: "A fiók zárolt! Kérjük, lépjen kapcsolatba a rendszer-adminisztrátorral.", Action: "Művelet", Activate: "Aktivál", Activated: "Aktivizált", @@ -115,6 +116,7 @@ export = { Columns: "Oszlopok", Command: "Parancs", Comment: "Megjegyzés", + Compilation: "Fordítás", CompileCost: "Fordítási költség", Compiled: "Fordítás kész", Compiling: "Fordítás folyamatban", @@ -1074,7 +1076,9 @@ export = { WSDL: "WSDL", WUID: "WUID", Wuidcannotbeempty: "Wuid megadása kötelező!", + WUSnapshot: "Munkaegység pillanatfelvétel", WUSnapShot: "WU pillanatfelvétel", + WUSnapshots: "Munkaegység pillanatfelvételek", XGMML: "XGMML", XLS: "XLS", XML: "XML", diff --git a/esp/src/src/nls/pt-br/hpcc.ts b/esp/src/src/nls/pt-br/hpcc.ts index bb2189b19af..ce2cec03903 100644 --- a/esp/src/src/nls/pt-br/hpcc.ts +++ b/esp/src/src/nls/pt-br/hpcc.ts @@ -9,6 +9,7 @@ AboutHPCCSystemsGraphControl: "Sobre Controle de Gráphico do HPCC Systems®", AboutToLoseSessionInformation: "Você está prestes a sair e perder todas as informações da sessão. Você deseja continuar?", Account: "Conta", + AccountDisabled: "Conta desativada. Entre em contato com o administrador do sistema.", Action: "Ação", Activate: "Ativar", Activated: "Ativa", @@ -115,6 +116,7 @@ Columns: "Colunas", Command: "Comando", Comment: "Comentário", + Compilation: "Compilação", CompileCost: "Custo de compilação", Compiled: "Compilado", Compiling: "Compilando", @@ -1077,6 +1079,8 @@ WUID: "WUID", Wuidcannotbeempty: "Wuid não pode estar vazia", WUSnapShot: "Instantâneo de WU", + WUSnapshot: "Instantâneo WU", + WUSnapshots: "Instantâneos do WU", XGMML: "XGMML", XLS: "XLS", XML: "XML", diff --git a/esp/src/src/nls/sr/hpcc.ts b/esp/src/src/nls/sr/hpcc.ts index 93081406bd1..609bc230208 100644 --- a/esp/src/src/nls/sr/hpcc.ts +++ b/esp/src/src/nls/sr/hpcc.ts @@ -9,6 +9,7 @@ AboutHPCCSystemsGraphControl: "О Графичкој Контроли ХПЦЦ Система", AboutToLoseSessionInformation: "Ако се одјавите, изгубићете све информације о сесији. Да ли желите да наставите?", Account: "Рачун", + AccountDisabled: "Налог је онемогућен. Обратите се администратору система.", Action: "Акција", Activate: "Активирајте", Activated: "Активиран", @@ -116,6 +117,7 @@ Columns: "Колоне", Command: "Команда", Comment: "Коментар", + Compilation: "Компилација", CompileCost: "Трошкови компилације", Compiled: "Компајлирано", Compiling: "У процесу компајлирања", @@ -1074,7 +1076,9 @@ WSDL: "WSDL", WUID: "PJИД", Wuidcannotbeempty: "Pjид Не Може Бити Празан.", + WUSnapshot: "Снимак радне јединице", WUSnapShot: "Тренутна Слика Радне Јединице", + WUSnapshots: "Снимци радне јединице", XGMML: "XГММЛ", XLS: "XЛС", XML: "XМЛ", diff --git a/esp/src/src/nls/zh/hpcc.ts b/esp/src/src/nls/zh/hpcc.ts index d793d40deb2..0e54f268b5a 100644 --- a/esp/src/src/nls/zh/hpcc.ts +++ b/esp/src/src/nls/zh/hpcc.ts @@ -9,6 +9,7 @@ AboutHPCCSystemsGraphControl: "HPCC系统图形控制器简介", AboutToLoseSessionInformation: "现在退出系统,与当前进程有关的信息将丢失。您确认马上退出系统吗?", Account: "账户", + AccountDisabled: "账户已禁用。 请联系系统管理员", Action: "操作", Activate: "激活", Activated: "已激活", @@ -115,6 +116,7 @@ Columns: "列", Command: "指令", Comment: "注释", + Compilation: "汇编", CompileCost: "编译费用", Compiled: "已编译", Compiling: "编译", @@ -1073,7 +1075,9 @@ WSDL: "WSDL", WUID: "工作单元标识", Wuidcannotbeempty: "工作单元标识不可空缺.", + WUSnapshot: "WU 截屏", WUSnapShot: "工作单元简单印象", + WUSnapshots: "WU 截屏", XGMML: "XGMML", XLS: "XLS", XML: "XML", diff --git a/esp/xslt/CMakeLists.txt b/esp/xslt/CMakeLists.txt index 91ecc66a870..53666fb5690 100644 --- a/esp/xslt/CMakeLists.txt +++ b/esp/xslt/CMakeLists.txt @@ -43,6 +43,7 @@ FOREACH( iFILES ${CMAKE_CURRENT_SOURCE_DIR}/esdl2monitor.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esdl2monitor_cassandra.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esxdl2xsd.xslt + ${CMAKE_CURRENT_SOURCE_DIR}/esp_service_xml2xsd.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esdl2java_srvbase.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esdl2java_srvdummy.xslt ${CMAKE_CURRENT_SOURCE_DIR}/esdl2cpp_srvbasehpp.xslt diff --git a/esp/xslt/esp_service_xml2xsd.xslt b/esp/xslt/esp_service_xml2xsd.xslt new file mode 100644 index 00000000000..dc1a6b3d7d0 --- /dev/null +++ b/esp/xslt/esp_service_xml2xsd.xslt @@ -0,0 +1,604 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + + + + + + + + + + + + + + + + + + + ArrayOf + + + + + + + tns: + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + xsd: + + xsd: + + xsd: + + xsd: + + xsd: + + xsd: + + tns: + + + + + + + + true + false + + + Test string: <abc> & <def> + + + + + + + + + + + +
+ + + + + + + + + + + + + + true + false + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xsd: + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + tns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xsd:string + + + tns: + + + + + + + + + + + + + + + + + + + + + + + + tns:EspStringArray + + + + + + + + + + + + + + + tns:ArrayOf + + + + + + + + + + + + + + + xsd:string + tns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SoapIn + + + + tns: + + tns: + + + + + + + SoapOut + + tns: + + + + + + ServiceSoap + + + + + + + tns:SoapIn + + + tns:SoapOut + + + + + + + + ServiceSoap + tns:ServiceSoap + + + + + + + + /?ver_= + + + + + + + + + + + + + + + + + + + + ServiceSoap + tns:ServiceSoap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/fs/dafilesrv/dafilesrv.cpp b/fs/dafilesrv/dafilesrv.cpp index fcaad166304..efbf863e5a6 100644 --- a/fs/dafilesrv/dafilesrv.cpp +++ b/fs/dafilesrv/dafilesrv.cpp @@ -40,6 +40,7 @@ static const char* defaultRowSericeConfiguration = "RowSvc"; #include "remoteerr.hpp" #include "dafscommon.hpp" #include "rmtclient.hpp" +#include "rmtfile.hpp" #include "dafsserver.hpp" void usage() @@ -675,6 +676,8 @@ int main(int argc, const char* argv[]) dedicatedRowServiceSSL = dafileSrvInstance->getPropBool("@rowServiceSSL", dedicatedRowServiceSSL); rowServiceOnStdPort = dafileSrvInstance->getPropBool("@rowServiceOnStdPort", rowServiceOnStdPort); + installDefaultFileHooks(dafileSrvInstance); + #ifndef _CONTAINERIZED if (isdaemon) { diff --git a/fs/dafsserver/dafsserver.cpp b/fs/dafsserver/dafsserver.cpp index 3e7a8b7c614..05cf49cabe7 100644 --- a/fs/dafsserver/dafsserver.cpp +++ b/fs/dafsserver/dafsserver.cpp @@ -2410,7 +2410,7 @@ class CRemoteDiskWriteActivity : public CRemoteWriteBaseActivity { typedef CRemoteWriteBaseActivity PARENT; - unsigned compressionFormat = 0; + unsigned compressionFormat = COMPRESS_METHOD_NONE; bool eogPending = false; bool someInGroup = false; size32_t recordSize = 0; @@ -2456,7 +2456,7 @@ class CRemoteDiskWriteActivity : public CRemoteWriteBaseActivity if (strieq("true", compressed)) compressionFormat = translateToCompMethod(nullptr); // gets default else if (strieq("false", compressed)) - compressionFormat = 0; + compressionFormat = COMPRESS_METHOD_NONE; else compressionFormat = translateToCompMethod(compressed); } @@ -3841,7 +3841,8 @@ class CRemoteFileServer : implements IRemoteFileServer, public CInterface Owned file = createIFile(name->text); switch ((compatIFSHmode)share) { case compatIFSHnone: - file->setCreateFlags(S_IRUSR|S_IWUSR); + if (mode != IFOread) + file->setCreateFlags(S_IRUSR|S_IWUSR); file->setShareMode(IFSHnone); break; case compatIFSHread: @@ -3851,10 +3852,12 @@ class CRemoteFileServer : implements IRemoteFileServer, public CInterface file->setShareMode(IFSHfull); break; case compatIFSHexec: - file->setCreateFlags(S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); + if (mode != IFOread) + file->setCreateFlags(S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); break; case compatIFSHall: - file->setCreateFlags(S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); // bit excessive + if (mode != IFOread) + file->setCreateFlags(S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); // bit excessive file->setShareMode(IFSHfull); break; } diff --git a/helm/examples/efs/delete-role.sh b/helm/examples/efs/delete-role.sh index a8d1acfb21b..7f37dacb98d 100755 --- a/helm/examples/efs/delete-role.sh +++ b/helm/examples/efs/delete-role.sh @@ -3,6 +3,7 @@ WORK_DIR=$(dirname $0) source ${WORK_DIR}/efs-env -aws iam detach-role-policy --role-name ${EKS_NAME}_EFS_CSI_Role \ - --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AmazonEKS_EFS_CSI_Driver_Policy -aws iam delete-role --role-name ${EKS_NAME}_EFS_CSI_Role +echo "deleting iam role" +echo "make sure you also uninstall the aws-efs-csi-driver helm chart" +STACK_NAME=eksctl-${EKS_NAME}-addon-iamserviceaccount-kube-system-efs-csi-controller-sa +aws cloudformation delete-stack --stack-name ${STACK_NAME} \ No newline at end of file diff --git a/helm/examples/efs/iam-policy-example.json b/helm/examples/efs/iam-policy-example.json index 22f4c326e5c..a8f6a4f7048 100644 --- a/helm/examples/efs/iam-policy-example.json +++ b/helm/examples/efs/iam-policy-example.json @@ -23,6 +23,18 @@ } } }, + { + "Effect": "Allow", + "Action": [ + "elasticfilesystem:TagResource" + ], + "Resource": "*", + "Condition": { + "StringLike": { + "aws:ResourceTag/efs.csi.aws.com/cluster": "true" + } + } + }, { "Effect": "Allow", "Action": "elasticfilesystem:DeleteAccessPoint", diff --git a/helm/examples/efs/install-csi-driver.sh b/helm/examples/efs/install-csi-driver.sh index ed3266e0884..17b76fc7800 100755 --- a/helm/examples/efs/install-csi-driver.sh +++ b/helm/examples/efs/install-csi-driver.sh @@ -1,4 +1,5 @@ #!/bin/bash +#reference: https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html WORK_DIR=$(dirname $0) @@ -6,58 +7,36 @@ source ${WORK_DIR}/efs-env echo "AWS_PROFILE: $AWS_PROFILE" roleName=${EKS_NAME}_EFS_CSI_Role +EFS_CSI_POLICY_NAME=EKS_EFS_CSI_Driver_Policy create_efs_csi_driver_policy() { - echo "create efs csi driver policy" - #aws iam list-policies | grep -q AmazonEKS_EFS_CSI_Driver_Policy # [Errno 32] Broken pipe on WSL - aws iam list-policies | awk '/AmazonEKS_EFS_CSI_Driver_Policy/{print $2}' | grep -q EFS + echo "creating efs csi driver policy" + #aws iam list-policies | grep -q $EFS_CSI_POLICY_NAME # [Errno 32] Broken pipe on WSL + aws iam list-policies | awk "/${EFS_CSI_POLICY_NAME}/{print $2}" | grep -q EFS [ $? -ne 0 ] && \ aws iam create-policy \ - --policy-name AmazonEKS_EFS_CSI_Driver_Policy \ + --policy-name ${EFS_CSI_POLICY_NAME} \ --policy-document file://${WORK_DIR}/iam-policy-example.json } -create_iam_role() +create_iam_role_and_kubernetes_service_account() { - echo "create efs csi driver iam role" - # Delete role - ${WORK_DIR}/delete-role.sh > /dev/null 2>&1 - - #aws iam list-roles | grep -q AmazonEKS_EFS_CSI_DriverRole - aws iam list-roles | awk '/${roleName}/{print $2}' | grep -q EFS - if [ $? -ne 0 ] - then - OIDC_URL=$(aws eks describe-cluster --name ${EKS_NAME} --region ${EFS_REGION} --query "cluster.identity.oidc.issuer" --output text) - OIDC_PROVIDER=${OIDC_URL##*/} - sed "s//${ACCOUNT_ID}/g; \ - s//${EFS_REGION}/g; \ - s//${OIDC_PROVIDER}/g" ${WORK_DIR}/trust-policy.json.template > ${WORK_DIR}/trust-policy.json - echo "aws iam create-role \ - --role-name ${roleName} \ - --assume-role-policy-document file://${WORK_DIR}/trust-policy.json" - aws iam create-role \ - --role-name ${roleName} \ - --assume-role-policy-document file://"${WORK_DIR}/trust-policy.json" - aws iam attach-role-policy \ - --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AmazonEKS_EFS_CSI_Driver_Policy \ - --role-name ${roleName} - #rm -rf ${WORK_DIR}/trust-policy.json - fi -} - -create_efs_service_account() -{ - echo "create efs service account" - sed "s//${ACCOUNT_ID}/g; \ - s//${roleName}/g" ${WORK_DIR}/efs-service-account.yaml.template > ${WORK_DIR}/efs-service-account.yaml - kubectl apply -f ${WORK_DIR}/efs-service-account.yaml - #rm -rf ${WORK_DIR}/efs-service-account.yaml + echo "creating iam role and kubernetes service account" + eksctl utils associate-iam-oidc-provider --region=${EFS_REGION} --cluster=${EKS_NAME} --approve + eksctl create iamserviceaccount \ + --cluster ${EKS_NAME} \ + --namespace kube-system \ + --name efs-csi-controller-sa \ + --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${EFS_CSI_POLICY_NAME} \ + --approve \ + --override-existing-serviceaccounts \ + --region ${EFS_REGION} } install_amazon_efs_driver() { - echo "install then amazon efs driver" + echo "installing the amazon efs driver helm chart" helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/ helm repo update helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \ @@ -70,7 +49,7 @@ install_amazon_efs_driver() create_storage_class_yaml() { echo "" - echo "create storageclass.yaml from storageclass.yaml.template" + echo "creating storageclass.yaml from storageclass.yaml.template" #echo "EFS_ID: ${EFS_ID} EFS_BASE_PATH: $EFS_BASE_PATH" sed "s//${EFS_ID}/g; \ s//\\${EFS_BASE_PATH}/g" ${WORK_DIR}/storageclass.yaml.template > ${WORK_DIR}/storageclass.yaml @@ -80,8 +59,7 @@ helm list | grep -q ${EFS_NAME} if [[ $? -ne 0 ]] then create_efs_csi_driver_policy - create_iam_role - create_efs_service_account + create_iam_role_and_kubernetes_service_account ${WORK_DIR}/associate-oidc.sh install_amazon_efs_driver create_storage_class_yaml diff --git a/helm/hpcc/docs/expert.md b/helm/hpcc/docs/expert.md index 7c133e47baa..42160e12483 100644 --- a/helm/hpcc/docs/expert.md +++ b/helm/hpcc/docs/expert.md @@ -43,3 +43,9 @@ This may be useful in some scenarios if the connections would otherwise be close An example of this is that Azure instances will close sockets that have been idle for greater than 4 minutes that are connected outside of its networks. +## saveQueryDlls (boolean) + +This is a Thor only setting. Default: false +If false, query dlls are loaded directly from the default 'dll' plane by both the Thor manager and Thor workers. +If true, query dlls will be saved and cached in local temporary storage and serialized to the workers. +Saving and serializing the query dlls may speed up queries if the 'dll' plane is backed by slow storage (e.g. blob storage). \ No newline at end of file diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 639e3a6d589..eb518b77c09 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -522,11 +522,13 @@ Pass in dict with sinks {{- if hasKey . "sinks" }} {{ range $sink := .sinks -}} {{- if eq (get $sink "type") "prometheus" }} - {{- if and (hasKey $sink "settings") ( hasKey $sink.settings "autodiscovery") }} - {{- if (eq $sink.settings.autodiscovery true ) }} + {{- if hasKey $sink "settings" }} + {{- if hasKey $sink.settings "autodiscovery" }} + {{- if (eq $sink.settings.autodiscovery true ) }} prometheus.io/scrape: 'true' prometheus.io/path: {{ $sink.settings.path | default "/metrics" }} prometheus.io/port: {{ $sink.settings.port | default 8767 | quote }} + {{ end }} {{ end }} {{ end }} {{ end }} @@ -780,7 +782,7 @@ Specifically for now (but could be extended), this container generates sysctl co {{- $cmd = (printf "%ssysctl -w %s" $cmd $sysctl) -}} {{- end -}} - name: config-container - {{- include "hpcc.addImageAttrs" . | nindent 2 }} + image: {{ $root.Values.global.busybox | default "busybox:stable" }} securityContext: privileged: true readOnlyRootFilesystem: false @@ -802,7 +804,7 @@ A kludge to ensure until the mount of a PVC appears (this can happen with some t command: ["/bin/sh"] args: - "-c" - - {{ printf "until test -d %s; do sleep 5; done" .volumePath }} + - {{ printf "until mountpoint -q %s; do sleep 5; done" .volumePath }} volumeMounts: - name: {{ .volumeName | quote}} mountPath: {{ .volumePath | quote }} @@ -1134,11 +1136,19 @@ Add resource object Pass in a dictionary with me defined */}} {{- define "hpcc.addResources" }} -{{- if .me }} +{{- if .me }} + {{- $limits := omit .me "cpu" }} + {{- $requests := pick .me "cpu" }} resources: + {{- if $limits }} limits: -{{ toYaml .me | indent 4 }} -{{- end }} + {{- toYaml $limits | nindent 4 }} + {{- end -}} + {{- if $requests }} + requests: + {{- toYaml $requests | nindent 4 -}} + {{- end -}} +{{- end -}} {{- end -}} {{/* @@ -1154,8 +1164,9 @@ Pass in dict with root, me and instances defined {{- $totalBytes := mul .instances $bytes }} resources: limits: - cpu: {{ printf "%dm" (mul .instances $milliCPUs) | quote }} memory: {{ include "hpcc.bytesToK8sMemoryString" $totalBytes | quote }} + requests: + cpu: {{ printf "%dm" (mul .instances $milliCPUs) | quote }} {{- end -}} {{/* @@ -1361,9 +1372,11 @@ Pass in dict with sinks {{- define "hpcc.generateMetricsReporterLabel" }} {{ range $sink := .sinks -}} {{- if eq (get $sink "type") "prometheus" }} - {{- if and (hasKey $sink "settings") ( hasKey $sink.settings "autodiscovery") }} - {{- if (eq $sink.settings.autodiscovery true ) }} + {{- if hasKey $sink "settings" }} + {{- if hasKey $sink.settings "autodiscovery" }} + {{- if (eq $sink.settings.autodiscovery true ) }} prometheusMetricsReporter: "yes" + {{ end }} {{ end }} {{ end }} {{ end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index 1d915719861..245e7554577 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -85,10 +85,8 @@ data: {{- include "hpcc.addResources" (dict "me" .me.resources) | indent 12 }} {{- $appCmd := printf "%s %s %s _HPCC_ARGS_" $apptype (include "hpcc.configArg" .me) (include "hpcc.daliArg" (dict "root" .root "component" "ECL Agent" "optional" false )) }} {{ include "hpcc.addCommandAndLifecycle" (. | merge (dict "command" $appCmd)) | indent 12 }} -{{- if .env }} env: {{ include "hpcc.mergeEnvironments" .env | indent 12 }} -{{- end }} workingDir: /var/lib/HPCCSystems volumeMounts: {{ include "hpcc.addConfigMapVolumeMount" .me | indent 12 }} diff --git a/helm/hpcc/templates/network.yaml b/helm/hpcc/templates/network.yaml index 3a62cc7ef6c..80d31b1617b 100644 --- a/helm/hpcc/templates/network.yaml +++ b/helm/hpcc/templates/network.yaml @@ -164,8 +164,9 @@ spec: {{- if hasKey $metrics "sinks" }} {{ range $sink := $metrics.sinks -}} {{- if eq (get $sink "type") "prometheus" }} - {{- if and (hasKey $sink "settings") (hasKey $sink.settings "autodiscovery") }} - {{- if (eq $sink.settings.autodiscovery true ) }} + {{- if hasKey $sink "settings" }} + {{- if hasKey $sink.settings "autodiscovery" }} + {{- if (eq $sink.settings.autodiscovery true ) }} apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: @@ -177,6 +178,7 @@ spec: ingress: - ports: - port: {{ $sink.settings.port | default 8767 }} + {{ end }} {{ end }} {{ end }} {{ end }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index 8a31e628466..4c1f128b5b1 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -315,15 +315,17 @@ spec: {{ include "hpcc.addCertificate" (dict "root" $ "name" $servername "services" $roxie.services "component" "roxie-server" "external" false) }} {{ include "hpcc.addCertificate" (dict "root" $ "name" $servername "services" $roxie.services "component" "roxie-server" "external" true) }} --- - {{ end -}} + +{{- $agentPublicCertName := printf "%s-agent" $roxie.name }} +{{ include "hpcc.addCertificate" (dict "root" $ "name" $agentPublicCertName "services" $roxie.services "component" "roxie-agent" "external" true) }} + {{ range $c, $e := until ($commonCtx.numChannels|int) -}} {{- $channel := add $c 1 -}} {{- $name := printf "%s-agent-%d" $roxie.name $channel }} {{- $_ := set $commonCtx "instanceNames" (append $commonCtx.instanceNames $name) }} {{ include "hpcc.addCertificate" (dict "root" $ "name" $name "services" $roxie.services "component" "roxie-agent" "external" false) }} -{{ include "hpcc.addCertificate" (dict "root" $ "name" $name "services" $roxie.services "component" "roxie-agent" "external" true) }} --- apiVersion: apps/v1 kind: Deployment @@ -407,8 +409,9 @@ spec: {{ include "hpcc.addVolumeMounts" $commonCtx | indent 8 }} {{ include "hpcc.addSecretVolumeMounts" $commonCtx | indent 8 }} {{- if not $roxie.serverReplicas }} + {{ include "hpcc.addCertificateVolumeMount" (dict "root" $ "component" "roxie-agent" "name" $name "external" false) | indent 8 }} -{{ include "hpcc.addCertificateVolumeMount" (dict "root" $ "component" "roxie-agent" "name" $name "certificate" $roxie.certificate "external" true) | indent 8 }} +{{ include "hpcc.addCertificateVolumeMount" (dict "root" $ "component" "roxie-agent" "name" $agentPublicCertName "certificate" $roxie.certificate "external" true) | indent 8 }} {{ include "hpcc.addUDPCertificateVolumeMount" (dict "root" $ "component" "udpkey" "name" $udpkeyname ) | indent 8 }} {{- end }} @@ -418,7 +421,7 @@ spec: {{ include "hpcc.addSecretVolumes" $commonCtx | indent 6 }} {{- if not $roxie.serverReplicas }} {{ include "hpcc.addCertificateVolume" (dict "root" $ "component" "roxie-agent" "name" $name "external" false) | indent 6 }} -{{ include "hpcc.addCertificateVolume" (dict "root" $ "component" "roxie-agent" "name" $name "certificate" $roxie.certificate "external" true) | indent 6 }} +{{ include "hpcc.addCertificateVolume" (dict "root" $ "component" "roxie-agent" "name" $agentPublicCertName "certificate" $roxie.certificate "external" true) | indent 6 }} {{ include "hpcc.addUDPCertificateVolume" (dict "root" $ "component" "udpkey" "name" $udpkeyname) | indent 6 }} {{- end }} --- diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index 009eca0fb58..5eafff196c0 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -110,10 +110,8 @@ data: {{- include "hpcc.addResources" (dict "me" .eclAgentResources) | indent 12 }} {{- $agentCmd := printf "%s %s %s _HPCC_ARGS_" $eclAgentType (include "hpcc.configArg" .me) (include "hpcc.daliArg" (dict "root" .root "component" "Thor" "optional" false)) }} {{ include "hpcc.addCommandAndLifecycle" (. | merge (dict "command" $agentCmd)) | indent 12 }} -{{- if .env }} env: {{ include "hpcc.mergeEnvironments" .env | indent 12 }} -{{- end }} workingDir: /var/lib/HPCCSystems volumeMounts: {{ include "hpcc.addConfigMapVolumeMount" .me | indent 12 }} @@ -179,10 +177,8 @@ data: {{- include "hpcc.addResources" (dict "me" $thorScope.managerResources) | indent 12 }} {{- $thorManagerCmd := printf "thormaster_lcr %s %s _HPCC_ARGS_" (include "hpcc.configArg" .me) (include "hpcc.daliArg" (dict "root" .root "component" "Thor" "optional" false)) }} {{ include "hpcc.addCommandAndLifecycle" (. | merge (dict "command" $thorManagerCmd)) | indent 12 }} -{{- if .env }} env: {{ include "hpcc.mergeEnvironments" .env | indent 12 }} -{{- end }} workingDir: /var/lib/HPCCSystems volumeMounts: {{ include "hpcc.addConfigMapVolumeMount" .me | indent 12 }} @@ -250,10 +246,8 @@ data: {{- include "hpcc.addResources" (dict "me" $thorScope.workerResources) | indent 12 }} {{- $thorWorkerCmd := printf "thorslave_lcr %s %s _HPCC_ARGS_ --slaveport=%d" (include "hpcc.configArg" $configCtx.me) (include "hpcc.daliArg" (dict "root" $configCtx.root "component" "Thor" "optional" false)) $slavePort }} {{ include "hpcc.addCommandAndLifecycle" ($configCtx | merge (dict "command" $thorWorkerCmd)) | indent 12 }} -{{- if $configCtx.me.env }} env: {{ include "hpcc.mergeEnvironments" $configCtx.me.env | indent 12 }} -{{- end }} workingDir: /var/lib/HPCCSystems volumeMounts: {{ include "hpcc.addConfigMapVolumeMount" $configCtx.me | indent 12 }} diff --git a/helm/hpcc/values.schema.json b/helm/hpcc/values.schema.json index 0a80a4d024f..2adbdf97538 100644 --- a/helm/hpcc/values.schema.json +++ b/helm/hpcc/values.schema.json @@ -544,6 +544,11 @@ "waitForMount": { "type": "boolean" }, + "blockedFileIOKB": { + "description": "Optimal block size for efficient reading from this plane. Implementations will use if they can", + "type": "integer", + "default": 0 + }, "components": {}, "prefix": {}, "subPath": {}, @@ -2317,7 +2322,8 @@ }, "multiJobLinger": { "type": "boolean", - "description": "[Optional] If lingerPeriod set, allows Thor to process more graphs from any job" + "description": "[Optional] If lingerPeriod set, allows Thor to process more graphs from any job", + "default": true }, "maxGraphStartupTime": { "type": "integer", diff --git a/roxie/ccd/ccd.hpp b/roxie/ccd/ccd.hpp index e61c75047e6..0b0c8bc9349 100644 --- a/roxie/ccd/ccd.hpp +++ b/roxie/ccd/ccd.hpp @@ -778,6 +778,10 @@ class ContextLogger : implements IRoxieContextLogger, public CInterface { return logTrace.queryCallerIdHTTPHeaderName(); } + virtual const CRuntimeStatisticCollection & queryStats() const override + { + return stats; + } }; class StringContextLogger : public ContextLogger diff --git a/roxie/ccd/ccdcontext.cpp b/roxie/ccd/ccdcontext.cpp index 86e46d11fa2..c52a0546538 100644 --- a/roxie/ccd/ccdcontext.cpp +++ b/roxie/ccd/ccdcontext.cpp @@ -1412,7 +1412,10 @@ class CRoxieContextBase : implements IRoxieAgentContext, implements ICodeContext { return logctx.queryCallerIdHttpHeaderName(); } - + virtual const CRuntimeStatisticCollection & queryStats() const override + { + return logctx.queryStats(); + } virtual void noteLibrary(IQueryFactory *library) { loadedLibraries.appendUniq(*LINK(library)); diff --git a/roxie/ccd/ccdmain.cpp b/roxie/ccd/ccdmain.cpp index b2d4cf66f36..015d5981bba 100644 --- a/roxie/ccd/ccdmain.cpp +++ b/roxie/ccd/ccdmain.cpp @@ -934,7 +934,7 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml) } acknowledgeAllRequests = topology->getPropBool("@acknowledgeAllRequests", acknowledgeAllRequests); - headRegionSize = topology->getPropInt("@headRegionSize", 50); + headRegionSize = topology->getPropInt("@headRegionSize", 0); ccdMulticastPort = topology->getPropInt("@multicastPort", CCD_MULTICAST_PORT); statsExpiryTime = topology->getPropInt("@statsExpiryTime", 3600); roxiemem::setMemTraceSizeLimit((memsize_t) topology->getPropInt64("@memTraceSizeLimit", 0)); diff --git a/roxie/ccd/ccdqueue.cpp b/roxie/ccd/ccdqueue.cpp index 31b98bc357e..fda869ba6c1 100644 --- a/roxie/ccd/ccdqueue.cpp +++ b/roxie/ccd/ccdqueue.cpp @@ -1684,7 +1684,8 @@ class CRoxieWorker : public CInterface, implements IPooledThread return; } - hash64_t queryHash = packet->queryHeader().queryHash; + CCycleTimer workerTimer; + hash64_t queryHash = header.queryHash; Owned queryFactory = getQueryFactory(queryHash, channel); if (!queryFactory && logctx.queryWuid()) { @@ -1697,20 +1698,22 @@ class CRoxieWorker : public CInterface, implements IPooledThread if (!queryFactory) { StringBuffer hdr; - IException *E = MakeStringException(MSGAUD_operator, ROXIE_UNKNOWN_QUERY, "Roxie agent received request for unregistered query: %s", packet->queryHeader().toString(hdr).str()); + IException *E = MakeStringException(MSGAUD_operator, ROXIE_UNKNOWN_QUERY, "Roxie agent received request for unregistered query: %s", header.toString(hdr).str()); EXCLOG(E, "doActivity"); throwRemoteException(E, activity, packet, false); return; } activitiesStarted++; - unsigned activityId = packet->queryHeader().activityId & ~ROXIE_PRIORITY_MASK; + unsigned activityId = header.activityId & ~ROXIE_PRIORITY_MASK; Owned factory = queryFactory->getAgentActivityFactory(activityId); assertex(factory); setActivity(factory->createActivity(logctx, packet)); if (!debugging) ROQ->sendIbyti(header, logctx, mySubChannel); Owned output = activity->process(); + stat_type elapsedNs = workerTimer.elapsedNs(); + logctx.setStatistic(StTimeAgentProcess, elapsedNs); if (doTrace(traceRoxiePackets)) { StringBuffer x; @@ -3052,6 +3055,45 @@ class RoxieAeronSocketQueueManager : public RoxieSocketQueueManager //================================================================================================== +void * CDummyMessagePacker::getBuffer(unsigned len, bool variable) +{ + if (variable) + { + char *ret = (char *) data.ensureCapacity(len + sizeof(RecordLengthType)); + return ret + sizeof(RecordLengthType); + } + else + { + return data.ensureCapacity(len); + } +} + +void CDummyMessagePacker::putBuffer(const void *buf, unsigned len, bool variable) +{ + if (variable) + { + buf = ((char *) buf) - sizeof(RecordLengthType); + *(RecordLengthType *) buf = len; + len += sizeof(RecordLengthType); + } + data.setWritePos(lastput + len); + lastput += len; +} + +void CDummyMessagePacker::flush() +{ +} + +void CDummyMessagePacker::sendMetaInfo(const void *buf, unsigned len) +{ + throwUnexpected(); +} + +unsigned CDummyMessagePacker::size() const +{ + return lastput; +} + interface ILocalMessageCollator : extends IMessageCollator { virtual void enqueueMessage(bool outOfBand, void *data, unsigned datalen, void *meta, unsigned metalen, void *header, unsigned headerlen) = 0; diff --git a/roxie/ccd/ccdqueue.ipp b/roxie/ccd/ccdqueue.ipp index 9c49453ecfe..a6254fbc4c7 100644 --- a/roxie/ccd/ccdqueue.ipp +++ b/roxie/ccd/ccdqueue.ipp @@ -48,34 +48,11 @@ public: lastput = 0; } - virtual void *getBuffer(unsigned len, bool variable) override - { - if (variable) - { - char *ret = (char *) data.ensureCapacity(len + sizeof(RecordLengthType)); - return ret + sizeof(RecordLengthType); - } - else - { - return data.ensureCapacity(len); - } - } - - virtual void putBuffer(const void *buf, unsigned len, bool variable) override - { - if (variable) - { - buf = ((char *) buf) - sizeof(RecordLengthType); - *(RecordLengthType *) buf = len; - len += sizeof(RecordLengthType); - } - data.setWritePos(lastput + len); - lastput += len; - } - - virtual void flush() override { } - virtual void sendMetaInfo(const void *buf, unsigned len) override { throwUnexpected(); } - virtual unsigned size() const override { return lastput; } + virtual void *getBuffer(unsigned len, bool variable) override; + virtual void putBuffer(const void *buf, unsigned len, bool variable) override; + virtual void flush() override; + virtual void sendMetaInfo(const void *buf, unsigned len) override; + virtual unsigned size() const override; }; interface IPacketDiscarder : public IInterface diff --git a/roxie/ccd/ccdserver.cpp b/roxie/ccd/ccdserver.cpp index aefd2d81334..2f9ca18458e 100644 --- a/roxie/ccd/ccdserver.cpp +++ b/roxie/ccd/ccdserver.cpp @@ -376,7 +376,10 @@ class IndirectAgentContext : implements IRoxieAgentContext, public CInterface { ctx->noteLibrary(library); } - + virtual const CRuntimeStatisticCollection & queryStats() const + { + return ctx->queryStats(); + } protected: IRoxieAgentContext * ctx; }; @@ -414,7 +417,7 @@ static const StatisticsMapping keyedJoinStatistics({ StNumServerCacheHits, StNum StCycleBlobFetchCycles, StCycleLeafFetchCycles, StCycleNodeFetchCycles, StTimeBlobFetch, StTimeLeafFetch, StTimeNodeFetch, StCycleIndexCacheBlockedCycles, StTimeIndexCacheBlocked, StNumNodeDiskFetches, StNumLeafDiskFetches, StNumBlobDiskFetches, - StNumDiskRejected, StSizeAgentReply, StTimeAgentWait, StTimeAgentQueue, StTimeIBYTIDelay }, joinStatistics); + StNumDiskRejected, StSizeAgentReply, StTimeAgentWait, StTimeAgentQueue, StTimeAgentProcess, StTimeIBYTIDelay }, joinStatistics); static const StatisticsMapping indexStatistics({StNumServerCacheHits, StNumIndexSeeks, StNumIndexScans, StNumIndexWildSeeks, StNumIndexSkips, StNumIndexNullSkips, StNumIndexMerges, StNumIndexMergeCompares, StNumPreFiltered, StNumPostFiltered, StNumIndexAccepted, StNumIndexRejected, @@ -425,9 +428,9 @@ static const StatisticsMapping indexStatistics({StNumServerCacheHits, StNumIndex StCycleBlobFetchCycles, StCycleLeafFetchCycles, StCycleNodeFetchCycles, StTimeBlobFetch, StTimeLeafFetch, StTimeNodeFetch, StCycleIndexCacheBlockedCycles, StTimeIndexCacheBlocked, StNumNodeDiskFetches, StNumLeafDiskFetches, StNumBlobDiskFetches, - StNumIndexRowsRead, StSizeAgentReply, StTimeAgentWait, StTimeAgentQueue, StTimeIBYTIDelay }, actStatistics); + StNumIndexRowsRead, StSizeAgentReply, StTimeAgentWait, StTimeAgentQueue, StTimeAgentProcess, StTimeIBYTIDelay }, actStatistics); static const StatisticsMapping diskStatistics({StNumServerCacheHits, StNumDiskRowsRead, StNumDiskSeeks, StNumDiskAccepted, - StNumDiskRejected, StSizeAgentReply, StTimeAgentWait, StTimeAgentQueue, StTimeIBYTIDelay }, actStatistics); + StNumDiskRejected, StSizeAgentReply, StTimeAgentWait, StTimeAgentQueue, StTimeAgentProcess, StTimeIBYTIDelay }, actStatistics); static const StatisticsMapping soapStatistics({ StTimeSoapcall }, actStatistics); static const StatisticsMapping groupStatistics({ StNumGroups, StNumGroupMax }, actStatistics); static const StatisticsMapping sortStatistics({ StTimeSortElapsed }, actStatistics); @@ -455,7 +458,7 @@ extern const StatisticsMapping accumulatedStatistics({StWhenFirstRow, StTimeLoca StNumGroups, StTimeSortElapsed, StNumDuplicateKeys, - StTimeAgentQueue, StTimeIBYTIDelay, + StTimeAgentQueue, StTimeAgentProcess, StTimeIBYTIDelay, StNumSocketWrites, StSizeSocketWrite, StTimeSocketWriteIO, StNumSocketReads, StSizeSocketRead, StTimeSocketReadIO, StCycleIndexCacheBlockedCycles, StTimeIndexCacheBlocked, @@ -1392,7 +1395,10 @@ class CRoxieServerActivity : implements CInterfaceOf, impl { return ctx ? ctx->queryCallerIdHttpHeaderName() : "HPCC-Caller-Id"; } - + virtual const CRuntimeStatisticCollection & queryStats() const override + { + return stats; + } virtual bool isPassThrough() { return false; @@ -4739,6 +4745,7 @@ class CRemoteResultAdaptor : implements IEngineRowStream, implements IFinalRoxie { activity.noteStatistic(StSizeAgentReply, mc->queryBytesReceived()); activity.noteStatistic(StTimeAgentWait, cycle_to_nanosec(unpackerWaitCycles)); + unpackerWaitCycles = 0; if (ctx) ctx->addAgentsReplyLen(mc->queryBytesReceived(), mc->queryDuplicates(), mc->queryResends()); } @@ -12034,7 +12041,7 @@ class CRoxieServerDiskWriteActivity : public CRoxieServerInternalSinkActivity, i blockcompressed = true; } if (blockcompressed) - io.setown(createCompressedFileWriter(writer->queryFile(), (diskmeta->isFixedSize() ? diskmeta->getFixedSize() : 0), extend, true, ecomp, COMPRESS_METHOD_LZW)); + io.setown(createCompressedFileWriter(writer->queryFile(), (diskmeta->isFixedSize() ? diskmeta->getFixedSize() : 0), extend, true, ecomp, COMPRESS_METHOD_LZ4)); else io.setown(writer->queryFile()->open(extend ? IFOwrite : IFOcreate)); if (!io) @@ -12432,6 +12439,8 @@ class CRoxieServerIndexWriteActivity : public CRoxieServerInternalSinkActivity, offset_t offsetBranches = 0; offset_t uncompressedSize = 0; offset_t originalBlobSize = 0; + offset_t branchMemorySize = 0; + offset_t leafMemorySize = 0; unsigned nodeSize = 0; void updateWorkUnitResult() @@ -12643,6 +12652,8 @@ class CRoxieServerIndexWriteActivity : public CRoxieServerInternalSinkActivity, numBlobNodes = builder->getNumBlobNodes(); offsetBranches = builder->getOffsetBranches(); originalBlobSize = bc.queryTotalSize(); + branchMemorySize = builder->getBranchMemorySize(); + leafMemorySize = builder->getLeafMemorySize(); noteStatistic(StNumLeafCacheAdds, numLeafNodes); noteStatistic(StNumNodeCacheAdds, numBranchNodes); @@ -12732,6 +12743,10 @@ class CRoxieServerIndexWriteActivity : public CRoxieServerInternalSinkActivity, properties.setPropInt64("@numBlobNodes", numBlobNodes); if (numBlobNodes) properties.setPropInt64("@originalBlobSize", originalBlobSize); + if (branchMemorySize) + properties.setPropInt64("@branchMemorySize", branchMemorySize); + if (leafMemorySize) + properties.setPropInt64("@leafMemorySize", leafMemorySize); size32_t keyedSize = helper.getKeyedSize(); if (keyedSize == (size32_t)-1) @@ -25852,7 +25867,7 @@ class KeyedJoinRemoteAdaptor : public CRemoteResultAdaptor // MORE - not sure it ActivityTimer t(activityStats, timeActivities); for (;;) { - if (eof) + if (unlikely(eof)) return NULL; processAgentResults(); if (ready.ordinality()) diff --git a/roxie/udplib/udptrr.cpp b/roxie/udplib/udptrr.cpp index a729839ef09..fa05ca1131d 100644 --- a/roxie/udplib/udptrr.cpp +++ b/roxie/udplib/udptrr.cpp @@ -1329,14 +1329,12 @@ class CReceiveManager : implements IReceiveManager, public CInterface unsigned lastPacketsOOO = 0; unsigned lastUnwantedDiscarded = 0; unsigned timeout = 5000; - DataBuffer *b = nullptr; + roxiemem::IDataBufferManager * udpBufferManager = bufferManager; + DataBuffer *b = udpBufferManager->allocate(); while (running) { try { - if (!b) - b = bufferManager->allocate(); - unsigned int res; while (true) { @@ -1374,7 +1372,7 @@ class CReceiveManager : implements IReceiveManager, public CInterface } } parent.input_queue->pushOwn(b); - b = nullptr; + b = udpBufferManager->allocate(); if (udpStatsReportInterval) { diff --git a/rtl/eclrtl/CMakeLists.txt b/rtl/eclrtl/CMakeLists.txt index df08e55fdc5..62ec77df900 100644 --- a/rtl/eclrtl/CMakeLists.txt +++ b/rtl/eclrtl/CMakeLists.txt @@ -79,10 +79,6 @@ include_directories ( ADD_DEFINITIONS( -D_USRDLL -DECLRTL_EXPORTS ) -if ((USE_BOOST_REGEX) AND (NOT WIN32)) - ADD_DEFINITIONS( -DBOOST_DYN_LINK ) -endif () - if ((CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0.0)) set_source_files_properties(eclrtl.cpp PROPERTIES COMPILE_FLAGS -fno-tree-vectorize) endif () @@ -92,8 +88,8 @@ HPCC_ADD_LIBRARY( eclrtl SHARED ${SRCS} ) if(CENTOS_6_BOOST) add_dependencies(eclrtl boost-regex) target_link_libraries( eclrtl boost-regex) -else() - target_link_libraries( eclrtl ${Boost_REGEX_LIBRARY} ) +elseif(USE_BOOST_REGEX) + target_link_libraries( eclrtl Boost::boost Boost::regex ) endif() target_link_libraries ( eclrtl diff --git a/system/jhtree/ctfile.hpp b/system/jhtree/ctfile.hpp index 701d053b4a9..2d29649baaa 100644 --- a/system/jhtree/ctfile.hpp +++ b/system/jhtree/ctfile.hpp @@ -512,6 +512,8 @@ interface IIndexCompressor : public IInterface { virtual const char *queryName() const = 0; virtual CWriteNode *createNode(offset_t _fpos, CKeyHdr *_keyHdr, bool isLeafNode) const = 0; + virtual offset_t queryBranchMemorySize() const = 0; + virtual offset_t queryLeafMemorySize() const = 0; }; diff --git a/system/jhtree/jhinplace.cpp b/system/jhtree/jhinplace.cpp index 5028fc014e4..f35a89a87db 100644 --- a/system/jhtree/jhinplace.cpp +++ b/system/jhtree/jhinplace.cpp @@ -2129,6 +2129,7 @@ void CInplaceBranchWriteNode::write(IFileIOStream *out, CRC32 *crc) assertex(inplaceSize == writtenSize); ctx.totalDataSize += data.length(); + ctx.branchMemorySize += data.length(); assertex(data.length() == getDataSize()); } @@ -2327,6 +2328,7 @@ bool CInplaceLeafWriteNode::add(offset_t pos, const void * _data, size32_t size, saveLastKey(data, size, sequence); hdr.numKeys++; + totalUncompressedSize += size; return true; } @@ -2480,12 +2482,18 @@ void CInplaceLeafWriteNode::write(IFileIOStream *out, CRC32 *crc) serializePacked(data, trailingSize); data.append(trailingSize, uncompressed.bytes() + firstUncompressed); } + if (payloadCompression != COMPRESS_METHOD_RANDROW) + { + //Calculate the size of the payload when expanded, currently the compressed payload is kept in memory, so do not subtract that + ctx.leafMemorySize += (totalUncompressedSize - (keyCompareLen * hdr.numKeys)); + } break; } } } ctx.totalDataSize += data.length(); + ctx.leafMemorySize += data.length(); assertex(data.length() == getDataSize(true)); } diff --git a/system/jhtree/jhinplace.hpp b/system/jhtree/jhinplace.hpp index 6f95918629d..7082ed48aa8 100644 --- a/system/jhtree/jhinplace.hpp +++ b/system/jhtree/jhinplace.hpp @@ -171,6 +171,8 @@ class jhtree_decl InplaceKeyBuildContext offset_t totalDataSize = 0; offset_t numLeafNodes = 0; offset_t numBlockCompresses = 0; + offset_t branchMemorySize = 0; + offset_t leafMemorySize = 0; struct { double minCompressionThreshold = 0.95; // use uncompressed if compressed is > 95% uncompressed unsigned maxCompressionFactor = 25; // Don't compress payload to less than 4% of the original by default (beause when it is read it will use lots of memory) @@ -296,6 +298,7 @@ class jhtree_decl CInplaceLeafWriteNode : public CInplaceWriteNode size32_t keyLen = 0; size32_t firstUncompressed = 0; size32_t sizeCompressedPayload = 0; // Set from closed compressor + offset_t totalUncompressedSize = 0; bool isVariable = false; bool rowCompression = false; bool useCompressedPayload = false; @@ -317,6 +320,15 @@ class InplaceIndexCompressor : public CInterfaceOf return new CInplaceBranchWriteNode(_fpos, _keyHdr, ctx); } + virtual offset_t queryBranchMemorySize() const override + { + return ctx.branchMemorySize; + } + virtual offset_t queryLeafMemorySize() const override + { + return ctx.leafMemorySize; + } + protected: StringAttr compressionName; mutable InplaceKeyBuildContext ctx; diff --git a/system/jhtree/jhtree.cpp b/system/jhtree/jhtree.cpp index 79ce977dd51..085ef184497 100644 --- a/system/jhtree/jhtree.cpp +++ b/system/jhtree/jhtree.cpp @@ -1271,7 +1271,7 @@ CJHTreeNode *CKeyIndex::_loadNode(char *nodeData, offset_t pos, bool needsCopy) bool CKeyIndex::isTopLevelKey() const { - return (keyHdr->getKeyType() & HTREE_TOPLEVEL_KEY) != 0; + return isTLK(); } bool CKeyIndex::isFullySorted() @@ -1283,6 +1283,7 @@ __uint64 CKeyIndex::getPartitionFieldMask() { return keyHdr->getPartitionFieldMask(); } + unsigned CKeyIndex::numPartitions() { return keyHdr->numPartitions(); @@ -1297,9 +1298,8 @@ IKeyCursor *CKeyIndex::getCursor(const IIndexFilterList *filter, bool logExcessi const CJHSearchNode *CKeyIndex::getNode(offset_t offset, NodeType type, IContextLogger *ctx) const { latestGetNodeOffset = offset; - const CJHTreeNode *node = cache->getNode(this, iD, offset, type, ctx, isTopLevelKey()); - assertex(!node || type == node->getNodeType()); - return (const CJHSearchNode *) node; + //Call isTLK() rather than isTopLevelKey() so the test is inlined (rather than a virtual) + return (CJHSearchNode *)cache->getNode(this, iD, offset, type, ctx, isTLK()); } void CKeyIndex::dumpNode(FILE *out, offset_t pos, unsigned count, bool isRaw) @@ -2611,18 +2611,20 @@ const CJHTreeNode *CNodeCache::getNode(const INodeLoader *keyIndex, unsigned iD, // Lock, add if missing, unlock. Lock a page-dependent-cr load() release lock. //There will be the same number of critical section locks, but loading a page will contend on a different lock - so it should reduce contention. CKeyIdAndPos key(iD, pos); + CNodeMRUCache & curCache = cache[cacheType]; CriticalSection & cacheLock = lock[cacheType]; Owned ownedCacheEntry; // ensure node gets cleaned up if it fails to load bool alreadyExists = true; { CNodeCacheEntry * cacheEntry; + unsigned hashcode = curCache.getKeyHash(key); CriticalBlock block(cacheLock); - cacheEntry = cache[cacheType].query(key); + cacheEntry = curCache.query(hashcode, &key); if (unlikely(!cacheEntry)) { cacheEntry = new CNodeCacheEntry; - cache[cacheType].replace(key, *cacheEntry); + curCache.replace(key, *cacheEntry); alreadyExists = false; } @@ -2668,9 +2670,10 @@ const CJHTreeNode *CNodeCache::getNode(const INodeLoader *keyIndex, unsigned iD, if (!ownedCacheEntry->isReady()) { const CJHTreeNode *node = keyIndex->loadNode(&fetchCycles, pos); + assertex(type == node->getNodeType()); //Update the associated size of the entry in the hash table before setting isReady (never evicted until isReady is set) - cache[cacheType].noteReady(*node); + curCache.noteReady(*node); ownedCacheEntry->noteReady(node); } else @@ -2730,7 +2733,7 @@ const CJHTreeNode *CNodeCache::getNode(const INodeLoader *keyIndex, unsigned iD, { CriticalBlock block(cacheLock); if (!ownedCacheEntry->isReady()) - cache[cacheType].remove(key); + curCache.remove(key); } throw; } diff --git a/system/jhtree/jhtree.ipp b/system/jhtree/jhtree.ipp index 0a0ca4e5773..83cf744fd0a 100644 --- a/system/jhtree/jhtree.ipp +++ b/system/jhtree/jhtree.ipp @@ -114,6 +114,8 @@ protected: void init(KeyHdr &hdr, bool isTLK); void loadBloomFilters(); const CJHSearchNode *getRootNode() const; + + inline bool isTLK() const { return (keyHdr->getKeyType() & HTREE_TOPLEVEL_KEY) != 0; } public: IMPLEMENT_IINTERFACE; @@ -125,7 +127,7 @@ public: virtual size32_t keySize(); virtual bool hasPayload(); virtual size32_t keyedSize(); - virtual bool isTopLevelKey() const override; + virtual bool isTopLevelKey() const override final; virtual bool isFullySorted() override; virtual __uint64 getPartitionFieldMask() override; virtual unsigned numPartitions() override; diff --git a/system/jhtree/jhutil.hpp b/system/jhtree/jhutil.hpp index 2062b741915..08b0adaa1ff 100644 --- a/system/jhtree/jhutil.hpp +++ b/system/jhtree/jhutil.hpp @@ -63,6 +63,10 @@ class CMRUCacheOf : public CInterface//, public IInterface table.replace(*mapping); mruList.enqueueHead(mapping); } + unsigned getKeyHash(KEY & key) const + { + return table.getHashFromFindParam(&key); + } ENTRY *query(KEY key, bool doPromote=true) { MAPPING *mapping = table.find(key); @@ -72,6 +76,15 @@ class CMRUCacheOf : public CInterface//, public IInterface promote(mapping); return &mapping->query(); // MAPPING must impl. query() } + ENTRY *query(unsigned hashcode, KEY * key, bool doPromote=true) + { + MAPPING *mapping = table.find(hashcode, *key); + if (!mapping) return NULL; + + if (doPromote) + promote(mapping); + return &mapping->query(); // MAPPING must impl. query() + } ENTRY *get(KEY key, bool doPromote=true) { return LINK(query(key, doPromote)); @@ -96,11 +109,7 @@ class CMRUCacheOf : public CInterface//, public IInterface void kill() { clear(-1); } void promote(MAPPING *mapping) { - if (mruList.head() != mapping) - { - mruList.dequeue(mapping); // will still be linked in table - mruList.enqueueHead(mapping); - } + mruList.moveToHead(mapping); } CMRUIterator *getIterator() { diff --git a/system/jhtree/keybuild.cpp b/system/jhtree/keybuild.cpp index e894a24771a..acdb0f0aee2 100644 --- a/system/jhtree/keybuild.cpp +++ b/system/jhtree/keybuild.cpp @@ -85,6 +85,14 @@ class PocIndexCompressor : public CInterfaceOf else return new CLegacyWriteNode(_fpos, _keyHdr, isLeafNode); } + virtual offset_t queryBranchMemorySize() const override + { + return 0; + } + virtual offset_t queryLeafMemorySize() const override + { + return 0; + } }; class LegacyIndexCompressor : public CInterfaceOf @@ -94,6 +102,14 @@ class LegacyIndexCompressor : public CInterfaceOf { return new CLegacyWriteNode(_fpos, _keyHdr, isLeafNode); } + virtual offset_t queryBranchMemorySize() const override + { + return 0; // same as default calculation + } + virtual offset_t queryLeafMemorySize() const override + { + return 0; // MORE: Update for in-place row compression + } }; class CKeyBuilder : public CInterfaceOf @@ -601,6 +617,8 @@ class CKeyBuilder : public CInterfaceOf virtual unsigned __int64 getNumBranchNodes() const override { return numBranches; } virtual unsigned __int64 getNumBlobNodes() const override { return numBlobs; } virtual unsigned __int64 getOffsetBranches() const override { return offsetBranches; } + virtual unsigned __int64 getBranchMemorySize() const override { return indexCompressor->queryBranchMemorySize(); } + virtual unsigned __int64 getLeafMemorySize() const override { return indexCompressor->queryLeafMemorySize(); } protected: void writeMetadata(char const * data, size32_t size) diff --git a/system/jhtree/keybuild.hpp b/system/jhtree/keybuild.hpp index 727f27b2ad7..d5d8c22a389 100644 --- a/system/jhtree/keybuild.hpp +++ b/system/jhtree/keybuild.hpp @@ -104,6 +104,8 @@ interface IKeyBuilder : public IInterface virtual unsigned __int64 getNumBranchNodes() const = 0; virtual unsigned __int64 getNumBlobNodes() const = 0; virtual unsigned __int64 getOffsetBranches() const = 0; + virtual unsigned __int64 getBranchMemorySize() const = 0; + virtual unsigned __int64 getLeafMemorySize() const = 0; }; extern jhtree_decl IKeyBuilder *createKeyBuilder(IFileIOStream *_out, unsigned flags, unsigned rawSize, unsigned nodeSize, unsigned keyFieldSize, unsigned __int64 startSequence, IHThorIndexWriteArg *helper, const char * defaultCompression, bool enforceOrder, bool isTLK); diff --git a/system/jlib/jfcmp.hpp b/system/jlib/jfcmp.hpp index 3e5b96ce618..f3d407452f3 100644 --- a/system/jlib/jfcmp.hpp +++ b/system/jlib/jfcmp.hpp @@ -156,7 +156,10 @@ class jlib_decl CFcmpCompressor : public CSimpleInterfaceOf { if (trailing) return written; - flushcommitted(); + + if (inlen == inmax) + flushcommitted(); + if (lenb+inlen>inmax) { if (outBufMb) // sizing input buffer, but outBufMb!=NULL is condition of whether in use or not @@ -211,7 +214,7 @@ class jlib_decl CFcmpCompressor : public CSimpleInterfaceOf }; -class jlib_decl CFcmpExpander : public CSimpleInterfaceOf +class jlib_decl CFcmpExpander : public CExpanderBase { protected: byte *outbuf; @@ -241,50 +244,6 @@ class jlib_decl CFcmpExpander : public CSimpleInterfaceOf return outlen; } - virtual void expand(void *buf) - { - if (!outlen) - return; - if (buf) - { - if (bufalloc) - free(outbuf); - bufalloc = 0; - outbuf = (unsigned char *)buf; - } - else if (outlen>bufalloc) - { - if (bufalloc) - free(outbuf); - bufalloc = outlen; - outbuf = (unsigned char *)malloc(bufalloc); - if (!outbuf) - throw MakeStringException(MSGAUD_operator,0, "Out of memory in FcmpExpander::expand, requesting %d bytes", bufalloc); - } - size32_t done = 0; - for (;;) - { - const size32_t szchunk = *in; - in++; - if (szchunk+doneoutlen)) - throw MakeStringException(0, "FcmpExpander - corrupt data(1) %d %d",written,szchunk); - } - else - { - if (szchunk+done!=outlen) - throw MakeStringException(0, "FcmpExpander - corrupt data(2) %d %d",szchunk,outlen); - memcpy((byte *)buf+done,in,szchunk); - break; - } - in = (const size32_t *)(((const byte *)in)+szchunk); - } - } - virtual void *bufptr() { return outbuf;} virtual size32_t buflen() { return outlen;} }; diff --git a/system/jlib/jfile.cpp b/system/jlib/jfile.cpp index 99c97c486f2..694aec0f4fb 100644 --- a/system/jlib/jfile.cpp +++ b/system/jlib/jfile.cpp @@ -7632,6 +7632,16 @@ IPropertyTree * getRemoteStorage(const char * name) return global->getPropTree(xpath); } +IPropertyTreeIterator * getPlanesIterator(const char * category, const char *name) +{ + StringBuffer xpath("storage/planes"); + if (!isEmptyString(category)) + xpath.appendf("[@category='%s']", category); + if (!isEmptyString(name)) + xpath.appendf("[@name='%s']", name); + return getGlobalConfigSP()->getElements(xpath); +} + IAPICopyClient * createApiCopyClient(IStorageApiInfo * source, IStorageApiInfo * target) { ReadLockBlock block(containedFileHookLock); @@ -7643,3 +7653,101 @@ IAPICopyClient * createApiCopyClient(IStorageApiInfo * source, IStorageApiInfo * } return nullptr; } + + +// NB: This implementation is not thread-safe. +// Therefore it should only be used by use cases that are single threaded +class CBlockedFileIO : public CSimpleInterfaceOf +{ + Owned io; + size32_t blockSize = 0; + size32_t readLen = 0; + void *buffer = nullptr; + offset_t lastReadPos = (offset_t)-1; + MemoryBuffer mb; +public: + CBlockedFileIO(IFileIO *_io, size32_t _blockSize) : io(_io), blockSize(_blockSize) + { + buffer = mb.reserveTruncate(blockSize); + } + virtual size32_t read(offset_t pos, size32_t len, void *data) override + { + if (len > blockSize) + return io->read(pos, len, data); + size32_t totalCopied = 0; + byte *dest = (byte *) data; + while (len) + { + offset_t readPos = (pos / blockSize) * blockSize; // NB: could be beyond end of file + if (readPos != lastReadPos) + { + readLen = io->read(readPos, blockSize, buffer); // NB: can be less than blockSize (and 0 if beyodn end of file) + lastReadPos = readPos; + } + size32_t endPos = readPos+readLen; + size32_t copyNow; + if (pos+len <= endPos) // common case hopefully + copyNow = len; + else if (pos < endPos) + copyNow = endPos-pos; + else // nothing to copy + break; + memcpy(dest, ((byte *)buffer) + pos-readPos, copyNow); + len -= copyNow; + pos += copyNow; + dest += copyNow; + totalCopied += copyNow; + } + return totalCopied; + } + virtual offset_t size() override { return io->size(); } + virtual size32_t write(offset_t pos, size32_t len, const void * data) override { throwUnexpected(); } + virtual offset_t appendFile(IFile *file, offset_t pos=0, offset_t len=(offset_t)-1) override { throwUnexpected(); } + virtual void setSize(offset_t size) override { throwUnexpected(); } + virtual void flush() override { throwUnexpected(); } + virtual void close() override { io->close(); } + virtual unsigned __int64 getStatistic(StatisticKind kind) override { return io->getStatistic(kind); } +}; + +extern IFileIO *createBlockedIO(IFileIO *base, size32_t blockSize) +{ + return new CBlockedFileIO(base, blockSize); +} + +// Cache/update plane index blocked IO settings +static unsigned planeBlockIOMapCBId = 0; +static std::unordered_map planeBlockedIOMap; +static CriticalSection planeBlockedIOMapCrit; +MODULE_INIT(INIT_PRIORITY_STANDARD) +{ + auto updateFunc = [&](const IPropertyTree *oldComponentConfiguration, const IPropertyTree *oldGlobalConfiguration) + { + CriticalBlock b(planeBlockedIOMapCrit); + planeBlockedIOMap.clear(); + Owned planesIter = getPlanesIterator(nullptr, nullptr); + ForEach(*planesIter) + { + const IPropertyTree &plane = planesIter->query(); + size32_t blockedFileIOSize = plane.getPropInt("@blockedFileIOKB") * 1024; + planeBlockedIOMap[plane.queryProp("@name")] = blockedFileIOSize; + } + }; + planeBlockIOMapCBId = installConfigUpdateHook(updateFunc, true); + return true; +} + +MODULE_EXIT() +{ + removeConfigUpdateHook(planeBlockIOMapCBId); +} + + +size32_t getBlockedFileIOSize(const char *planeName, size32_t defaultSize) +{ + CriticalBlock b(planeBlockedIOMapCrit); + auto it = planeBlockedIOMap.find(planeName); + if (it != planeBlockedIOMap.end()) + return it->second; + else + return defaultSize; +} diff --git a/system/jlib/jfile.hpp b/system/jlib/jfile.hpp index f469a787094..6ab5b339372 100644 --- a/system/jlib/jfile.hpp +++ b/system/jlib/jfile.hpp @@ -775,8 +775,14 @@ jlib_decl IFileEventWatcher *createFileEventWatcher(FileWatchFunc callback); //---- Storage plane related functions ---------------------------------------------------- +interface IPropertyTree; +interface IPropertyTreeIterator; extern jlib_decl IPropertyTree * getHostGroup(const char * name, bool required); extern jlib_decl IPropertyTree * getStoragePlane(const char * name); extern jlib_decl IPropertyTree * getRemoteStorage(const char * name); +extern jlib_decl IPropertyTreeIterator * getPlanesIterator(const char * category, const char *name); + +extern jlib_decl IFileIO *createBlockedIO(IFileIO *base, size32_t blockSize); +extern jlib_decl size32_t getBlockedFileIOSize(const char *planeName, size32_t defaultSize=0); #endif diff --git a/system/jlib/jflz.cpp b/system/jlib/jflz.cpp index a809964c540..078229722ba 100644 --- a/system/jlib/jflz.cpp +++ b/system/jlib/jflz.cpp @@ -687,7 +687,7 @@ class CFastLZCompressor final : public CFcmpCompressor class jlib_decl CFastLZExpander : public CFcmpExpander { public: - virtual void expand(void *buf) + virtual void expand(void *buf) override { if (!outlen) return; diff --git a/system/jlib/jlog.cpp b/system/jlib/jlog.cpp index 9fa11f6ea52..cc6987ba8dc 100644 --- a/system/jlib/jlog.cpp +++ b/system/jlib/jlog.cpp @@ -2820,13 +2820,14 @@ void IContextLogger::logOperatorException(IException *E, const char *file, unsig logOperatorExceptionVA(E, file, line, format, args); va_end(args); } +class CRuntimeStatisticCollection; class DummyLogCtx : implements IContextLogger { private: LogTrace logTrace; - public: + DummyLogCtx() {} // It's a static object - we don't want to actually link-count it... virtual void Link() const {} virtual bool Release() const { return false; } @@ -2894,6 +2895,10 @@ class DummyLogCtx : implements IContextLogger { return logTrace.queryCallerIdHTTPHeaderName(); } + virtual const CRuntimeStatisticCollection &queryStats() const override + { + throwUnexpected(); + } } dummyContextLogger; extern jlib_decl const IContextLogger &queryDummyContextLogger() diff --git a/system/jlib/jlog.hpp b/system/jlib/jlog.hpp index fb315d294dc..b711cfc40f1 100644 --- a/system/jlib/jlog.hpp +++ b/system/jlib/jlog.hpp @@ -1261,6 +1261,7 @@ interface jlib_decl IContextLogger : extends IInterface virtual const char *queryCallerIdHttpHeaderName() const = 0; virtual void setCallerId(const char *id) = 0; virtual const char *queryCallerId() const = 0; + virtual const CRuntimeStatisticCollection & queryStats() const = 0; }; extern jlib_decl StringBuffer &appendGloballyUniqueId(StringBuffer &s); diff --git a/system/jlib/jlz4.cpp b/system/jlib/jlz4.cpp index 92f3a8134d6..3b684a3bd60 100644 --- a/system/jlib/jlz4.cpp +++ b/system/jlib/jlz4.cpp @@ -177,8 +177,9 @@ class CLZ4Compressor final : public CFcmpCompressor class jlib_decl CLZ4Expander : public CFcmpExpander { + size32_t totalExpanded = 0; public: - virtual void expand(void *buf) + virtual void expand(void *buf) override { if (!outlen) return; @@ -221,6 +222,66 @@ class jlib_decl CLZ4Expander : public CFcmpExpander } } + virtual size32_t expandFirst(MemoryBuffer & target, const void * src) override + { + init(src); + totalExpanded = 0; + return expandNext(target); + } + + virtual size32_t expandNext(MemoryBuffer & target) override + { + if (totalExpanded == outlen) + return 0; + + const size32_t szchunk = *in; + in++; + + target.clear(); + size32_t written; + if (szchunk+totalExpanded maxEstimate) + estimate = maxEstimate; + if (maxOut < estimate) + maxOut = estimate; + + for (;;) + { + //Try and compress into the current target buffer. If too small increase size and repeat + written = LZ4_decompress_safe((const char *)in, (char *)target.reserve(maxOut), szchunk, maxOut); + if ((int)written > 0) + { + target.setLength(written); + break; + } + + //Sanity check to catch corrupt lz4 data that always returns an error. + if (maxOut > outlen) + throwUnexpected(); + + maxOut += szchunk; // Likely to quickly approach the actual expanded size + target.clear(); + } + } + else + { + void * buf = target.reserve(szchunk); + written = szchunk; + memcpy(buf,in,szchunk); + } + + in = (const size32_t *)(((const byte *)in)+szchunk); + totalExpanded += written; + if (totalExpanded > outlen) + throw MakeStringException(0, "LZ4Expander - corrupt data(3) %d %d",written,szchunk); + return written; + } }; void LZ4CompressToBuffer(MemoryBuffer & out, size32_t len, const void * src) diff --git a/system/jlib/jlzw.cpp b/system/jlib/jlzw.cpp index 8e343cecb6d..46604389dcf 100644 --- a/system/jlib/jlzw.cpp +++ b/system/jlib/jlzw.cpp @@ -448,6 +448,20 @@ void CLZWCompressor::close() } } + +size32_t CExpanderBase::expandFirst(MemoryBuffer & target, const void * src) +{ + size32_t size = init(src); + void * buffer = target.reserve(size); + expand(buffer); + return size; +} + +size32_t CExpanderBase::expandNext(MemoryBuffer & target) +{ + return 0; +} + CLZWExpander::CLZWExpander(bool _supportbigendian) { outbuf = NULL; @@ -1467,7 +1481,7 @@ class jlib_decl CRDiffCompressor : public ICompressor, public CInterface }; -class jlib_decl CRDiffExpander : public IExpander, public CInterface +class jlib_decl CRDiffExpander : public CExpanderBase { unsigned char *outbuf; size32_t outlen; @@ -1475,8 +1489,6 @@ class jlib_decl CRDiffExpander : public IExpander, public CInterface unsigned char *in; size32_t recsize; public: - IMPLEMENT_IINTERFACE; - CRDiffExpander() { outbuf = NULL; @@ -1987,8 +1999,12 @@ class CCompressedFile : implements ICompressedFileIO, public CInterface bool writeException; Owned compressor; Owned expander; + MemoryAttr compressedInputBlock; unsigned compMethod; offset_t lastFlushPos = (offset_t)-1; + offset_t nextExpansionPos = (offset_t)-1; + offset_t startBlockPos = (offset_t)-1; + size32_t fullBlockSize = 0; unsigned indexNum() { return indexbuf.length()/sizeof(offset_t); } @@ -2017,6 +2033,43 @@ class CCompressedFile : implements ICompressedFileIO, public CInterface void getblock(offset_t pos) { curblockbuf.clear(); + + //If the blocks are being expanded incrementally check if the position is within the current block + //This test will never be true for row compressed data, or non-incremental decompression + if ((pos >= startBlockPos) && (pos < startBlockPos + fullBlockSize)) + { + if (pos < nextExpansionPos) + { + //Start decompressing again and avoid re-reading the data from disk + const void * rawData; + if (fileio) + rawData = compressedInputBlock.get(); + else + rawData = mmfile->base()+startBlockPos; + + assertex(rawData); + size32_t exp = expander->expandFirst(curblockbuf, rawData); + curblockpos = startBlockPos; + nextExpansionPos = startBlockPos + exp; + if (pos < nextExpansionPos) + return; + + curblockbuf.clear(); + } + + for (;;) + { + size32_t nextSize = expander->expandNext(curblockbuf); + if (nextSize == 0) + throwUnexpected(); // Should have failed the outer block test if nextSize is 0 + + curblockpos = nextExpansionPos; + nextExpansionPos = nextExpansionPos+nextSize; + if (pos < nextExpansionPos) + return; + } + } + size32_t expsize; curblocknum = lookupIndex(pos,curblockpos,expsize); size32_t toread = trailer.blockSize; @@ -2027,8 +2080,9 @@ class CCompressedFile : implements ICompressedFileIO, public CInterface if (!toread) return; if (fileio) { - MemoryAttr comp; - void *b=comp.allocate(toread); + //Allocate on the first call, reuse on subsequent calls. + void * b = compressedInputBlock.allocate(trailer.blockSize); + size32_t r = fileio->read(p,toread,b); assertex(r==toread); expand(b,curblockbuf,expsize); @@ -2070,11 +2124,10 @@ class CCompressedFile : implements ICompressedFileIO, public CInterface } else { // lzw or fastlz or lz4 assertex(expander.get()); - size32_t exp = expander->init(compbuf); - if (exp!=expsize) { - throw MakeStringException(-1,"Compressed file format failure(%d,%d) - Encrypted?",exp,expsize); - } - expander->expand(expbuf.reserve(exp)); + size32_t exp = expander->expandFirst(expbuf, compbuf); + startBlockPos = curblockpos; + nextExpansionPos = startBlockPos + exp; + fullBlockSize = expsize; } } @@ -2224,6 +2277,9 @@ class CCompressedFile : implements ICompressedFileIO, public CInterface compMethod = COMPRESS_METHOD_LZW; expander.setown(createLZWExpander(true)); } + //Preallocate the expansion target to the block size - to ensure it is the right size and + //avoid reallocation when expanding lz4 + curblockbuf.ensureCapacity(trailer.blockSize); } } } @@ -2685,13 +2741,12 @@ class CAESCompressor : implements ICompressor, public CInterface virtual CompressionMethod getCompressionMethod() const override { return (CompressionMethod)(COMPRESS_METHOD_AES | comp->getCompressionMethod()); } }; -class CAESExpander : implements IExpander, public CInterface +class CAESExpander : implements CExpanderBase { Owned exp; // base expander MemoryBuffer compbuf; MemoryAttr key; public: - IMPLEMENT_IINTERFACE; CAESExpander(const void *_key, unsigned _keylen) : key(_keylen,_key) { diff --git a/system/jlib/jlzw.hpp b/system/jlib/jlzw.hpp index 72816bc4370..1d7c7196390 100644 --- a/system/jlib/jlzw.hpp +++ b/system/jlib/jlzw.hpp @@ -66,6 +66,8 @@ interface jlib_decl IExpander : public IInterface virtual void expand(void *target)=0; virtual void * bufptr()=0; virtual size32_t buflen()=0; + virtual size32_t expandFirst(MemoryBuffer & target, const void * src) = 0; + virtual size32_t expandNext(MemoryBuffer & target) = 0; }; @@ -82,6 +84,13 @@ interface jlib_decl IRandRowExpander : public IInterface }; +class jlib_decl CExpanderBase : public CInterfaceOf +{ +public: + //Provide default implementations + virtual size32_t expandFirst(MemoryBuffer & target, const void * src) override; + virtual size32_t expandNext(MemoryBuffer & target) override; +}; extern jlib_decl ICompressor *createLZWCompressor(bool supportbigendian=false); // bigendiansupport required for cross platform with solaris diff --git a/system/jlib/jlzw.ipp b/system/jlib/jlzw.ipp index 0e4ce4fcf7a..1f562b7d6cf 100644 --- a/system/jlib/jlzw.ipp +++ b/system/jlib/jlzw.ipp @@ -38,7 +38,6 @@ public: unsigned char dictchar[LZW_HASH_TABLE_SIZE]; }; - class CLZWCompressor final : public ICompressor, public CInterface { public: @@ -88,12 +87,9 @@ protected: bool supportbigendian; }; - -class jlib_decl CLZWExpander : public IExpander, public CInterface +class CLZWExpander : public CExpanderBase { public: - IMPLEMENT_IINTERFACE; - CLZWExpander(bool _supportbigendian); ~CLZWExpander(); virtual size32_t init(const void *blk); // returns size required diff --git a/system/jlib/jptree-attrs.hpp b/system/jlib/jptree-attrs.hpp index c841f090ac4..ac52f6e859f 100644 --- a/system/jlib/jptree-attrs.hpp +++ b/system/jlib/jptree-attrs.hpp @@ -1,6 +1,7 @@ "@accessed", "@activity", "@agentSession", + "@branchMemorySize" "@buildVersion", "@checkSum", "@cloneable", @@ -38,6 +39,7 @@ "@isScalar", "@jobName", "@keyedSize", + "@leafMemorySize" "@libCount", "@localValue", "@mapFlags", diff --git a/system/jlib/jptree.cpp b/system/jlib/jptree.cpp index 6616fd01cda..beafd59809c 100644 --- a/system/jlib/jptree.cpp +++ b/system/jlib/jptree.cpp @@ -8878,7 +8878,7 @@ void executeConfigUpdaterCallbacks() { if (!configFileUpdater) // NB: executeConfigUpdaterCallbacks should always be called after configFileUpdater is initialized return; - configFileUpdater->executeCallbacks(componentConfiguration.getLink(), globalConfiguration.getLink()); + configFileUpdater->executeCallbacks(componentConfiguration, globalConfiguration); } void CConfigUpdateHook::clear() @@ -9089,10 +9089,14 @@ jlib_decl IPropertyTree * loadConfiguration(const char * defaultYaml, const char return loadConfiguration(componentDefault, argv, componentTag, envPrefix, legacyFilename, mapper, altNameAttribute, monitor); } -void replaceComponentConfig(IPropertyTree *newComponentConfig) +void replaceComponentConfig(IPropertyTree *newComponentConfig, IPropertyTree *newGlobalConfig) { - CriticalBlock b(configCS); - componentConfiguration.set(newComponentConfig); + { + CriticalBlock b(configCS); + componentConfiguration.set(newComponentConfig); + globalConfiguration.set(newGlobalConfig); + } + executeConfigUpdaterCallbacks(); } class CYAMLBufferReader : public CInterfaceOf diff --git a/system/jlib/jptree.hpp b/system/jlib/jptree.hpp index 4388003eb4d..ac239602056 100644 --- a/system/jlib/jptree.hpp +++ b/system/jlib/jptree.hpp @@ -319,7 +319,7 @@ jlib_decl void mergeConfiguration(IPropertyTree & target, const IPropertyTree & jlib_decl IPropertyTree * loadArgsIntoConfiguration(IPropertyTree *config, const char * * argv, std::initializer_list ignoreOptions = {}); jlib_decl IPropertyTree * loadConfiguration(IPropertyTree * defaultConfig, const char * * argv, const char * componentTag, const char * envPrefix, const char * legacyFilename, IPropertyTree * (mapper)(IPropertyTree *), const char *altNameAttribute=nullptr, bool monitor=true); jlib_decl IPropertyTree * loadConfiguration(const char * defaultYaml, const char * * argv, const char * componentTag, const char * envPrefix, const char * legacyFilename, IPropertyTree * (mapper)(IPropertyTree *), const char *altNameAttribute=nullptr, bool monitor=true); -jlib_decl void replaceComponentConfig(IPropertyTree *newComponentConfig); +jlib_decl void replaceComponentConfig(IPropertyTree *newComponentConfig, IPropertyTree *newGlobalConfig); jlib_decl IPropertyTree * getCostsConfiguration(); //The following can only be called after loadConfiguration has been called. All components must call loadConfiguration(). diff --git a/system/jlib/jqueue.hpp b/system/jlib/jqueue.hpp index aeba567c46e..f00bd4a666d 100644 --- a/system/jlib/jqueue.hpp +++ b/system/jlib/jqueue.hpp @@ -447,6 +447,28 @@ class DListOf } numEntries++; } + void moveToHead(ELEMENT * element) + { + if (likely(pHead != element)) + { + //Initial code from remove() - simplified since pHead != element, and no decrement of entries + ELEMENT * next = element->next; + ELEMENT * prev = element->prev; + assertex(prev || next); + if (element == pTail) // would if (!next) avoid loading pTail? + pTail = prev; + if (next) + next->prev = prev; + if (prev) + prev->next = next; + + //enqueueHead() - simplified since pHead must be set, and no increment of number of entries + pHead->prev = element; + element->next = pHead; + element->prev = nullptr; + pHead = element; + } + } ELEMENT *head() const { return pHead; } ELEMENT *tail() const { return pTail; } void remove(ELEMENT *element) diff --git a/system/jlib/jqueue.tpp b/system/jlib/jqueue.tpp index 62494057e91..0063aee130b 100644 --- a/system/jlib/jqueue.tpp +++ b/system/jlib/jqueue.tpp @@ -33,7 +33,7 @@ class QueueOf unsigned headp; unsigned tailp; unsigned max; - unsigned num; + RelaxedAtomic num; // atomic so that it can be read without a critical section void expand() { unsigned inc; @@ -61,6 +61,11 @@ public: memmove(ptrs+headp+n, ptrs+headp, (num-tailp-1)*sizeof(BASE *)); headp += n; } + else if (num==0) + { + headp = 0; + tailp = max-1; + } } inline BASE *head() const { return num?ptrs[headp]:NULL; } inline BASE *tail() const { return num?ptrs[tailp]:NULL; } @@ -74,38 +79,28 @@ public: } inline void enqueue(BASE *e) { - if (ALLOWNULLS || e) { - if (num==max) + if (ALLOWNULLS || e) + { + if (unlikely(num==max)) expand(); - if (num==0) { - headp = 0; - tailp = 0; - } - else { - tailp++; - if (tailp==max) - tailp=0; - } + tailp++; + if (tailp==max) + tailp=0; ptrs[tailp] = e; - num++; + num.fastAdd(1); // Do not use increment which is atomic } } void enqueueHead(BASE *e) { - if (ALLOWNULLS || e) { - if (num==max) + if (ALLOWNULLS || e) + { + if (unlikely(num==max)) expand(); - if (num==0) { - headp = 0; - tailp = 0; - } - else { - if (headp==0) - headp=max; - headp--; - } + if (headp==0) + headp=max; + headp--; ptrs[headp] = e; - num++; + num.fastAdd(1); // Do not use increment which is atomic } } void enqueue(BASE *e,unsigned i) @@ -133,7 +128,7 @@ public: p = n; } while (p!=i); ptrs[i] = e; - num++; + num.fastAdd(1); // Do not use increment which is atomic } } } @@ -159,7 +154,7 @@ public: headp++; if (headp==max) headp = 0; - num--; + num.fastAdd(-1); // Do not use decrement which is atomic return ret; } BASE *dequeueTail() @@ -170,7 +165,7 @@ public: if (tailp==0) tailp=max; tailp--; - num--; + num.fastAdd(-1); // Do not use decrement which is atomic return ret; } BASE *dequeue(unsigned i) @@ -196,7 +191,7 @@ public: headp++; if (headp==max) headp = 0; - num--; + num.fastAdd(-1); // Do not use decrement which is atomic return ret; } void set(unsigned idx, BASE *v) @@ -270,7 +265,7 @@ public: BASE *dequeue(unsigned i) { CriticalBlock b(crit); return QueueOf::dequeue(i); } unsigned find(BASE *e) { CriticalBlock b(crit); return QueueOf::find(e); } void dequeue(BASE *e) { CriticalBlock b(crit); return QueueOf::dequeue(e); } - inline unsigned ordinality() const { CriticalBlock b(crit); return QueueOf::ordinality(); } + inline unsigned ordinality() const { return QueueOf::ordinality(); } void set(unsigned idx, BASE *e) { CriticalBlock b(crit); return QueueOf::set(idx, e); } }; diff --git a/system/jlib/jstatcodes.h b/system/jlib/jstatcodes.h index 3894ebe214a..58035113488 100644 --- a/system/jlib/jstatcodes.h +++ b/system/jlib/jstatcodes.h @@ -293,6 +293,8 @@ enum StatisticKind StSizeAgentSend, StTimeIndexCacheBlocked, StCycleIndexCacheBlockedCycles, + StTimeAgentProcess, + StCycleAgentProcessCycles, StMax, //For any quantity there is potentially the following variants. diff --git a/system/jlib/jstats.cpp b/system/jlib/jstats.cpp index 486c3cf8dea..09365063614 100644 --- a/system/jlib/jstats.cpp +++ b/system/jlib/jstats.cpp @@ -954,6 +954,8 @@ static const constexpr StatisticMeta statsMetaData[StMax] = { { SIZESTAT(AgentSend) }, { TIMESTAT(IndexCacheBlocked) }, { CYCLESTAT(IndexCacheBlocked) }, + { TIMESTAT(AgentProcess) }, + { CYCLESTAT(AgentProcess) }, }; static MapStringTo statisticNameMap(true); diff --git a/system/jlib/jsuperhash.hpp b/system/jlib/jsuperhash.hpp index e8da89501b7..b9c209f6760 100644 --- a/system/jlib/jsuperhash.hpp +++ b/system/jlib/jsuperhash.hpp @@ -162,11 +162,13 @@ class SuperHashTableOf : public SuperHashTable }; -// Macro to provide find method taking reference instead of pointer +// Macro to provide find method taking reference instead of pointer (yuk!) #define IMPLEMENT_SUPERHASHTABLEOF_REF_FIND(ET, FP) \ inline ET * find(FP & fp) const \ - { return SuperHashTableOf::find(&fp); } + { return SuperHashTableOf::find(&fp); } \ + inline ET * find(unsigned hash, FP & fp) const \ + { return SuperHashTableOf::find(hash, &fp); } // simple type hashing HT impl. diff --git a/system/mp/mpcomm.cpp b/system/mp/mpcomm.cpp index 408358f03da..61c1bc3cd54 100644 --- a/system/mp/mpcomm.cpp +++ b/system/mp/mpcomm.cpp @@ -68,7 +68,8 @@ // These should really be configurable #define CANCELTIMEOUT 1000 // 1 sec #define CONNECT_TIMEOUT (5*60*1000) // 5 mins -#define CONNECT_READ_TIMEOUT (10*1000) // 10 seconds. NB: used by connect readtms loop (see loopCnt) +#define CONNECT_READ_TIMEOUT (90*1000) // 90 seconds. NB: used by connect readtms loop (see loopCnt) +#define CONNECT_READEXC_TIMEOUT (10*1000) // 10 seconds. NB: to read exception info after confirm #define CONNECT_TIMEOUT_INTERVAL 1000 // 1 sec #define CONNECT_RETRYCOUNT 180 // Overall max connect time is = CONNECT_RETRYCOUNT * CONNECT_READ_TIMEOUT #define CONNECT_TIMEOUT_MINSLEEP 2000 // random range: CONNECT_TIMEOUT_MINSLEEP to CONNECT_TIMEOUT_MAXSLEEP milliseconds @@ -700,33 +701,76 @@ void traceSlowReadTms(const char *msg, ISocket *sock, void *dst, size32_t minSiz dbgassertex(timeoutChkIntervalMs < timeoutMs); StringBuffer epStr; CCycleTimer readTmsTimer; - unsigned intervalTimeoutMs = timeoutChkIntervalMs; + unsigned intervalTimeoutMs = 500; + CCycleTimer intvlTimer; + + // legacy client sends minSize, recent client sends maxSize + // if read < maxSize, keep trying for maxSize, but if its exactly minSize + // somewhat quickly (without waiting full timeout) settle for minSize ... + + if (intervalTimeoutMs > timeoutChkIntervalMs) + intervalTimeoutMs = timeoutChkIntervalMs; + + sizeRead = 0; + + unsigned firstReadTime = 0; + size32_t maxRead = maxSize; for (;;) { try { - sock->readtms(dst, minSize, maxSize, sizeRead, intervalTimeoutMs); - break; + size32_t amtRead = 0; + sock->readtms((char *)dst+sizeRead, 0, maxRead, amtRead, intervalTimeoutMs); + sizeRead += amtRead; + if (sizeRead == maxSize) + break; + maxRead -= amtRead; } catch (IJSOCK_Exception *e) { if (JSOCKERR_graceful_close == e->errorCode()) + { + e->Release(); return; + } else if (JSOCKERR_timeout_expired != e->errorCode()) throw; + // interval read timed out ... unsigned elapsedMs = readTmsTimer.elapsedMs(); + if (sizeRead == minSize) + { + if (firstReadTime == 0) + firstReadTime = elapsedMs; + else if ((elapsedMs - firstReadTime) >= 5000) // max wait if minSize sent + { + e->Release(); + break; + } + } if (elapsedMs >= timeoutMs) + { + if (sizeRead >= minSize) + { + e->Release(); + break; + } throw; + } unsigned remainingMs = timeoutMs-elapsedMs; - if (remainingMs < timeoutChkIntervalMs) + if (remainingMs < intervalTimeoutMs) intervalTimeoutMs = remainingMs; - if (0 == epStr.length()) + if (intvlTimer.elapsedMs() >= timeoutChkIntervalMs) { - SocketEndpoint ep; - sock->getPeerEndpoint(ep); - ep.getUrlStr(epStr); + intvlTimer.reset(); + if (0 == epStr.length()) + { + SocketEndpoint ep; + sock->getPeerEndpoint(ep); + ep.getUrlStr(epStr); + } + WARNLOG("%s %s, stalled for %d ms so far", msg, epStr.str(), elapsedMs); } - WARNLOG("%s %s, stalled for %d ms so far", msg, epStr.str(), elapsedMs); + e->Release(); } } if (readTmsTimer.elapsedMs() >= TRACESLOW_THRESHOLD) @@ -909,6 +953,10 @@ protected: friend class CMPPacketReader; #ifdef _TRACE PROGLOG("MP: loopCnt start = %u", loopCnt); #endif + rd = 0; + byte replyBuf[sizeof(size32_t)]; + size32_t totRead = 0; + size32_t maxRead = sizeof(size32_t); while (loopCnt-- > 0) { { @@ -929,13 +977,20 @@ protected: friend class CMPPacketReader; } } - rd = 0; - - MemoryBuffer replyMb; - void *replyMem = replyMb.ensureCapacity(0x1000); // 4K - max size to allow for serialized exception try { - newsock->readtms(replyMem, sizeof(rd), replyMb.capacity(), rd, CONNECT_TIMEOUT_INTERVAL); + // read 4 bytes, value should be sizeof(ConnectHdr.id) [12] or sizeof(connectHdr) [44] or larger (exception) + // if its an exception or legacy and not in allowlist the other side closes its socket after sending this msg ... + + size32_t amtRead = 0; + newsock->readtms(&replyBuf[totRead], 0, maxRead, amtRead, CONNECT_TIMEOUT_INTERVAL); + totRead += amtRead; + if (totRead == sizeof(size32_t)) + { + rd = totRead; + break; + } + maxRead -= amtRead; } catch (IException *e) { @@ -978,6 +1033,7 @@ protected: friend class CMPPacketReader; } else { + // interval read timed out ... if (0 == epStr.length()) { SocketEndpoint ep; @@ -988,39 +1044,48 @@ protected: friend class CMPPacketReader; e->Release(); } } -#ifdef _FULLTRACE - PROGLOG("MP: rd = %d", rd); + } // while loopcnt + + /* NB: legacy clients that don't handle the exception deserialization here + * will see reply as success, so no clean error, + * but will fail shortly afterwards since server connection is closed + */ + if (rd == sizeof(size32_t)) + { + size32_t replyVal; + memcpy(&replyVal, (size32_t *)replyBuf, sizeof(size32_t)); +#ifdef _TRACE + LOG(MCdebugInfo, unknownJob, "MP: connect after socket read replyVal=%u, sizeof(connectHdr)=%lu", replyVal, sizeof(connectHdr)); #endif - /* NB: legacy clients that don't handle the exception deserialization here - * will see reply as success, so no clean error, - * but will fail shortly afterwards since server connection is closed - */ - if (rd > sizeof(rd)) // legacy clients will only ever send a reply of 0 or 4, if greater, then new client is replying with an exception + if (replyVal > sizeof(ConnectHdr)) { - MemoryBuffer mb; - mb.setBuffer(rd, replyMem, false); - size32_t len; - mb.read(len); // exception length - if (len) + // read exception message ... + MemoryBuffer replyMb; + void *replyMem = replyMb.ensureCapacity(replyVal); + + size32_t amtRead = 0; + try { - exitException.setown(deserializeException(mb)); + newsock->readtms(replyMem, replyVal, replyVal, amtRead, CONNECT_READEXC_TIMEOUT); + } + catch (IException *e) + { + if (0 == epStr.length()) + { + SocketEndpoint ep; + newsock->getPeerEndpoint(ep); + ep.getUrlStr(epStr); + } + StringBuffer allowExcStr; + exitException.setown(makeStringExceptionV(-99, "Error '%s' reading Allowlist exception from: %s", e->errorMessage(allowExcStr).str(), epStr.str())); + e->Release(); throw exitException.getLink(); } - break; - } - else if (rd != 0) - { - assertex(rd == sizeof(rd)); - break; + replyMb.setLength(amtRead); + exitException.setown(deserializeException(replyMb)); + throw exitException.getLink(); } - } - -#ifdef _TRACE - LOG(MCdebugInfo, unknownJob, "MP: connect after socket read rd=%u, sizeof(connectHdr)=%lu", rd, sizeof(connectHdr)); -#endif - if (rd) - { unsigned elapsedMs = msTick() - startMs; if (elapsedMs >= TRACESLOW_THRESHOLD) { @@ -2165,7 +2230,7 @@ int CMPConnectThread::run() sock->set_keep_alive(true); - size32_t rd; + size32_t rd = 0; SocketEndpoint _remoteep; SocketEndpoint hostep; ConnectHdr connectHdr; @@ -2188,6 +2253,10 @@ int CMPConnectThread::run() if (rd == sizeof(connectHdr.id)) // legacy client { legacyClient = true; + connectHdr.hdr.size = sizeof(PacketHeader); + connectHdr.hdr.tag = TAG_SYS_BCAST; + connectHdr.hdr.flags = 0; + connectHdr.hdr.version = MP_PROTOCOL_VERSION; connectHdr.setRole(0); // unknown } else if (rd < sizeof(connectHdr.id) || rd > sizeof(connectHdr)) @@ -2205,7 +2274,7 @@ int CMPConnectThread::run() { StringBuffer ipStr; peerEp.getIpText(ipStr); - StringBuffer responseText; // filled if denied + StringBuffer responseText; // filled if denied, NB: if amount sent is > sizeof(ConnectHdr) we can differentiate exception from success if (!allowListCallback->isAllowListed(ipStr, connectHdr.getRole(), &responseText)) { Owned e = makeStringException(-1, responseText); diff --git a/system/security/zcrypt/CMakeLists.txt b/system/security/zcrypt/CMakeLists.txt index 146cc16028d..00d894df6d4 100644 --- a/system/security/zcrypt/CMakeLists.txt +++ b/system/security/zcrypt/CMakeLists.txt @@ -27,8 +27,7 @@ project( zcrypt ) SET(CMAKE_UNITY_BUILD FALSE) -find_package(minizip CONFIG REQUIRED) -find_path(MINIZIP_INCLUDE_DIRS "minizip/zip.h" HINTS "${VCPKG_INSTALLED_DIR}") +find_package(unofficial-minizip CONFIG REQUIRED) set ( SRCS aes.cpp @@ -38,9 +37,7 @@ set ( SRCS ) include_directories ( - ${ZLIB_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} - ${MINIZIP_INCLUDE_DIRS} ./../../security/shared ./../../include ./../../jlib @@ -52,9 +49,6 @@ HPCC_ADD_LIBRARY( zcrypt SHARED ${SRCS} ) install ( TARGETS zcrypt RUNTIME DESTINATION ${EXEC_DIR} LIBRARY DESTINATION ${LIB_DIR} CALC_DEPS ) target_link_libraries ( zcrypt jlib - ${ZLIB_LIBRARIES} ${OPENSSL_LIBRARIES} - minizip::minizip + unofficial::minizip::minizip ) - - diff --git a/testing/unittests/CMakeLists.txt b/testing/unittests/CMakeLists.txt index 3c5c40c755b..58153493d35 100644 --- a/testing/unittests/CMakeLists.txt +++ b/testing/unittests/CMakeLists.txt @@ -83,6 +83,7 @@ include_directories ( ${HPCC_SOURCE_DIR}/esp/bindings ${HPCC_SOURCE_DIR}/esp/bindings/SOAP/xpp ${HPCC_SOURCE_DIR}/esp/esdllib + ${HPCC_SOURCE_DIR}/esp/esdlscriptlib ${HPCC_SOURCE_DIR}/esp/logging ${HPCC_SOURCE_DIR}/esp/logging/logginglib ${HPCC_SOURCE_DIR}/esp/logging/loggingmanager diff --git a/thorlcr/activities/hashdistrib/thhashdistrib.cpp b/thorlcr/activities/hashdistrib/thhashdistrib.cpp index 329c1cd2969..abe2c00f037 100644 --- a/thorlcr/activities/hashdistrib/thhashdistrib.cpp +++ b/thorlcr/activities/hashdistrib/thhashdistrib.cpp @@ -89,7 +89,7 @@ class IndexDistributeActivityMaster : public HashDistributeMasterBase MemoryBuffer tlkMb; public: - IndexDistributeActivityMaster(CMasterGraphElement *info) : HashDistributeMasterBase(DM_index, info) { } + IndexDistributeActivityMaster(CMasterGraphElement *info) : HashDistributeMasterBase(DM_index, info, indexDistribActivityStatistics) { } virtual void init() { HashDistributeMasterBase::init(); diff --git a/thorlcr/activities/hashdistrib/thhashdistribslave.cpp b/thorlcr/activities/hashdistrib/thhashdistribslave.cpp index 23709b01896..33723ba94fb 100644 --- a/thorlcr/activities/hashdistrib/thhashdistribslave.cpp +++ b/thorlcr/activities/hashdistrib/thhashdistribslave.cpp @@ -2057,8 +2057,8 @@ class HashDistributeSlaveBase : public CSlaveActivity, implements IStopInput bool setupDist = true; bool isAll = false; public: - HashDistributeSlaveBase(CGraphElementBase *_container) - : CSlaveActivity(_container) + HashDistributeSlaveBase(CGraphElementBase *_container, const StatisticsMapping &statsMapping = basicActivityStatistics) + : CSlaveActivity(_container, statsMapping) { appendOutputLinked(this); } @@ -2454,6 +2454,8 @@ class ReDistributeSlaveActivity : public HashDistributeSlaveActivity class IndexDistributeSlaveActivity : public HashDistributeSlaveBase { typedef HashDistributeSlaveBase PARENT; + CThorContextLogger contextLogger; + CStatsCtxLoggerDeltaUpdater statsUpdater; class CKeyLookup : implements IHash { @@ -2466,11 +2468,12 @@ class IndexDistributeSlaveActivity : public HashDistributeSlaveBase CKeyLookup(IndexDistributeSlaveActivity &_owner, IHThorKeyedDistributeArg *_helper, IKeyIndex *_tlk) : owner(_owner), helper(_helper), tlk(_tlk) { - tlkManager.setown(createLocalKeyManager(helper->queryIndexRecordSize()->queryRecordAccessor(true), tlk, nullptr, helper->hasNewSegmentMonitors(), false)); + tlkManager.setown(createLocalKeyManager(helper->queryIndexRecordSize()->queryRecordAccessor(true), tlk, &owner.contextLogger, helper->hasNewSegmentMonitors(), false)); numslaves = owner.queryContainer().queryJob().querySlaves(); } unsigned hash(const void *data) { + CStatsScopedThresholdDeltaUpdater scoped(owner.statsUpdater); helper->createSegmentMonitors(tlkManager, data); tlkManager->finishSegmentMonitors(); tlkManager->reset(); @@ -2484,7 +2487,7 @@ class IndexDistributeSlaveActivity : public HashDistributeSlaveBase } *lookup; public: - IndexDistributeSlaveActivity(CGraphElementBase *container) : PARENT(container), lookup(NULL) + IndexDistributeSlaveActivity(CGraphElementBase *container) : PARENT(container, indexDistribActivityStatistics), lookup(NULL), statsUpdater(jhtreeCacheStatistics, *this, contextLogger) { } ~IndexDistributeSlaveActivity() @@ -2508,6 +2511,11 @@ class IndexDistributeSlaveActivity : public HashDistributeSlaveBase lookup = new CKeyLookup(*this, helper, createKeyIndex(name.str(), 0, *iFileIO, (unsigned) -1, true)); // MORE - crc is not 0... ihash = lookup; } + virtual void stop() override + { + CStatsScopedDeltaUpdater scoped(statsUpdater); + PARENT::stop(); + } }; //=========================================================================== diff --git a/thorlcr/activities/indexread/thindexreadslave.cpp b/thorlcr/activities/indexread/thindexreadslave.cpp index 4e781d124d8..802e0f8a412 100644 --- a/thorlcr/activities/indexread/thindexreadslave.cpp +++ b/thorlcr/activities/indexread/thindexreadslave.cpp @@ -78,27 +78,8 @@ class CIndexReadSlaveBase : public CSlaveActivity Owned lazyIFileIO; mutable CriticalSection ioStatsCS; unsigned fileTableStart = NotFound; - - template - class CCaptureIndexStats - { - CRuntimeStatisticCollection &stats; - StatProvider &statProvider; - unsigned __int64 startSeeks = 0, startScans = 0, startWildSeeks = 0; - public: - inline CCaptureIndexStats(CRuntimeStatisticCollection &_stats, StatProvider &_statProvider) : stats(_stats), statProvider(_statProvider) - { - startSeeks = statProvider.querySeeks(); - startScans = statProvider.queryScans(); - startWildSeeks = statProvider.queryWildSeeks(); - } - inline ~CCaptureIndexStats() - { - stats.mergeStatistic(StNumIndexSeeks, statProvider.querySeeks() - startSeeks); - stats.mergeStatistic(StNumIndexScans, statProvider.queryScans() - startScans); - stats.mergeStatistic(StNumIndexWildSeeks, statProvider.queryWildSeeks() - startWildSeeks); - } - }; + CThorContextLogger contextLogger; + CStatsCtxLoggerDeltaUpdater statsUpdater; class TransformCallback : implements IThorIndexCallback , public CSimpleInterface { @@ -112,13 +93,12 @@ class CIndexReadSlaveBase : public CSlaveActivity //IThorIndexCallback virtual const byte *lookupBlob(unsigned __int64 id) override - { + { size32_t dummy; if (!keyManager) throw MakeActivityException(&activity, 0, "Callback attempting to read blob with no key manager - index being read remotely?"); needsBlobCleaning = true; - IContextLogger * ctxLogger = nullptr; - return (byte *) keyManager->loadBlob(id, dummy, ctxLogger); + return (byte *) keyManager->loadBlob(id, dummy, &activity.contextLogger); } void prepareManager(IKeyManager *_keyManager) { @@ -130,7 +110,7 @@ class CIndexReadSlaveBase : public CSlaveActivity if (needsBlobCleaning) { needsBlobCleaning = false; - keyManager->releaseBlobs(); + keyManager->releaseBlobs(); } } void resetManager() @@ -270,6 +250,7 @@ class CIndexReadSlaveBase : public CSlaveActivity StringBuffer lPath; rfn.getLocalPath(lPath); + // todo: track stats when using remote handler Owned indexLookup = createRemoteFilteredKey(ep, lPath, crc, actualFormat, projectedFormat, actualFilter, remoteLimit); if (indexLookup) { @@ -308,7 +289,14 @@ class CIndexReadSlaveBase : public CSlaveActivity // local key handling - lazyIFileIO.setown(queryThor().queryFileCache().lookupIFileIO(*this, logicalFilename, part, nullptr, indexReadActivityStatistics)); + size32_t blockedSize = 0; + if (!helper->hasSegmentMonitors()) // unfiltered + { + StringBuffer planeName; + part.queryOwner().getClusterLabel(0, planeName); + blockedSize = getBlockedFileIOSize(planeName); + } + lazyIFileIO.setown(queryThor().queryFileCache().lookupIFileIO(*this, logicalFilename, part, nullptr, indexReadActivityStatistics, blockedSize)); RemoteFilename rfn; part.getFilename(0, rfn); @@ -316,7 +304,7 @@ class CIndexReadSlaveBase : public CSlaveActivity rfn.getPath(path); // NB: use for tracing only, IDelayedFile uses IPartDescriptor and any copy Owned keyIndex = createKeyIndex(path, crc, *lazyIFileIO, (unsigned) -1, false); - Owned klManager = createLocalKeyManager(helper->queryDiskRecordSize()->queryRecordAccessor(true), keyIndex, nullptr, helper->hasNewSegmentMonitors(), false); + Owned klManager = createLocalKeyManager(helper->queryDiskRecordSize()->queryRecordAccessor(true), keyIndex, &contextLogger, helper->hasNewSegmentMonitors(), false); if (localMerge) { if (!keyIndexSet) @@ -343,7 +331,7 @@ class CIndexReadSlaveBase : public CSlaveActivity return createIndexLookup(keyManager); } } - keyMergerManager.setown(createKeyMerger(helper->queryDiskRecordSize()->queryRecordAccessor(true), keyIndexSet, seekGEOffset, nullptr, helper->hasNewSegmentMonitors(), false)); + keyMergerManager.setown(createKeyMerger(helper->queryDiskRecordSize()->queryRecordAccessor(true), keyIndexSet, seekGEOffset, &contextLogger, helper->hasNewSegmentMonitors(), false)); const ITranslator *translator = translators.item(0); if (translator) keyMergerManager->setLayoutTranslator(&translator->queryTranslator()); @@ -445,15 +433,13 @@ class CIndexReadSlaveBase : public CSlaveActivity if (eoi) return nullptr; dbgassertex(currentInput); + CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); const void *ret = nullptr; while (true) { - { - CCaptureIndexStats scoped(inactiveStats, *currentInput); - ret = currentInput->nextKey(); - if (ret) - break; - } + ret = currentInput->nextKey(); + if (ret) + break; configureNextInput(); if (!currentInput) break; @@ -542,7 +528,8 @@ class CIndexReadSlaveBase : public CSlaveActivity } public: CIndexReadSlaveBase(CGraphElementBase *container) - : CSlaveActivity(container, indexReadActivityStatistics), callback(*this) + : CSlaveActivity(container, indexReadActivityStatistics), callback(*this), + statsUpdater(jhtreeCacheStatistics, *this, contextLogger) { helper = (IHThorIndexReadBaseArg *)container->queryHelper(); limitTransformExtra = nullptr; @@ -569,7 +556,7 @@ class CIndexReadSlaveBase : public CSlaveActivity break; if (keyManager) prepareManager(keyManager); - CCaptureIndexStats scoped(inactiveStats, *indexInput); + CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); if (hard) // checkCount checks hard key count only. count += indexInput->checkCount(keyedLimit-count); // part max, is total limit [keyedLimit] minus total so far [count] else @@ -608,7 +595,7 @@ class CIndexReadSlaveBase : public CSlaveActivity } else initialized = true; - + unsigned parts; data.read(parts); if (parts) @@ -833,7 +820,7 @@ class CIndexReadSlaveActivity : public CIndexReadSlaveBase helper->mapOutputToInput(tempBuilder, seek, numFields); // NOTE - weird interface to mapOutputToInput means that it STARTS writing at seekGEOffset... rawSeek = (byte *)temp; } - CCaptureIndexStats scoped(inactiveStats, *currentManager); + CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); if (!currentManager->lookupSkip(rawSeek, seekGEOffset, seekSize)) return NULL; const byte *row = currentManager->queryKeyBuffer(); @@ -986,6 +973,7 @@ class CIndexReadSlaveActivity : public CIndexReadSlaveBase // IRowStream virtual void stop() override { + CStatsScopedDeltaUpdater scoped(statsUpdater); if (RCMAX != keyedLimit) // NB: will not be true if nextRow() has handled { keyedLimitCount = sendGetCount(keyedProcessed); @@ -1155,7 +1143,7 @@ class CIndexGroupAggregateSlaveActivity : public CIndexReadSlaveBase, implements if (keyManager) prepareManager(keyManager); - CCaptureIndexStats scoped(inactiveStats, *indexInput); + CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); while (true) { const void *key = indexInput->nextKey(); @@ -1314,7 +1302,7 @@ class CIndexCountSlaveActivity : public CIndexReadSlaveBase if (keyManager) prepareManager(keyManager); - CCaptureIndexStats scoped(inactiveStats, *indexInput); + CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); while (true) { const void *key = indexInput->nextKey(); diff --git a/thorlcr/activities/indexwrite/thindexwrite.cpp b/thorlcr/activities/indexwrite/thindexwrite.cpp index ceeefbffcc7..859a987041f 100644 --- a/thorlcr/activities/indexwrite/thindexwrite.cpp +++ b/thorlcr/activities/indexwrite/thindexwrite.cpp @@ -38,6 +38,8 @@ class IndexWriteActivityMaster : public CMasterActivity offset_t compressedFileSize = 0; offset_t uncompressedSize = 0; offset_t originalBlobSize = 0; + offset_t branchMemorySize = 0; + offset_t leafMemorySize = 0; Owned fileDesc; bool buildTlk, isLocal, singlePartKey; StringArray clusters; @@ -265,6 +267,10 @@ class IndexWriteActivityMaster : public CMasterActivity props.setPropInt64("@numBlobNodes", numBlobNodes); if (numBlobNodes) props.setPropInt64("@originalBlobSize", originalBlobSize); + if (branchMemorySize) + props.setPropInt64("@branchMemorySize", branchMemorySize); + if (leafMemorySize) + props.setPropInt64("@leafMemorySize", leafMemorySize); Owned metadata; buildUserMetadata(metadata, *helper); @@ -345,12 +351,16 @@ class IndexWriteActivityMaster : public CMasterActivity offset_t slaveOffsetBranches; offset_t slaveUncompressedSize; offset_t slaveOriginalBlobSize; + offset_t slaveBranchMemorySize; + offset_t slaveLeafMemorySize; mb.read(slaveNumLeafNodes); mb.read(slaveNumBlobNodes); mb.read(slaveNumBranchNodes); mb.read(slaveOffsetBranches); mb.read(slaveUncompressedSize); mb.read(slaveOriginalBlobSize); + mb.read(slaveBranchMemorySize); + mb.read(slaveLeafMemorySize); compressedFileSize += size; numLeafNodes += slaveNumLeafNodes; @@ -358,6 +368,8 @@ class IndexWriteActivityMaster : public CMasterActivity numBranchNodes += slaveNumBranchNodes; uncompressedSize += slaveUncompressedSize; originalBlobSize += slaveOriginalBlobSize; + branchMemorySize += slaveBranchMemorySize; + leafMemorySize += slaveLeafMemorySize; props.setPropInt64("@uncompressedSize", slaveUncompressedSize); props.setPropInt64("@offsetBranches", slaveOffsetBranches); diff --git a/thorlcr/activities/indexwrite/thindexwriteslave.cpp b/thorlcr/activities/indexwrite/thindexwriteslave.cpp index c827663568c..8b09d756023 100644 --- a/thorlcr/activities/indexwrite/thindexwriteslave.cpp +++ b/thorlcr/activities/indexwrite/thindexwriteslave.cpp @@ -60,6 +60,8 @@ class IndexWriteSlaveActivity : public ProcessSlaveActivity, public ILookAheadSt offset_t offsetBranches = 0; offset_t uncompressedSize = 0; offset_t originalBlobSize = 0; + offset_t branchMemorySize = 0; + offset_t leafMemorySize = 0; MemoryBuffer rowBuff; OwnedConstThorRow lastRow, firstRow; @@ -241,6 +243,8 @@ class IndexWriteSlaveActivity : public ProcessSlaveActivity, public ILookAheadSt numBranchNodes = builder->getNumBranchNodes(); numBlobNodes = builder->getNumBlobNodes(); offsetBranches = builder->getOffsetBranches(); + branchMemorySize = builder->getBranchMemorySize(); + leafMemorySize = builder->getLeafMemorySize(); } } } @@ -633,6 +637,8 @@ class IndexWriteSlaveActivity : public ProcessSlaveActivity, public ILookAheadSt mb.append(offsetBranches); mb.append(uncompressedSize); mb.append(originalBlobSize); + mb.append(branchMemorySize); + mb.append(leafMemorySize); if (!singlePartKey && firstNode() && buildTlk) { diff --git a/thorlcr/activities/keyedjoin/thkeyedjoinslave-legacy.cpp b/thorlcr/activities/keyedjoin/thkeyedjoinslave-legacy.cpp index cc5eaa5faea..ff066dde087 100644 --- a/thorlcr/activities/keyedjoin/thkeyedjoinslave-legacy.cpp +++ b/thorlcr/activities/keyedjoin/thkeyedjoinslave-legacy.cpp @@ -1206,10 +1206,14 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem unsigned candidateCount; __int64 lastSeeks, lastScans; IConstPointerArrayOf translators; + CThorContextLogger contextLogger; - inline void noteStats(unsigned seeks, unsigned scans) + inline void updateJhTreeStats() { CriticalBlock b(owner.statCrit); + const CRuntimeStatisticCollection & stats = contextLogger.queryStats(); + unsigned __int64 seeks = stats.getStatisticValue(StNumIndexSeeks); + unsigned __int64 scans = stats.getStatisticValue(StNumIndexScans); owner.statsArr[AS_Seeks] += seeks-lastSeeks; owner.statsArr[AS_Scans] += scans-lastScans; lastSeeks = seeks; @@ -1251,7 +1255,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem CKeyLocalLookup(CKeyedJoinSlave &_owner, const RtlRecord &_keyRecInfo) : owner(_owner), keyRecInfo(_keyRecInfo), indexReadFieldsRow(_owner.indexInputAllocator) { - tlkManager.setown(owner.keyHasTlk ? createLocalKeyManager(keyRecInfo, nullptr, nullptr, owner.helper->hasNewSegmentMonitors(), false) : nullptr); + tlkManager.setown(owner.keyHasTlk ? createLocalKeyManager(keyRecInfo, nullptr, &contextLogger, owner.helper->hasNewSegmentMonitors(), false) : nullptr); reset(); owner.getKeyIndexes(partKeyIndexes); RecordTranslationMode translationMode = getTranslationMode(owner); @@ -1271,7 +1275,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem } else { - partManager.setown(createLocalKeyManager(owner.helper->queryIndexRecordSize()->queryRecordAccessor(true), nullptr, nullptr, owner.helper->hasNewSegmentMonitors(), false)); + partManager.setown(createLocalKeyManager(owner.helper->queryIndexRecordSize()->queryRecordAccessor(true), nullptr, &contextLogger, owner.helper->hasNewSegmentMonitors(), false)); getLayoutTranslations(translators, owner.helper->getFileName(), owner.indexParts, translationMode, expectedFormatCrc, owner.helper->queryIndexRecordSize(), projectedFormatCrc, projectedFormat); } } @@ -1359,8 +1363,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem ++candidateCount; if (candidateCount > owner.atMost) break; - IContextLogger * ctxLogger = nullptr; - KLBlobProviderAdapter adapter(partManager, ctxLogger); + KLBlobProviderAdapter adapter(partManager, & contextLogger); byte const * keyRow = partManager->queryKeyBuffer(); size_t fposOffset = partManager->queryRowSize() - sizeof(offset_t); offset_t fpos = rtlReadBigUInt8(keyRow + fposOffset); @@ -1389,7 +1392,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem #ifdef TRACE_JOINGROUPS ::ActPrintLog(&owner, "CJoinGroup [result] %x from %d", currentJG, __LINE__); #endif - noteStats(partManager->querySeeks(), partManager->queryScans()); + updateJhTreeStats(); size32_t lorsz = owner.keyLookupAllocator->queryOutputMeta()->getRecordSize(lookupRow.getSelf()); // must be easier way return lookupRow.finalizeRowClear(lorsz); @@ -1401,7 +1404,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem } } partManager->releaseSegmentMonitors(); - noteStats(partManager->querySeeks(), partManager->queryScans()); + updateJhTreeStats(); currentPart = nullptr; if (owner.localKey) { // merger done @@ -1469,7 +1472,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem ::ActPrintLog(&owner, "CJoinGroup [end marker returned] %x from %d", currentJG, __LINE__); #endif if (currentPart) - noteStats(partManager->querySeeks(), partManager->queryScans()); + updateJhTreeStats(); currentJG = NULL; size32_t lorsz = owner.keyLookupAllocator->queryOutputMeta()->getRecordSize(lookupRow.getSelf()); // must be easier way @@ -1513,7 +1516,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem throw; } if (currentPart) - noteStats(partManager->querySeeks(), partManager->queryScans()); + updateJhTreeStats(); return NULL; } diff --git a/thorlcr/activities/keyedjoin/thkeyedjoinslave.cpp b/thorlcr/activities/keyedjoin/thkeyedjoinslave.cpp index 728ecfc6cad..b0f3b15c070 100644 --- a/thorlcr/activities/keyedjoin/thkeyedjoinslave.cpp +++ b/thorlcr/activities/keyedjoin/thkeyedjoinslave.cpp @@ -1283,16 +1283,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem } void processRows(CThorExpandingRowArray &processing, unsigned partNo, IKeyManager *keyManager) { - unsigned __int64 startSeeks = keyManager->querySeeks(); - unsigned __int64 startScans = keyManager->queryScans(); - unsigned __int64 startWildSeeks = keyManager->queryWildSeeks(); - auto onScopeExitFunc = [&]() - { - activity.inactiveStats.sumStatistic(StNumIndexSeeks, keyManager->querySeeks()-startSeeks); - activity.inactiveStats.sumStatistic(StNumIndexScans, keyManager->queryScans()-startScans); - activity.inactiveStats.sumStatistic(StNumIndexWildSeeks, keyManager->queryWildSeeks()-startWildSeeks); - }; - COnScopeExit scoped(onScopeExitFunc); + CStatsScopedThresholdDeltaUpdater scoped(activity.statsUpdater); for (unsigned r=0; rsetAtMostLimitHit(); // also clears existing rows break; } - IContextLogger * ctxLogger = nullptr; - KLBlobProviderAdapter adapter(keyManager, ctxLogger); + KLBlobProviderAdapter adapter(keyManager, &activity.contextLogger); byte const * keyRow = keyManager->queryKeyBuffer(); size_t fposOffset = keyManager->queryRowSize() - sizeof(offset_t); offset_t fpos = rtlReadBigUInt8(keyRow + fposOffset); @@ -2000,7 +1990,6 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem activity.inactiveStats.mergeStatistic(StNumDiskSeeks, diskSeeks); }; COnScopeExit scoped(onScopeExitFunc); - unsigned numRows = processing.ordinality(); // read back results and feed in to appropriate join groups. @@ -2233,6 +2222,8 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem CPartDescriptorArray allIndexParts; std::vector localIndexParts, localFetchPartMap; IArrayOf tlkKeyIndexes; + CThorContextLogger contextLogger; + CStatsCtxLoggerDeltaUpdater statsUpdater; Owned joinFieldsAllocator; OwnedConstThorRow defaultRight; unsigned joinFlags = 0; @@ -2428,7 +2419,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem { IKeyIndex *tlkKeyIndex = &tlkKeyIndexes.item(i); const RtlRecord &keyRecInfo = helper->queryIndexRecordSize()->queryRecordAccessor(true); - Owned tlkManager = createLocalKeyManager(keyRecInfo, nullptr, nullptr, helper->hasNewSegmentMonitors(), false); + Owned tlkManager = createLocalKeyManager(keyRecInfo, nullptr, &contextLogger, helper->hasNewSegmentMonitors(), false); tlkManager->setKey(tlkKeyIndex); keyManagers.append(*tlkManager.getClear()); } @@ -2446,7 +2437,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem if (delayed) { - Owned lazyIFileIO = queryThor().queryFileCache().lookupIFileIO(*this, indexName, filePart, nullptr, indexReadStatistics); + Owned lazyIFileIO = queryThor().queryFileCache().lookupIFileIO(*this, indexName, filePart, nullptr); Owned delayedFile = createDelayedFile(lazyIFileIO); return createKeyIndex(filename, crc, *delayedFile, (unsigned) -1, false); } @@ -2456,14 +2447,14 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem * But that's okay, because we are only here on demand. * The underlying IFileIO can later be closed by fhe file caching mechanism. */ - Owned lazyIFileIO = queryThor().queryFileCache().lookupIFileIO(*this, indexName, filePart, nullptr, indexReadStatistics); + Owned lazyIFileIO = queryThor().queryFileCache().lookupIFileIO(*this, indexName, filePart, nullptr); return createKeyIndex(filename, crc, *lazyIFileIO, (unsigned) -1, false); } } IKeyManager *createPartKeyManager(unsigned partNo, unsigned copy) { Owned keyIndex = createPartKeyIndex(partNo, copy, false); - return createLocalKeyManager(helper->queryIndexRecordSize()->queryRecordAccessor(true), keyIndex, nullptr, helper->hasNewSegmentMonitors(), false); + return createLocalKeyManager(helper->queryIndexRecordSize()->queryRecordAccessor(true), keyIndex, &contextLogger, helper->hasNewSegmentMonitors(), false); } const void *preparePendingLookupRow(void *row, size32_t maxSz, const void *lhsRow, size32_t keySz) { @@ -2625,6 +2616,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem } void stopReadAhead() { + CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); keyLookupHandlers.flush(); keyLookupHandlers.join(); // wait for pending handling, there may be more fetch items as a result fetchLookupHandlers.flushTS(); @@ -2946,7 +2938,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem public: IMPLEMENT_IINTERFACE_USING(PARENT); - CKeyedJoinSlave(CGraphElementBase *_container) : PARENT(_container, keyedJoinActivityStatistics), readAheadThread(*this) + CKeyedJoinSlave(CGraphElementBase *_container) : PARENT(_container, keyedJoinActivityStatistics), readAheadThread(*this), statsUpdater(jhtreeCacheStatistics, *this, contextLogger) { helper = static_cast (queryHelper()); reInit = 0 != (helper->getFetchFlags() & (FFvarfilename|FFdynamicfilename)) || (helper->getJoinFlags() & JFvarindexfilename); @@ -3376,6 +3368,7 @@ class CKeyedJoinSlave : public CSlaveActivity, implements IJoinProcessor, implem } virtual void stop() override { + CStatsScopedDeltaUpdater scoped(statsUpdater); endOfInput = true; // signals to readAhead which is reading input, that is should stop asap. // could be blocked in readAhead(), because CJoinGroup's are no longer being processed diff --git a/thorlcr/graph/thgraph.cpp b/thorlcr/graph/thgraph.cpp index d4ab358a940..7c98f60872f 100644 --- a/thorlcr/graph/thgraph.cpp +++ b/thorlcr/graph/thgraph.cpp @@ -2659,93 +2659,6 @@ class CGraphExecutor : implements IGraphExecutor, public CInterface } }; -//// -// IContextLogger -class CThorContextLogger : implements IContextLogger, public CSimpleInterface -{ - unsigned traceLevel = 1; - LogTrace logTrace; -public: - IMPLEMENT_IINTERFACE_USING(CSimpleInterface); - - CThorContextLogger() - { - if (globals->hasProp("@httpGlobalIdHeader")) - setHttpIdHeaderNames(globals->queryProp("@httpGlobalIdHeader"), globals->queryProp("@httpCallerIdHeader")); - } - virtual void CTXLOG(const char *format, ...) const override __attribute__((format(printf,2,3))) - { - va_list args; - va_start(args, format); - CTXLOGva(MCdebugProgress, thorJob, NoLogMsgCode, format, args); - va_end(args); - } - - virtual void CTXLOGva(const LogMsgCategory & cat, const LogMsgJobInfo & job, LogMsgCode code, const char *format, va_list args) const override __attribute__((format(printf,5,0))) - { - VALOG(cat, job, code, format, args); - } - virtual void logOperatorExceptionVA(IException *E, const char *file, unsigned line, const char *format, va_list args) const __attribute__((format(printf,5,0))) - { - StringBuffer ss; - ss.append("ERROR"); - if (E) - ss.append(": ").append(E->errorCode()); - if (file) - ss.appendf(": %s(%d) ", file, line); - if (E) - E->errorMessage(ss.append(": ")); - if (format) - ss.append(": ").valist_appendf(format, args); - LOG(MCoperatorProgress, thorJob, "%s", ss.str()); - } - virtual void noteStatistic(StatisticKind kind, unsigned __int64 value) const - { - } - virtual void setStatistic(StatisticKind kind, unsigned __int64 value) const - { - } - virtual void mergeStats(const CRuntimeStatisticCollection &from) const - { - } - virtual unsigned queryTraceLevel() const - { - return traceLevel; - } - virtual void setGlobalId(const char *id, SocketEndpoint &ep, unsigned pid) override - { - logTrace.setGlobalId(id); - } - virtual void setCallerId(const char *id) override - { - logTrace.setCallerId(id); - } - virtual const char *queryGlobalId() const override - { - return logTrace.queryGlobalId(); - } - virtual const char *queryLocalId() const override - { - return logTrace.queryLocalId(); - } - virtual const char *queryCallerId() const override - { - return logTrace.queryCallerId(); - } - virtual void setHttpIdHeaderNames(const char *global, const char *caller) override - { - logTrace.setHttpIdHeaderNames(global, caller); - } - virtual const char *queryGlobalIdHttpHeaderName() const override - { - return logTrace.queryGlobalIdHTTPHeaderName(); - } - virtual const char *queryCallerIdHttpHeaderName() const override - { - return logTrace.queryCallerIdHTTPHeaderName(); - } -}; - //// CJobBase::CJobBase(ILoadedDllEntry *_querySo, const char *_graphName) : querySo(_querySo), graphName(_graphName) diff --git a/thorlcr/graph/thgraph.hpp b/thorlcr/graph/thgraph.hpp index 41a97f70c21..8dccc1881d2 100644 --- a/thorlcr/graph/thgraph.hpp +++ b/thorlcr/graph/thgraph.hpp @@ -1222,7 +1222,7 @@ interface IExpander; interface IThorFileCache : extends IInterface { virtual bool remove(const char *filename, unsigned crc) = 0; - virtual IFileIO *lookupIFileIO(CActivityBase &activity, const char *logicalFilenae, IPartDescriptor &partDesc, IExpander *expander=nullptr, const StatisticsMapping & _statMapping=diskLocalStatistics) = 0; + virtual IFileIO *lookupIFileIO(CActivityBase &activity, const char *logicalFilenae, IPartDescriptor &partDesc, IExpander *expander=nullptr, const StatisticsMapping & _statMapping=diskLocalStatistics, size32_t blockedFileIOSize=0) = 0; }; class graph_decl CThorResourceBase : implements IThorResource, public CInterface diff --git a/thorlcr/graph/thgraphmaster.cpp b/thorlcr/graph/thgraphmaster.cpp index 4c6c1343f02..7e5a597c2bb 100644 --- a/thorlcr/graph/thgraphmaster.cpp +++ b/thorlcr/graph/thgraphmaster.cpp @@ -1735,20 +1735,21 @@ void CJobMaster::sendQuery() const char *soName = queryDllEntry().queryName(); PROGLOG("Query dll: %s", soName); tmp.append(soName); -#ifndef _CONTAINERIZED - tmp.append(sendSo); - if (sendSo) - { - CTimeMon atimer; - OwnedIFile iFile = createIFile(soName); - OwnedIFileIO iFileIO = iFile->open(IFOread); - size32_t sz = (size32_t)iFileIO->size(); - tmp.append(sz); - read(iFileIO, 0, sz, tmp); - PROGLOG("Loading query for serialization to slaves took %d ms", atimer.elapsed()); - } - queryJobManager().addCachedSo(soName); -#endif + if (getExpertOptBool("saveQueryDlls")) + { + tmp.append(sendSo); + if (sendSo) + { + CTimeMon atimer; + OwnedIFile iFile = createIFile(soName); + OwnedIFileIO iFileIO = iFile->open(IFOread); + size32_t sz = (size32_t)iFileIO->size(); + tmp.append(sz); + read(iFileIO, 0, sz, tmp); + PROGLOG("Loading query for serialization to slaves took %d ms", atimer.elapsed()); + } + queryJobManager().addCachedSo(soName); + } Owned deps = createPTree(queryXGMML()->queryName()); Owned edgeIter = queryXGMML()->getElements("edge"); // JCSMORE trim to those actually needed ForEach (*edgeIter) diff --git a/thorlcr/graph/thgraphmaster.hpp b/thorlcr/graph/thgraphmaster.hpp index 6e8726f1d6a..b49b6190bee 100644 --- a/thorlcr/graph/thgraphmaster.hpp +++ b/thorlcr/graph/thgraphmaster.hpp @@ -48,9 +48,7 @@ interface IJobManager : extends IInterface virtual void setWuid(const char *wuid, const char *cluster=NULL) = 0; virtual IDeMonServer *queryDeMonServer() = 0; virtual void fatal(IException *e) = 0; -#ifndef _CONTAINERIZED virtual void addCachedSo(const char *name) = 0; -#endif virtual void updateWorkUnitLog(IWorkUnit &workunit) = 0; }; diff --git a/thorlcr/graph/thgraphslave.cpp b/thorlcr/graph/thgraphslave.cpp index 199cf75faea..8e01d18d024 100644 --- a/thorlcr/graph/thgraphslave.cpp +++ b/thorlcr/graph/thgraphslave.cpp @@ -583,6 +583,7 @@ void CSlaveActivity::serializeStats(MemoryBuffer &mb) // JCS->GH - should these be serialized as cycles, and a different mapping used on master? serializedStats.setStatistic(StTimeLocalExecute, (unsigned __int64)cycle_to_nanosec(queryLocalCycles())); + serializedStats.setStatistic(StTimeTotalExecute, (unsigned __int64)cycle_to_nanosec(queryTotalCycles())); serializedStats.setStatistic(StTimeBlocked, (unsigned __int64)cycle_to_nanosec(queryBlockedCycles())); serializedStats.serialize(mb); ForEachItemIn(i, outputs) @@ -2034,6 +2035,7 @@ class CLazyFileIO : public CInterfaceOf Owned iFileIO; // real IFileIO CActivityBase *activity = nullptr; StringAttr filename, id; + size32_t blockedFileIOSize = 0; IFileIO *getFileIO() { @@ -2046,9 +2048,15 @@ class CLazyFileIO : public CInterfaceOf return iFileIO.getClear(); } public: - CLazyFileIO(CFileCache &_cache, const char *_filename, const char *_id, IActivityReplicatedFile *_repFile, bool _compressed, IExpander *_expander, const StatisticsMapping & _statMapping=diskLocalStatistics) - : cache(_cache), filename(_filename), id(_id), repFile(_repFile), compressed(_compressed), expander(_expander), fileStats(_statMapping) + CLazyFileIO(CFileCache &_cache, const char *_filename, const char *_id, IActivityReplicatedFile *_repFile, bool _compressed, IExpander *_expander, const StatisticsMapping & _statMapping, size32_t _blockedFileIOSize) + : cache(_cache), filename(_filename), id(_id), repFile(_repFile), compressed(_compressed), expander(_expander), + fileStats(_statMapping), blockedFileIOSize(_blockedFileIOSize) { + if (blockedFileIOSize) // enabled + { + if (compressed || expander) + blockedFileIOSize = 0; // ignore. Compressed files use their own blocked format, but may want to revisit this area. + } } virtual void beforeDispose() override; void setActivity(CActivityBase *_activity) @@ -2180,7 +2188,7 @@ class CFileCache : public CSimpleInterfaceOf CriticalBlock b(crit); return _remove(id); } - virtual IFileIO *lookupIFileIO(CActivityBase &activity, const char *logicalFilename, IPartDescriptor &partDesc, IExpander *expander, const StatisticsMapping & _statMapping) override + virtual IFileIO *lookupIFileIO(CActivityBase &activity, const char *logicalFilename, IPartDescriptor &partDesc, IExpander *expander, const StatisticsMapping & _statMapping, size32_t blockedFileIOSize) override { StringBuffer filename; RemoteFilename rfn; @@ -2190,13 +2198,15 @@ class CFileCache : public CSimpleInterfaceOf unsigned crc = partDesc.queryProperties().getPropInt("@fileCrc"); if (crc) id.append(crc); + if (blockedFileIOSize) + id.append('_').append(blockedFileIOSize); CriticalBlock b(crit); CLazyFileIO * file = files.find(id); if (!file || !file->isAliveAndLink()) { Owned repFile = createEnsurePrimaryPartFile(logicalFilename, &partDesc); bool compressed = partDesc.queryOwner().isCompressed(); - file = new CLazyFileIO(*this, filename, id, repFile.getClear(), compressed, expander, _statMapping); + file = new CLazyFileIO(*this, filename, id, repFile.getClear(), compressed, expander, _statMapping, blockedFileIOSize); files.replace(* file); // NB: files does not own 'file', CLazyFileIO will remove itself from cache on destruction /* NB: there will be 1 CLazyFileIO per physical file part name @@ -2236,7 +2246,11 @@ IFileIO *CLazyFileIO::getOpenFileIO(CActivityBase &activity) else if (compressed) iFileIO.setown(createCompressedFileReader(iFile)); else + { iFileIO.setown(iFile->open(IFOread)); + if (blockedFileIOSize) + iFileIO.setown(createBlockedIO(iFileIO.getClear(), blockedFileIOSize)); + } if (!iFileIO.get()) throw MakeThorException(0, "CLazyFileIO: failed to open: %s", filename.get()); } diff --git a/thorlcr/graph/thgraphslave.hpp b/thorlcr/graph/thgraphslave.hpp index 5f677de2f09..9f6d557f975 100644 --- a/thorlcr/graph/thgraphslave.hpp +++ b/thorlcr/graph/thgraphslave.hpp @@ -297,8 +297,88 @@ class graphslave_decl CSlaveActivity : public CActivityBase, public CEdgeProgres virtual void setInputStream(unsigned index, CThorInput &input, bool consumerOrdered) override; virtual void processDone(MemoryBuffer &mb) override { }; virtual void reset() override; + +friend class CStatsCtxLoggerDeltaUpdater; +}; + +class CStatsDeltaUpdater +{ +protected: + CRuntimeStatisticCollection startStats; + cycle_t timeThreshold = 0; + cycle_t lastUpdate = 0; + +public: + inline CStatsDeltaUpdater(const StatisticsMapping &mapping, unsigned timeThresholdSecs=0) : startStats(mapping) + { + constexpr unsigned defaultTimeThresholdSecs = 10; + if (0 == timeThresholdSecs) + timeThresholdSecs = defaultTimeThresholdSecs; + timeThreshold = timeThresholdSecs * queryOneSecCycles(); + } + inline void timedUpdate() + { + dbgassertex(timeThreshold); + cycle_t now = get_cycles_now(); + if ((now - lastUpdate) > timeThreshold) // NB: rollover is not problematic + { + update(); + lastUpdate = now; + } + } + virtual void resetStart() = 0; + virtual void update() = 0; // NB: must perform reset of start also +}; + +class CStatsCtxLoggerDeltaUpdater : public CStatsDeltaUpdater +{ +protected: + CSlaveActivity &activity; + CThorContextLogger &ctxLogger; + +public: + inline CStatsCtxLoggerDeltaUpdater(const StatisticsMapping &mapping, CSlaveActivity &_activity, CThorContextLogger &_ctxLogger, unsigned timeThresholdSecs=0) + : CStatsDeltaUpdater(mapping, timeThresholdSecs), activity(_activity), ctxLogger(_ctxLogger) + { + resetStart(); + } + virtual void resetStart() override + { + CriticalBlock b(activity.statsCs); // probably unneeded, not likely to be contended at this point + startStats.set(ctxLogger.queryStats()); + } + virtual void update() override + { + CriticalBlock b(activity.statsCs); + ctxLogger.updateStatsDeltaTo(activity.inactiveStats, startStats); // NB: updates startStats to new values + } +}; + +class CStatsScopedDeltaUpdater +{ + CStatsDeltaUpdater &updater; +public: + inline CStatsScopedDeltaUpdater(CStatsDeltaUpdater &_updater) : updater(_updater) + { + } + inline ~CStatsScopedDeltaUpdater() + { + updater.update(); + } }; +class CStatsScopedThresholdDeltaUpdater +{ + CStatsDeltaUpdater &updater; +public: + inline CStatsScopedThresholdDeltaUpdater(CStatsDeltaUpdater &_updater) : updater(_updater) + { + } + inline ~CStatsScopedThresholdDeltaUpdater() + { + updater.timedUpdate(); + } +}; class graphslave_decl CSlaveLateStartActivity : public CSlaveActivity { diff --git a/thorlcr/master/thgraphmanager.cpp b/thorlcr/master/thgraphmanager.cpp index bcd41fba585..9d52f3bbd1d 100644 --- a/thorlcr/master/thgraphmanager.cpp +++ b/thorlcr/master/thgraphmanager.cpp @@ -60,9 +60,7 @@ class CJobManager : public CSimpleInterface, implements IJobManager, implements Owned conversation; StringAttr queueName; CriticalSection replyCrit, jobCrit; -#ifndef _CONTAINERIZED CFifoFileCache querySoCache; -#endif Owned jobq; ICopyArrayOf jobs; Owned exitException; @@ -255,9 +253,7 @@ class CJobManager : public CSimpleInterface, implements IJobManager, implements virtual void setWuid(const char *wuid, const char *cluster=NULL); virtual IDeMonServer *queryDeMonServer() { return demonServer; } virtual void fatal(IException *e); -#ifndef _CONTAINERIZED virtual void addCachedSo(const char *name); -#endif virtual void updateWorkUnitLog(IWorkUnit &workunit); }; @@ -954,49 +950,50 @@ bool CJobManager::executeGraph(IConstWorkUnit &workunit, const char *graphName, Owned query = workunit.getQuery(); SCMStringBuffer soName; query->getQueryDllName(soName); -#ifndef _CONTAINERIZED unsigned version = query->getQueryDllCrc(); -#endif query.clear(); bool sendSo = false; Owned querySo; StringBuffer soPath; -#ifdef _CONTAINERIZED - PROGLOG("Loading query name: %s", soName.str()); - querySo.setown(queryDllServer().loadDll(soName.str(), DllLocationLocal)); - soPath.append(querySo->queryName()); -#else - globals->getProp("@query_so_dir", soPath); - StringBuffer compoundPath; - compoundPath.append(soPath.str()); - soPath.append(soName.str()); - getCompoundQueryName(compoundPath, soName.str(), version); - if (querySoCache.isAvailable(compoundPath.str())) - PROGLOG("Using existing local dll: %s", compoundPath.str()); // It is assumed if present here then _still_ present on slaves from previous send. + if (!getExpertOptBool("saveQueryDlls")) + { + PROGLOG("Loading query name: %s", soName.str()); + querySo.setown(queryDllServer().loadDll(soName.str(), DllLocationLocal)); + soPath.append(querySo->queryName()); + } else { - MemoryBuffer file; - queryDllServer().getDll(soName.str(), file); - PROGLOG("Saving dll: %s", compoundPath.str()); - OwnedIFile out = createIFile(compoundPath.str()); - try - { - out->setCreateFlags(S_IRWXU); - OwnedIFileIO io = out->open(IFOcreate); - io->write(0, file.length(), file.toByteArray()); - io.clear(); - } - catch (IException *e) + globals->getProp("@query_so_dir", soPath); + StringBuffer compoundPath; + compoundPath.append(soPath.str()); + soPath.append(soName.str()); + getCompoundQueryName(compoundPath, soName.str(), version); + if (querySoCache.isAvailable(compoundPath.str())) + PROGLOG("Using existing local dll: %s", compoundPath.str()); // It is assumed if present here then _still_ present on slaves from previous send. + else { - FLLOG(MCexception(e), thorJob, e, "Failed to write query dll - ignoring!"); - e->Release(); + MemoryBuffer file; + queryDllServer().getDll(soName.str(), file); + PROGLOG("Saving dll: %s", compoundPath.str()); + OwnedIFile out = createIFile(compoundPath.str()); + try + { + out->setCreateFlags(S_IRWXU); + OwnedIFileIO io = out->open(IFOcreate); + io->write(0, file.length(), file.toByteArray()); + io.clear(); + } + catch (IException *e) + { + FLLOG(MCexception(e), thorJob, e, "Failed to write query dll - ignoring!"); + e->Release(); + } + sendSo = getExpertOptBool("dllsToSlaves", true); } - sendSo = getExpertOptBool("dllsToSlaves", true); + querySo.setown(createDllEntry(compoundPath.str(), false, NULL, false)); + soPath.swapWith(compoundPath); } - querySo.setown(createDllEntry(compoundPath.str(), false, NULL, false)); - soPath.swapWith(compoundPath); -#endif SCMStringBuffer eclstr; StringAttr user(workunit.queryUser()); @@ -1101,7 +1098,7 @@ bool CJobManager::executeGraph(IConstWorkUnit &workunit, const char *graphName, cost_type cost = money2cost_type(calculateThorCost(nanoToMilli(graphTimeNs), numberOfMachines)); if (cost) wu->setStatistic(queryStatisticsComponentType(), queryStatisticsComponentName(), SSTgraph, graphScope, StCostExecute, NULL, cost, 1, 0, StatsMergeReplace); - + updateSpillSize(wu, graphScope, SSTgraph); removeJob(*job); } catch (IException *e) @@ -1125,12 +1122,10 @@ bool CJobManager::executeGraph(IConstWorkUnit &workunit, const char *graphName, return allDone; } -#ifndef _CONTAINERIZED void CJobManager::addCachedSo(const char *name) { querySoCache.add(name); } -#endif static int exitCode = -1; void setExitCode(int code) { exitCode = code; } @@ -1321,7 +1316,7 @@ void thorMain(ILogMsgHandler *logHandler, const char *wuid, const char *graphNam else { unsigned lingerPeriod = globals->getPropInt("@lingerPeriod", DEFAULT_LINGER_SECS)*1000; - bool multiJobLinger = globals->getPropBool("@multiJobLinger"); + bool multiJobLinger = globals->getPropBool("@multiJobLinger", true); VStringBuffer multiJobLingerQueueName("%s_lingerqueue", globals->queryProp("@name")); StringBuffer instance("thorinstance_"); diff --git a/thorlcr/master/thmastermain.cpp b/thorlcr/master/thmastermain.cpp index d8dcad46ac6..72eb2a961f7 100644 --- a/thorlcr/master/thmastermain.cpp +++ b/thorlcr/master/thmastermain.cpp @@ -360,6 +360,7 @@ class CRegistryServer : public CSimpleInterface msg.append(THOR_VERSION_MAJOR).append(THOR_VERSION_MINOR); processGroup->serialize(msg); globals->serialize(msg); + getGlobalConfigSP()->serialize(msg); msg.append(masterSlaveMpTag); msg.append(kjServiceMpTag); if (!queryNodeComm().send(msg, RANK_ALL_OTHER, MPTAG_THORREGISTRATION, MP_ASYNC_SEND)) @@ -660,7 +661,6 @@ int main( int argc, const char *argv[] ) #endif const char *thorname = NULL; StringBuffer nodeGroup, logUrl; - unsigned slavesPerNode = globals->getPropInt("@slavesPerNode", 1); // for bare-metal only unsigned channelsPerWorker; if (globals->hasProp("@channelsPerWorker")) channelsPerWorker = globals->getPropInt("@channelsPerWorker", 1); @@ -802,16 +802,20 @@ int main( int argc, const char *argv[] ) #endif } - if (!isContainerized()) + // if worker and/or manager memory is unspecified, set default percentages + // that will be used in conjunction with discovered memory. + + // @localThor mode - 25% is used for manager and 50% is used for workers + bool localThor = !isContainerized() && globals->getPropBool("@localThor"); + if (!workerMemory->hasProp("@maxMemPercentage")) + workerMemory->setPropReal("@maxMemPercentage", localThor ? 50.0 : defaultPctSysMemForRoxie); + if (0 == mmemSize) { - // @localThor mode - 25% is used for manager and 50% is used for workers - // overrides recommended max percentage preferences if present - if (globals->getPropBool("@localThor") && (0 == mmemSize)) - { - managerMemory->setProp("@maxMemPercentage", "25.0"); - workerMemory->setPropReal("@maxMemPercentage", 50.0 / slavesPerNode); - } + if (!managerMemory->hasProp("@maxMemPercentage")) + managerMemory->setPropReal("@maxMemPercentage", localThor ? 25.0 : defaultPctSysMemForRoxie); } + // NB: if (cloud - numWorkersPerPod) or (bare-metal - slavesPerNode) is specified + // the percentage will be split based on numWorkersPerPod or slavesPerNode (see if (numWorkersPerPodOrNode > 1) code below) } workerMemory->setPropInt("@total", gmemSize); @@ -831,13 +835,7 @@ int main( int argc, const char *argv[] ) } else mmemSize = gmemSize; // default to same as slaves - if (!globals->hasProp("@globalMemorySize")) - { - if (!managerMemory->hasProp("@maxMemPercentage")) - managerMemory->setPropReal("@maxMemPercentage", defaultPctSysMemForRoxie); - } } - managerMemory->setPropInt("@total", mmemSize); applyResourcedCPUAffinity(globals->queryPropTree("managerResources")); @@ -876,9 +874,18 @@ int main( int argc, const char *argv[] ) setBaseDirectory(overrideBaseDirectory, false); if (overrideReplicateDirectory&&*overrideBaseDirectory) setBaseDirectory(overrideReplicateDirectory, true); - + } + if (!hasExpertOpt("saveQueryDlls")) + { + // propagate default setting. + // Bare-metal - save dlls to local disk cache by default + // Containerized - load dlls directly + setExpertOpt("saveQueryDlls", boolToStr(!isContainerized())); + } + if (getExpertOptBool("saveQueryDlls")) + { StringBuffer soDir, soPath; - if (getConfigurationDirectory(globals->queryPropTree("Directories"),"query","thor",globals->queryProp("@name"),soDir)) + if (!isContainerized() && getConfigurationDirectory(globals->queryPropTree("Directories"),"query","thor",globals->queryProp("@name"),soDir)) globals->setProp("@query_so_dir", soDir.str()); else if (!globals->getProp("@query_so_dir", soDir)) { globals->setProp("@query_so_dir", DEFAULT_QUERY_SO_DIR); @@ -896,7 +903,11 @@ int main( int argc, const char *argv[] ) globals->setProp("@query_so_dir", soPath.str()); recursiveCreateDirectory(soPath.str()); } - + else + { + // meaningless if not saving dlls + globals->setPropBool("@dllsToSlaves", false); + } StringBuffer tempDirStr; if (!getConfigurationDirectory(globals->queryPropTree("Directories"),"spill","thor",globals->queryProp("@name"), tempDirStr)) { @@ -959,6 +970,7 @@ int main( int argc, const char *argv[] ) kjServiceMpTag = allocateClusterMPTag(); unsigned numWorkers = 0; + unsigned numWorkersPerPodOrNode = 1; // pod in cloud, node in bare-metal bool doWorkerRegistration = false; if (isContainerized()) { @@ -993,12 +1005,11 @@ int main( int argc, const char *argv[] ) throw makeStringException(0, "Number of workers per pod must be > 0 (numWorkersPerPod)"); if ((numWorkers % numWorkersPerPod) != 0) throw makeStringExceptionV(0, "numWorkersPerPod must be a factor of numWorkers. (numWorkers=%u, numWorkersPerPod=%u)", numWorkers, numWorkersPerPod); - if (!workerMemory->hasProp("@maxMemPercentage")) - workerMemory->setPropReal("@maxMemPercentage", defaultPctSysMemForRoxie / numWorkersPerPod); Owned workunit = &wuRead->lock(); addTimeStamp(workunit, wfid, graphName, StWhenK8sStarted); } + numWorkersPerPodOrNode = numWorkersPerPod; cloudJobName.appendf("%s-%s", workunit, graphName); @@ -1022,12 +1033,17 @@ int main( int argc, const char *argv[] ) unsigned localThorPortInc = globals->getPropInt("@localThorPortInc", DEFAULT_SLAVEPORTINC); unsigned slaveBasePort = globals->getPropInt("@slaveport", DEFAULT_THORSLAVEPORT); Owned rawGroup = getClusterNodeGroup(thorname, "ThorCluster"); - setClusterGroup(queryMyNode(), rawGroup, slavesPerNode, channelsPerWorker, slaveBasePort, localThorPortInc); + numWorkersPerPodOrNode = globals->getPropInt("@slavesPerNode", 1); + setClusterGroup(queryMyNode(), rawGroup, numWorkersPerPodOrNode, channelsPerWorker, slaveBasePort, localThorPortInc); numWorkers = queryNodeClusterWidth(); doWorkerRegistration = true; - - if (!workerMemory->hasProp("@maxMemPercentage")) - workerMemory->setPropReal("@maxMemPercentage", defaultPctSysMemForRoxie / slavesPerNode); + } + if (numWorkersPerPodOrNode > 1) + { + // NB: maxMemPercentage only be set when memory amounts have not explicily been defined (e.g. globalMemorySize) + double pct = workerMemory->getPropReal("@maxMemPercentage"); + if (pct) + workerMemory->setPropReal("@maxMemPercentage", pct / numWorkersPerPodOrNode); } if (doWorkerRegistration && registry->connect(numWorkers)) diff --git a/thorlcr/msort/tsorts.cpp b/thorlcr/msort/tsorts.cpp index 09164448530..41d8b798002 100644 --- a/thorlcr/msort/tsorts.cpp +++ b/thorlcr/msort/tsorts.cpp @@ -33,6 +33,7 @@ #include "tsortm.hpp" #include "tsortmp.hpp" #include "thbuf.hpp" +#include "thbufdef.hpp" #include "thgraph.hpp" #ifdef _DEBUG @@ -198,6 +199,7 @@ class CWriteIntercept : public CSimpleInterface dataFile.setown(createIFile(tempname.str())); unsigned rwFlags = DEFAULT_RWFLAGS; + size32_t compBlkSz = 0; if (activity.getOptBool(THOROPT_COMPRESS_SPILLS, true) && activity.getOptBool(THOROPT_COMPRESS_SORTOVERFLOW, true)) { StringBuffer compType; @@ -209,11 +211,12 @@ class CWriteIntercept : public CSimpleInterface rwFlags |= rw_compress; rwFlags |= spillCompInfo; compressedOverflowFile = true; - ActPrintLog(&activity, "Creating compressed merged overflow file"); + compBlkSz = activity.getOptUInt(THOROPT_SORT_COMPBLKSZ, DEFAULT_SORT_COMPBLKSZ); + ActPrintLog(&activity, "Creating compressed merged overflow file (block size = %u)", compBlkSz); } } - Owned output = createRowWriter(dataFile, rowIf, rwFlags); + Owned output = createRowWriter(dataFile, rowIf, rwFlags, nullptr, compBlkSz); bool overflowed = false; ActPrintLog(&activity, "Local Overflow Merge start"); diff --git a/thorlcr/slave/slavmain.cpp b/thorlcr/slave/slavmain.cpp index ecd2a7f46d8..e1be240e844 100644 --- a/thorlcr/slave/slavmain.cpp +++ b/thorlcr/slave/slavmain.cpp @@ -115,7 +115,7 @@ class CKJService : public CSimpleInterfaceOf, implements IThreaded, unsigned maxCachedKJManagers = defaultMaxCachedKJManagers; unsigned maxCachedFetchContexts = defaultMaxCachedFetchContexts; unsigned keyLookupMaxProcessThreads = defaultKeyLookupMaxProcessThreads; - + CThorContextLogger contextLogger; class CLookupKey { unsigned hashv = 0; @@ -403,9 +403,9 @@ class CKJService : public CSimpleInterfaceOf, implements IThreaded, IEngineRowAllocator *queryFetchOutputAllocator() const { return activityCtx->queryFetchOutputAllocator(); } IOutputRowSerializer *queryFetchOutputSerializer() const { return activityCtx->queryFetchOutputSerializer(); } - IKeyManager *createKeyManager() + IKeyManager *createKeyManager(IContextLogger *ctxLogger) { - return createLocalKeyManager(queryHelper()->queryIndexRecordSize()->queryRecordAccessor(true), keyIndex, nullptr, queryHelper()->hasNewSegmentMonitors(), false); + return createLocalKeyManager(queryHelper()->queryIndexRecordSize()->queryRecordAccessor(true), keyIndex, ctxLogger, queryHelper()->hasNewSegmentMonitors(), false); } inline IHThorKeyedJoinArg *queryHelper() const { return activityCtx->queryHelper(); } }; @@ -451,7 +451,7 @@ class CKJService : public CSimpleInterfaceOf, implements IThreaded, CKMContainer(CKJService &_service, CKeyLookupContext *_ctx) : service(_service), ctx(_ctx) { - keyManager.setown(ctx->createKeyManager()); + keyManager.setown(ctx->createKeyManager(&service.contextLogger)); StringBuffer tracing; const IDynamicTransform *translator = ctx->queryTranslator(ctx->queryKey().getTracing(tracing)); if (translator) @@ -474,6 +474,7 @@ class CKJService : public CSimpleInterfaceOf, implements IThreaded, helper->onStart((const byte *)parentCtxMb.toByteArray(), startCtxMb.length() ? &startCtxMb : nullptr); } inline IHThorKeyedJoinArg *queryHelper() const { return helper; } + inline CKJService & queryService() const { return service; } }; template class CKeyedCacheEntry : public CInterface @@ -756,9 +757,10 @@ class CKJService : public CSimpleInterfaceOf, implements IThreaded, unsigned rowCount = getRowCount(); unsigned rowNum = 0; unsigned rowStart = 0; - unsigned __int64 startSeeks = kmc->queryKeyManager()->querySeeks(); - unsigned __int64 startScans = kmc->queryKeyManager()->queryScans(); - unsigned __int64 startWildSeeks = kmc->queryKeyManager()->queryWildSeeks(); + const CRuntimeStatisticCollection & stats = kmc->queryService().contextLogger.queryStats(); + unsigned __int64 startSeeks = stats.getStatisticValue(StNumIndexSeeks); + unsigned __int64 startScans = stats.getStatisticValue(StNumIndexScans); + unsigned __int64 startWildSeeks = stats.getStatisticValue(StNumIndexWildSeeks); while (!abortSoon) { OwnedConstThorRow row = getRowClear(rowNum++); @@ -768,9 +770,9 @@ class CKJService : public CSimpleInterfaceOf, implements IThreaded, if (last || (replyMb.length() >= DEFAULT_KEYLOOKUP_MAXREPLYSZ)) { countMarker.write(rowNum-rowStart); - replyMb.append(kmc->queryKeyManager()->querySeeks()-startSeeks); - replyMb.append(kmc->queryKeyManager()->queryScans()-startScans); - replyMb.append(kmc->queryKeyManager()->queryWildSeeks()-startWildSeeks); + replyMb.append(stats.getStatisticValue(StNumIndexSeeks)-startSeeks); + replyMb.append(stats.getStatisticValue(StNumIndexScans)-startScans); + replyMb.append(stats.getStatisticValue(StNumIndexWildSeeks)-startWildSeeks); if (activityCtx->useMessageCompression()) { fastLZCompressToBuffer(replyMsg, tmpMB.length(), tmpMB.toByteArray()); @@ -1597,9 +1599,7 @@ class CJobListener : public CSimpleInterface bool &stopped; CriticalSection crit; OwningStringSuperHashTableOf jobs; -#ifndef _CONTAINERIZED CFifoFileCache querySoCache; // used to mirror master cache -#endif IArrayOf mpServers; unsigned channelsPerSlave; @@ -1746,18 +1746,19 @@ class CJobListener : public CSimpleInterface verifyThreads.append(*new CVerifyThread(*this, c)); } -#ifndef _CONTAINERIZED - StringBuffer soPath; - globals->getProp("@query_so_dir", soPath); - StringBuffer soPattern("*."); + if (getExpertOptBool("dllsToSlaves", true)) + { + StringBuffer soPath; + globals->getProp("@query_so_dir", soPath); + StringBuffer soPattern("*."); #ifdef _WIN32 - soPattern.append("dll"); + soPattern.append("dll"); #else - soPattern.append("so"); + soPattern.append("so"); #endif - if (getExpertOptBool("dllsToSlaves", true)) querySoCache.init(soPath.str(), DEFAULT_QUERYSO_LIMIT, soPattern); -#endif + } + Owned watchdog; if (globals->getPropBool("@watchdogEnabled")) watchdog.setown(createProgressHandler(globals->getPropBool("@useUDPWatchdog"))); @@ -1788,87 +1789,90 @@ class CJobListener : public CSimpleInterface msg.read(graphName); Owned querySo; -#ifdef _CONTAINERIZED - StringAttr soName; - msg.read(soName); - querySo.setown(createDllEntry(soName.str(), false, NULL, false)); - soPath.append(soName); -#else - StringBuffer soPathTail; - StringAttr remoteSoPath; - msg.read(remoteSoPath); - bool sendSo; - msg.read(sendSo); - - RemoteFilename rfn; - SocketEndpoint masterEp = queryMyNode()->endpoint(); - masterEp.port = 0; - rfn.setPath(masterEp, remoteSoPath); - rfn.getTail(soPathTail); - if (sendSo) + if (!getExpertOptBool("saveQueryDlls")) { - size32_t size; - msg.read(size); - globals->getProp("@query_so_dir", soPath); - if (soPath.length()) - addPathSepChar(soPath); - soPath.append(soPathTail); - const byte *queryPtr = msg.readDirect(size); - Owned iFile = createIFile(soPath.str()); - try - { - iFile->setCreateFlags(S_IRWXU); - Owned iFileIO = iFile->open(IFOwrite); - iFileIO->write(0, size, queryPtr); - } - catch (IException *e) - { - IException *e2 = ThorWrapException(e, "Failed to save dll: %s", soPath.str()); - e->Release(); - throw e2; - } - assertex(getExpertOptBool("dllsToSlaves", true)); - querySoCache.add(soPath.str()); + StringAttr soName; + msg.read(soName); + querySo.setown(createDllEntry(soName.str(), false, NULL, false)); + soPath.append(soName); } else { - if (!rfn.isLocal()) - { - StringBuffer _remoteSoPath; - rfn.getRemotePath(_remoteSoPath); - remoteSoPath.set(_remoteSoPath); - } - if (getExpertOptBool("dllsToSlaves", true)) + StringBuffer soPathTail; + StringAttr remoteSoPath; + msg.read(remoteSoPath); + bool sendSo; + msg.read(sendSo); + + RemoteFilename rfn; + SocketEndpoint masterEp = queryMyNode()->endpoint(); + masterEp.port = 0; + rfn.setPath(masterEp, remoteSoPath); + rfn.getTail(soPathTail); + if (sendSo) { + size32_t size; + msg.read(size); globals->getProp("@query_so_dir", soPath); if (soPath.length()) addPathSepChar(soPath); soPath.append(soPathTail); - OwnedIFile iFile = createIFile(soPath.str()); - if (!iFile->exists()) + const byte *queryPtr = msg.readDirect(size); + Owned iFile = createIFile(soPath.str()); + try { - IWARNLOG("Slave cached query dll missing: %s, will attempt to fetch from master", soPath.str()); - copyFile(soPath.str(), remoteSoPath); + iFile->setCreateFlags(S_IRWXU); + Owned iFileIO = iFile->open(IFOwrite); + iFileIO->write(0, size, queryPtr); } + catch (IException *e) + { + IException *e2 = ThorWrapException(e, "Failed to save dll: %s", soPath.str()); + e->Release(); + throw e2; + } + assertex(getExpertOptBool("dllsToSlaves", true)); querySoCache.add(soPath.str()); } else - soPath.append(remoteSoPath); - } -#ifdef __linux__ - // only relevant if dllsToSlaves=false and query_so_dir was fully qualified remote path (e.g. ///path/file - rfn.setRemotePath(soPath.str()); - StringBuffer tempSo; - if (!rfn.isLocal()) - { - IWARNLOG("Cannot load shared object directly from remote path, creating temporary local copy: %s", soPath.str()); - GetTempFilePath(tempSo,"so"); - copyFile(tempSo.str(), soPath.str()); - soPath.clear().append(tempSo.str()); + { + if (!rfn.isLocal()) + { + StringBuffer _remoteSoPath; + rfn.getRemotePath(_remoteSoPath); + remoteSoPath.set(_remoteSoPath); + } + if (getExpertOptBool("dllsToSlaves", true)) + { + globals->getProp("@query_so_dir", soPath); + if (soPath.length()) + addPathSepChar(soPath); + soPath.append(soPathTail); + OwnedIFile iFile = createIFile(soPath.str()); + if (!iFile->exists()) + { + IWARNLOG("Slave cached query dll missing: %s, will attempt to fetch from master", soPath.str()); + copyFile(soPath.str(), remoteSoPath); + } + querySoCache.add(soPath.str()); + } + else + soPath.append(remoteSoPath); + } + #ifdef __linux__ + // only relevant if dllsToSlaves=false and query_so_dir was fully qualified remote path (e.g. ///path/file + rfn.setRemotePath(soPath.str()); + StringBuffer tempSo; + if (!rfn.isLocal()) + { + IWARNLOG("Cannot load shared object directly from remote path, creating temporary local copy: %s", soPath.str()); + GetTempFilePath(tempSo,"so"); + copyFile(tempSo.str(), soPath.str()); + soPath.clear().append(tempSo.str()); + } + #endif + querySo.setown(createDllEntry(soPath.str(), false, NULL, false)); } -#endif - querySo.setown(createDllEntry(soPath.str(), false, NULL, false)); -#endif Owned workUnitInfo = createPTree(msg); StringBuffer user; diff --git a/thorlcr/slave/thslavemain.cpp b/thorlcr/slave/thslavemain.cpp index 45306b2492b..9fa8e75dc05 100644 --- a/thorlcr/slave/thslavemain.cpp +++ b/thorlcr/slave/thslavemain.cpp @@ -113,24 +113,22 @@ static bool RegisterSelf(SocketEndpoint &masterEp) msg.read(vmajor); msg.read(vminor); Owned processGroup = deserializeIGroup(msg); + Owned masterComponentConfig = createPTree(msg); + Owned masterGlobalConfig = createPTree(msg); mySlaveNum = (unsigned)processGroup->rank(queryMyNode()); assertex(NotFound != mySlaveNum); mySlaveNum++; // 1 based; unsigned configSlaveNum = globals->getPropInt("@slavenum", NotFound); - Owned masterComponentConfig = createPTree(msg); if (NotFound == configSlaveNum) globals->setPropInt("@slavenum", mySlaveNum); else assertex(mySlaveNum == configSlaveNum); - Owned mergedGlobals = createPTreeFromIPT(globals); - mergeConfiguration(*mergedGlobals, *masterComponentConfig); - replaceComponentConfig(mergedGlobals); - globals.set(mergedGlobals); - // The slave doesn't load configuration directly (it has been serialized from the master) - // manually invoke any installed config CB's - executeConfigUpdaterCallbacks(); + Owned mergedComponentConfig = createPTreeFromIPT(globals); + mergeConfiguration(*mergedComponentConfig, *masterComponentConfig); + replaceComponentConfig(mergedComponentConfig, masterGlobalConfig); + globals.set(mergedComponentConfig); #ifdef _DEBUG unsigned holdSlave = globals->getPropInt("@holdSlave", NotFound); if (mySlaveNum == holdSlave) @@ -471,8 +469,9 @@ int main( int argc, const char *argv[] ) setBaseDirectory(overrideBaseDirectory, false); if (!isEmptyString(overrideReplicateDirectory)) setBaseDirectory(overrideReplicateDirectory, true); +#endif - if (getConfigurationDirectory(globals->queryPropTree("Directories"),"query","thor",globals->queryProp("@name"),str.clear())) + if (!isContainerized() && getConfigurationDirectory(globals->queryPropTree("Directories"),"query","thor",globals->queryProp("@name"),str.clear())) globals->setProp("@query_so_dir", str.str()); else globals->getProp("@query_so_dir", str.clear()); @@ -492,7 +491,6 @@ int main( int argc, const char *argv[] ) PROGLOG("Using querySo directory: %s", str.str()); recursiveCreateDirectory(str.str()); } -#endif useMemoryMappedRead(globals->getPropBool("@useMemoryMappedRead")); diff --git a/thorlcr/thorutil/thbufdef.hpp b/thorlcr/thorutil/thbufdef.hpp index a5291a30364..bb61498962c 100644 --- a/thorlcr/thorutil/thbufdef.hpp +++ b/thorlcr/thorutil/thbufdef.hpp @@ -54,6 +54,7 @@ #define EXCESSIVE_PARALLEL_THRESHHOLD (0x500000) // 5MB #define LOOP_SMART_BUFFER_SIZE (0x100000*12) // 12MB #define LOCALRESULT_BUFFER_SIZE (0x100000*10) // 10MB +#define DEFAULT_SORT_COMPBLKSZ (0x10000) // 64K #define DEFAULT_KEYNODECACHEMB 10 #define DEFAULT_KEYLEAFCACHEMB 50 diff --git a/thorlcr/thorutil/thmem.cpp b/thorlcr/thorutil/thmem.cpp index c47244c2d65..5647704fdc6 100644 --- a/thorlcr/thorutil/thmem.cpp +++ b/thorlcr/thorutil/thmem.cpp @@ -61,8 +61,6 @@ static CriticalSection MTcritsect; // held when blocked static Owned MTthresholdnotify; static bool MTlocked = false; -#define DEFAULT_SORT_COMPBLKSZ 0x10000 // 64K - void checkMultiThorMemoryThreshold(bool inc) { if (MTthresholdnotify.get()) { diff --git a/thorlcr/thorutil/thormisc.cpp b/thorlcr/thorutil/thormisc.cpp index 1f51362aba0..1885c7029e4 100644 --- a/thorlcr/thorutil/thormisc.cpp +++ b/thorlcr/thorutil/thormisc.cpp @@ -74,22 +74,28 @@ static Owned ClusterMPAllocator; // stat. mappings shared between master and slave activities const StatisticsMapping spillStatistics({StTimeSpillElapsed, StTimeSortElapsed, StNumSpills, StSizeSpillFile}); -const StatisticsMapping basicActivityStatistics({StTimeLocalExecute, StTimeBlocked}); +const StatisticsMapping jhtreeCacheStatistics({ StNumIndexSeeks, StNumIndexScans, StNumPostFiltered, StNumIndexWildSeeks, + StNumNodeCacheAdds, StNumLeafCacheAdds, StNumBlobCacheAdds, StNumNodeCacheHits, StNumLeafCacheHits, StNumBlobCacheHits, StCycleNodeLoadCycles, StCycleLeafLoadCycles, + StCycleBlobLoadCycles, StCycleNodeReadCycles, StCycleLeafReadCycles, StCycleBlobReadCycles, StNumNodeDiskFetches, StNumLeafDiskFetches, StNumBlobDiskFetches, + StCycleNodeFetchCycles, StCycleLeafFetchCycles, StCycleBlobFetchCycles, + StCycleIndexCacheBlockedCycles, StNumIndexMerges, StNumIndexMergeCompares, + StNumIndexSkips, StNumIndexNullSkips}); + +const StatisticsMapping basicActivityStatistics({StTimeTotalExecute, StTimeLocalExecute, StTimeBlocked}); const StatisticsMapping groupActivityStatistics({StNumGroups, StNumGroupMax}, basicActivityStatistics); const StatisticsMapping hashJoinActivityStatistics({StNumLeftRows, StNumRightRows}, basicActivityStatistics); -const StatisticsMapping indexReadStatistics({StNumIndexSeeks, StNumIndexScans, StNumPostFiltered, StNumIndexWildSeeks}); -const StatisticsMapping indexReadActivityStatistics({StNumRowsProcessed}, diskReadRemoteStatistics, basicActivityStatistics, indexReadStatistics); +const StatisticsMapping indexReadActivityStatistics({StNumRowsProcessed}, diskReadRemoteStatistics, basicActivityStatistics, jhtreeCacheStatistics); const StatisticsMapping indexWriteActivityStatistics({StPerReplicated, StNumLeafCacheAdds, StNumNodeCacheAdds, StNumBlobCacheAdds }, basicActivityStatistics, diskWriteRemoteStatistics); -const StatisticsMapping keyedJoinActivityStatistics({ StNumIndexSeeks, StNumIndexScans, StNumIndexAccepted, StNumPostFiltered, StNumPreFiltered, StNumDiskSeeks, StNumDiskAccepted, StNumDiskRejected, StNumIndexWildSeeks}, basicActivityStatistics); +const StatisticsMapping keyedJoinActivityStatistics({ StNumIndexAccepted, StNumPreFiltered, StNumDiskSeeks, StNumDiskAccepted, StNumDiskRejected}, basicActivityStatistics, jhtreeCacheStatistics); const StatisticsMapping loopActivityStatistics({StNumIterations}, basicActivityStatistics); const StatisticsMapping lookupJoinActivityStatistics({StNumSmartJoinSlavesDegradedToStd, StNumSmartJoinDegradedToLocal}, basicActivityStatistics); const StatisticsMapping joinActivityStatistics({StNumLeftRows, StNumRightRows}, basicActivityStatistics, spillStatistics); -const StatisticsMapping diskReadActivityStatistics({StNumDiskRowsRead}, basicActivityStatistics, diskReadRemoteStatistics); +const StatisticsMapping diskReadActivityStatistics({StNumDiskRowsRead, }, basicActivityStatistics, diskReadRemoteStatistics); const StatisticsMapping diskWriteActivityStatistics({StPerReplicated}, basicActivityStatistics, diskWriteRemoteStatistics); const StatisticsMapping sortActivityStatistics({}, basicActivityStatistics, spillStatistics); const StatisticsMapping graphStatistics({StNumExecutions, StSizeSpillFile, StSizeGraphSpill, StTimeUser, StTimeSystem, StNumContextSwitches, StSizeMemory, StSizePeakMemory, StSizeRowMemory, StSizePeakRowMemory}, basicActivityStatistics); const StatisticsMapping diskReadPartStatistics({StNumDiskRowsRead}, diskReadRemoteStatistics); - +const StatisticsMapping indexDistribActivityStatistics({}, basicActivityStatistics, jhtreeCacheStatistics); MODULE_INIT(INIT_PRIORITY_STANDARD) { @@ -1365,8 +1371,9 @@ class CRowServer : public CSimpleInterface, implements IThreaded, implements IRo #ifdef TRACE_GLOBAL_GROUP ActPrintLog(activity, "%s", __func__); #endif - running = false; - comm.cancel(RANK_ALL, mpTag); + bool wanted = true; + if (running.compare_exchange_strong(wanted, false)) + comm.cancel(RANK_ALL, mpTag); } }; @@ -1658,6 +1665,13 @@ StringBuffer &getExpertOptPath(const char *opt, StringBuffer &out) #endif } +bool hasExpertOpt(const char *opt) +{ + StringBuffer xpath; + getExpertOptPath(opt, xpath); + return globals->hasProp(xpath); +} + bool getExpertOptBool(const char *opt, bool dft) { StringBuffer xpath; @@ -1679,3 +1693,13 @@ StringBuffer &getExpertOptString(const char *opt, StringBuffer &out) globals->getProp(xpath, out); return out; } + +void setExpertOpt(const char *opt, const char *value) +{ + StringBuffer xpath; + getExpertOptPath(nullptr, xpath); + if (!globals->hasProp(xpath)) + globals->setPropTree(xpath); + getExpertOptPath(opt, xpath.clear()); + globals->setProp(xpath, value); +} diff --git a/thorlcr/thorutil/thormisc.hpp b/thorlcr/thorutil/thormisc.hpp index 2339ce34990..5390d900892 100644 --- a/thorlcr/thorutil/thormisc.hpp +++ b/thorlcr/thorutil/thormisc.hpp @@ -34,6 +34,7 @@ #include "thexception.hpp" #include "thorcommon.hpp" #include "thor.hpp" +#include "jstats.h" #ifdef GRAPH_EXPORTS #define graph_decl DECL_EXPORT @@ -132,6 +133,7 @@ enum RegistryCode:unsigned { rc_register, rc_deregister }; //statistics gathered by the different activities extern graph_decl const StatisticsMapping spillStatistics; +extern graph_decl const StatisticsMapping jhtreeCacheStatistics; extern graph_decl const StatisticsMapping basicActivityStatistics; extern graph_decl const StatisticsMapping groupActivityStatistics; extern graph_decl const StatisticsMapping hashJoinActivityStatistics; @@ -147,7 +149,7 @@ extern graph_decl const StatisticsMapping diskWriteActivityStatistics; extern graph_decl const StatisticsMapping sortActivityStatistics; extern graph_decl const StatisticsMapping graphStatistics; -extern graph_decl const StatisticsMapping indexReadStatistics; +extern graph_decl const StatisticsMapping indexDistribActivityStatistics; class BooleanOnOff { @@ -358,7 +360,7 @@ class graph_decl CStreamFileOwner : public CSimpleInterfaceOf #define DEFAULT_THORSLAVEPORT 20100 #define DEFAULT_SLAVEPORTINC 20 #define DEFAULT_QUERYSO_LIMIT 10 -#define DEFAULT_LINGER_SECS 10 +#define DEFAULT_LINGER_SECS 60 class graph_decl CFifoFileCache : public CSimpleInterface { @@ -601,11 +603,114 @@ inline void readUnderlyingType(MemoryBuffer &mb, T &v) constexpr unsigned thorDetailedLogLevel = 200; constexpr LogMsgCategory MCthorDetailedDebugInfo(MCdebugInfo(thorDetailedLogLevel)); +extern graph_decl bool hasExpertOpt(const char *opt); extern graph_decl StringBuffer &getExpertOptPath(const char *opt, StringBuffer &out); extern graph_decl bool getExpertOptBool(const char *opt, bool dft=false); extern graph_decl __int64 getExpertOptInt64(const char *opt, __int64 dft=0); extern graph_decl StringBuffer &getExpertOptString(const char *opt, StringBuffer &out); +extern graph_decl void setExpertOpt(const char *opt, const char *value); +//// +// IContextLogger +class CThorContextLogger : public CSimpleInterfaceOf +{ + unsigned traceLevel = 1; + LogTrace logTrace; + mutable CRuntimeStatisticCollection stats; + +public: + CThorContextLogger() : stats(jhtreeCacheStatistics) + { + if (globals->hasProp("@httpGlobalIdHeader")) + setHttpIdHeaderNames(globals->queryProp("@httpGlobalIdHeader"), globals->queryProp("@httpCallerIdHeader")); + } + virtual void CTXLOG(const char *format, ...) const override __attribute__((format(printf,2,3))) + { + va_list args; + va_start(args, format); + CTXLOGva(MCdebugProgress, thorJob, NoLogMsgCode, format, args); + va_end(args); + } + + virtual void CTXLOGva(const LogMsgCategory & cat, const LogMsgJobInfo & job, LogMsgCode code, const char *format, va_list args) const override __attribute__((format(printf,5,0))) + { + VALOG(cat, job, code, format, args); + } + virtual void logOperatorExceptionVA(IException *E, const char *file, unsigned line, const char *format, va_list args) const __attribute__((format(printf,5,0))) + { + StringBuffer ss; + ss.append("ERROR"); + if (E) + ss.append(": ").append(E->errorCode()); + if (file) + ss.appendf(": %s(%d) ", file, line); + if (E) + E->errorMessage(ss.append(": ")); + if (format) + ss.append(": ").valist_appendf(format, args); + LOG(MCoperatorProgress, thorJob, "%s", ss.str()); + } + virtual void noteStatistic(StatisticKind kind, unsigned __int64 value) const override + { + stats.addStatisticAtomic(kind, value); + } + virtual void setStatistic(StatisticKind kind, unsigned __int64 value) const override + { + stats.setStatistic(kind, value); + } + virtual void mergeStats(const CRuntimeStatisticCollection &from) const override + { + stats.merge(from); + } + virtual unsigned queryTraceLevel() const override + { + return traceLevel; + } + virtual void setGlobalId(const char *id, SocketEndpoint &ep, unsigned pid) override + { + logTrace.setGlobalId(id); + } + virtual void setCallerId(const char *id) override + { + logTrace.setCallerId(id); + } + virtual const char *queryGlobalId() const override + { + return logTrace.queryGlobalId(); + } + virtual const char *queryLocalId() const override + { + return logTrace.queryLocalId(); + } + virtual const char *queryCallerId() const override + { + return logTrace.queryCallerId(); + } + virtual void setHttpIdHeaderNames(const char *global, const char *caller) override + { + logTrace.setHttpIdHeaderNames(global, caller); + } + virtual const char *queryGlobalIdHttpHeaderName() const override + { + return logTrace.queryGlobalIdHTTPHeaderName(); + } + virtual const char *queryCallerIdHttpHeaderName() const override + { + return logTrace.queryCallerIdHTTPHeaderName(); + } + virtual const CRuntimeStatisticCollection &queryStats() const override + { + return stats; + } + void updateStatsDeltaTo(CRuntimeStatisticCollection &to, CRuntimeStatisticCollection &previous) + { + previous.updateDelta(to, stats); + } + void reset() + { + stats.reset(); + } +}; #endif diff --git a/tools/hidl/hidlcomp.cpp b/tools/hidl/hidlcomp.cpp index 18435d24ee0..eab25cd41f2 100644 --- a/tools/hidl/hidlcomp.cpp +++ b/tools/hidl/hidlcomp.cpp @@ -4995,6 +4995,9 @@ void EspServInfo::write_esp_binding_ipp() //method ==> processRequest outs("\tvirtual int processRequest(IRpcMessage* rpc_call, IRpcMessage* rpc_response);\n"); + // method ===> getXmlFilename + outs("\tint getXmlFilename(StringBuffer &filename);\n"); + //method ==> getXsdDefinition outs("\tint getXsdDefinition(IEspContext &context, CHttpRequest* request, StringBuffer &content, const char *service, const char *method, bool mda);\n"); @@ -5049,7 +5052,7 @@ void EspServInfo::write_esp_binding_ipp() outs("\tvirtual int onGetInstantQuery(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method);\n"); //Method ==> getDefaultClientVersion - outs("\tbool getDefaultClientVersion(double &ver);\n"); + outs("\tvirtual bool getDefaultClientVersion(double &ver);\n"); //Method ==> xslTransform if (needsXslt) @@ -5116,7 +5119,7 @@ void EspServInfo::write_esp_binding_ipp() outs("};\n\n"); } -void EspServInfo::write_esp_binding() +void EspServInfo::write_esp_binding(const char *packagename) { EspMethodInfo *mthi=NULL; int useMethodName = getMetaInt("use_method_name", 0); @@ -5360,12 +5363,21 @@ void EspServInfo::write_esp_binding() outs("\treturn -1;\n"); outs("}\n"); - //method ==> getXsdDefinition + + //method ==> getXmlFilename for xsd and wsdl transformations + outf("\nint C%sSoapBinding::getXmlFilename(StringBuffer &filename)\n", name_); + outs("{\n"); + outf("\tfilename.append(\"%s.xml\");\n", packagename); + outs("\treturn 1;\n"); + outs("}\n"); + + //method ==> getXsdDefinition packagename is the base ecm filename outf("\nint C%sSoapBinding::getXsdDefinition(IEspContext &context, CHttpRequest* request, StringBuffer &content, const char *service, const char *method, bool mda)\n", name_); outs("{\n"); outs("\tBoolHash added;\n"); + // version if (hasVersion) { @@ -5374,6 +5386,9 @@ void EspServInfo::write_esp_binding() } outs("\tDBGLOG(\"Client version: %g\", context.getClientVersion());\n"); + // getXSDDefinition(StringBuffer &content, const char *packageName, const char *serviceName, double version, const char *method); +// outf( "getXSDDefinition(content, \"%s\", \"%s\", context.getClientVersion(), method);\n\n", packagename, name_); + indentReset(1); outf(1, "bool fullservice = (!Utils::strcasecmp(service, \"%s\"));\n", name_); indentOuts("bool allMethods = (method==NULL || *method==0);\n"); @@ -6626,7 +6641,7 @@ void HIDLcompiler::write_esp() EspServInfo *si; for (si=servs;si;si=si->next) { - si->write_esp_binding(); + si->write_esp_binding(packagename); outs("\n\n"); si->write_esp_service(); outs("\n\n"); diff --git a/tools/hidl/hidlcomp.h b/tools/hidl/hidlcomp.h index f2841bbd0a4..a78c530223a 100644 --- a/tools/hidl/hidlcomp.h +++ b/tools/hidl/hidlcomp.h @@ -1232,7 +1232,7 @@ class EspServInfo void write_client_interface(); void write_factory_impl(); - void write_esp_binding(); + void write_esp_binding(const char *); void write_esp_binding_ipp(); void write_esp_service_ipp(); void write_esp_binding_ng_ipp(EspMessageInfo *); diff --git a/vcpkg b/vcpkg index 03bc9186d1d..6804a2e531e 160000 --- a/vcpkg +++ b/vcpkg @@ -1 +1 @@ -Subproject commit 03bc9186d1d44fb11ddbbbe54e0ae39006ef25d5 +Subproject commit 6804a2e531ed61121bbf0ef4d550e63c69e88d2c diff --git a/vcpkg.json.in b/vcpkg.json.in index 38719ceaa36..a1159fbe737 100644 --- a/vcpkg.json.in +++ b/vcpkg.json.in @@ -28,11 +28,11 @@ "name": "azure-storage-files-shares-cpp", "platform": "@VCPKG_AZURE@" }, + "boost-property-tree", { "name": "boost-regex", "platform": "@VCPKG_BOOST_REGEX@" }, - "boost-property-tree", { "name": "cpp-driver", "platform": "@VCPKG_CASSANDRAEMBED@" @@ -132,7 +132,7 @@ }, { "name": "numactl", - "platform": "@VCPKG_NUMA@ & !windows & !osx" + "platform": "!windows & !osx" }, { "name": "openblas",