diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 02c97851e..41c56b0cf 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -40,7 +40,7 @@ jobs: ./scripts/generate_datafed.sh - name: Install documentation build dependencies run: | - sudo ./scripts/install_docs_dependencies.sh + sudo ./external/DataFedDependencies/scripts/install_docs_dependencies.sh - name: Build documentation run: | cmake -S. -B build -DBUILD_AUTHZ=OFF -DBUILD_CORE_SERVER=OFF -DBUILD_COMMON=OFF -DBUILD_DOCS=ON -DBUILD_FOXX=OFF -DBUILD_REPO_SERVER=OFF -DBUILD_PYTHON_CLIENT=ON -DBUILD_TESTS=OFF -DBUILD_WEB_SERVER=OFF -DENABLE_UNIT_TESTS=OFF diff --git a/.github/workflows/javascript-format.yml b/.github/workflows/javascript-format.yml index fdcfb33bb..510ba20d8 100644 --- a/.github/workflows/javascript-format.yml +++ b/.github/workflows/javascript-format.yml @@ -8,26 +8,48 @@ jobs: # Step 1: Checkout the repository - name: Checkout Code uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + ref: ${{ github.head_ref || github.ref }} # Step 2: Set up Node.js environment - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: "18" # Specify your Node.js version + node-version: "18" - # Step 3: Install Prettier and ESLint globally + # Step 3: Install Prettier - name: Install Prettier - run: | - npm install -g prettier + run: npm install -g prettier # Step 4: Run Prettier to format code - - name: Run prettier + - name: Format JavaScript files run: | + echo "Auto-formatting JavaScript files..." prettier "**/*.js" --write - git diff - git reset --hard - prettier --check "**/*.js" + echo "Formatting complete" + + # Step 5: Check for changes and commit if needed + - name: Commit changes + run: | + # Get the original commit author info + AUTHOR_NAME=$(git log -1 --pretty=format:'%an') + AUTHOR_EMAIL=$(git log -1 --pretty=format:'%ae') + + # Use original author for the formatting commit + git config --local user.email "$AUTHOR_EMAIL" + git config --local user.name "$AUTHOR_NAME" - # Step 5: Report status - - name: Complete - run: echo "Formatting completed successfully!" + # Check if there are any changes + if [[ -n $(git status -s) ]]; then + echo "Formatting changes detected, creating commit..." + echo "Committing as: $AUTHOR_NAME <$AUTHOR_EMAIL>" + git add -A + git commit -m "chore: Auto-format JavaScript files with Prettier" + + # Push changes + git push + echo "Changes committed and pushed" + else + echo "No formatting changes needed" + fi diff --git a/.github/workflows/shell-format.yml b/.github/workflows/shell-format.yml new file mode 100644 index 000000000..a39a5984e --- /dev/null +++ b/.github/workflows/shell-format.yml @@ -0,0 +1,57 @@ +name: Shell Format Check + +on: + push: + paths: + - "**.sh" + pull_request: + paths: + - "**.sh" + +jobs: + shfmt: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + ref: ${{ github.head_ref || github.ref }} + + - name: Install shfmt + run: | + sudo apt-get update + sudo apt-get install -y shfmt + + - name: Format shell scripts + run: | + echo "Auto-formatting shell scripts..." + # Run in check mode: if reformatting would be needed, it will fail + # Use indentation space of 2 spaces + shfmt -i 2 -w . + echo "Formatting complete" + + - name: Commit changes + run: | + # Get the original commit author info + AUTHOR_NAME=$(git log -1 --pretty=format:'%an') + AUTHOR_EMAIL=$(git log -1 --pretty=format:'%ae') + + # Use original author for the formatting commit + git config --local user.email "$AUTHOR_EMAIL" + git config --local user.name "$AUTHOR_NAME" + + # Check if there are any changes + if [[ -n $(git status -s) ]]; then + echo "Formatting changes detected, creating commit..." + echo "Committing as: $AUTHOR_NAME <$AUTHOR_EMAIL>" + git add -A + git commit -m "chore: Auto-format shell scripts with shfmt" + + # Push changes + git push + echo "Changes committed and pushed" + else + echo "No formatting changes needed" + fi diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 477bec238..b59915ac1 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -2,31 +2,24 @@ name: Unit-Testing on: push jobs: unit-test: - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest + container: debian:bookworm if: ${{ always() }} steps: - - uses: actions/checkout@v4 - - name: Update ubuntu - run: sudo apt-get update - - name: Install software-properties-common - run: sudo apt install software-properties-common - - name: Add deadsnakes apt repository - run: sudo add-apt-repository ppa:deadsnakes/ppa - - name: Update to bring in deadsnakes packages - run: sudo apt update - - name: Install Python 3.9 - run: sudo apt install python3.9 python3.9-dev python3.9-venv python3.9-distutils - - name: Ensure pip is installed - run: python3.9 -m ensurepip + - uses: actions/checkout@v2 + - name: Update debian + run: apt update - name: Install dependencies + with: + submodules: recursive + fetch-depth: 0 run: | ./scripts/generate_datafed.sh - sudo ./scripts/install_core_dependencies.sh - ./scripts/generate_datafed.sh + ./external/DataFedDependencies/scripts/install_core_dependencies.sh - name: Build run: | - cmake -S. -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WEB_SERVER=OFF - cmake --build build -j4 + /opt/datafed/dependencies/bin/cmake -S. -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WEB_SERVER=OFF + /opt/datafed/dependencies/bin/cmake --build build -j4 - name: Run tests run: | - cmake --build build --target test + /opt/datafed/dependencies/bin/cmake --build build --target test diff --git a/.github/workflows/yaml-format.yml b/.github/workflows/yaml-format.yml new file mode 100644 index 000000000..f4a0f8de7 --- /dev/null +++ b/.github/workflows/yaml-format.yml @@ -0,0 +1,33 @@ +name: Yaml Formatter +on: push +jobs: + format-yaml: + runs-on: ubuntu-latest + + steps: + # Step 1: Checkout the repository + - name: Checkout Code + uses: actions/checkout@v4 + + # Step 2: Set up Node.js environment + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "18" # Specify your Node.js version + + # Step 3: Install Prettier and ESLint globally + - name: Install Prettier + run: | + npm install -g prettier + + # Step 4: Run Prettier to format code + - name: Run prettier + run: | + prettier "**/*.yml" --write + git diff + git reset --hard + prettier --check "**/*.yml" + + # Step 5: Report status + - name: Complete + run: echo "Formatting completed successfully!" diff --git a/.gitignore b/.gitignore index 420465cb9..a349adb76 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,8 @@ web/package-lock.json web/static/datafed-core-key.pub *.swp *.swo +*.tar.gz +*.tgz # for web tests tests/end-to-end/web-UI/node_modules/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1aa273329..d3c5504aa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,6 +18,7 @@ include: - local: .gitlab/stage_pipeline_serialize.yml - local: .gitlab/infrastructure.yml - local: .gitlab/stage_clear_cache.yml + - local: .gitlab/stage_base_image_check.yml - local: .gitlab/stage_build_base.yml - local: .gitlab/stage_provision_client.yml - local: .gitlab/stage_image_check.yml @@ -32,6 +33,7 @@ stages: - trigger-infrastructure - signal - clear-docker-cache + - base-image-check - build-base - provision-client - image-check @@ -56,3 +58,4 @@ variables: REGISTRY: "camden.ornl.gov" DATAFED_DEPENDENCIES_INSTALL_PATH: "/shared/install" DOCKER_TLS_CERTDIR: "" # Required for running docker in docker + GIT_SUBMODULE_STRATEGY: recursive diff --git a/.gitlab/build/build_core_image.yml b/.gitlab/build/build_core_image.yml index 1e162cabc..fcc80d443 100644 --- a/.gitlab/build/build_core_image.yml +++ b/.gitlab/build/build_core_image.yml @@ -1,53 +1,53 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-core: - extends: .docker_build_script - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "core" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "core/docker/Dockerfile" - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - ci-datafed-core - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - core/**/* - - common/**/* - - CMakeLists.txt - - cmake/**/* - - .gitlab-ci.yml - when: on_success + extends: .docker_build_script + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "core" + GIT_STRATEGY: clone + DOCKER_FILE_PATH: "core/docker/Dockerfile" + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - ci-datafed-core + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - core/**/* + - common/**/* + - CMakeLists.txt + - cmake/**/* + - .gitlab-ci.yml + when: on_success retag-image: - extends: .docker_retag_image - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "core" - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - core/**/* - - common/**/* - - CMakeLists.txt - - cmake/**/* - - .gitlab-ci.yml - when: never - - when: on_success + extends: .docker_retag_image + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "core" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - core/**/* + - common/**/* + - CMakeLists.txt + - cmake/**/* + - .gitlab-ci.yml + when: never + - when: on_success diff --git a/.gitlab/build/build_foxx_image.yml b/.gitlab/build/build_foxx_image.yml index 1b20c4041..c0b45a74a 100644 --- a/.gitlab/build/build_foxx_image.yml +++ b/.gitlab/build/build_foxx_image.yml @@ -1,54 +1,56 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-foxx: - extends: .docker_build_script - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "foxx" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "docker/Dockerfile.foxx" - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - cmake/**/* - - core/database/**/* - - core/CMakeLists.txt - - common/proto/**/* - - .gitlab-ci.yml - - CMakeLists.txt - when: on_success + extends: .docker_build_script + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "foxx" + GIT_STRATEGY: clone + DOCKER_FILE_PATH: "docker/Dockerfile.foxx" + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - cmake/**/* + - core/database/**/* + - core/CMakeLists.txt + - common/proto/**/* + - .gitlab-ci.yml + - .gitlab/**/* + - CMakeLists.txt + when: on_success retag-image: - extends: .docker_retag_image - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "foxx" - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - cmake/**/* - - core/database/**/* - - core/CMakeLists.txt - - common/proto/**/* - - .gitlab-ci.yml - - CMakeLists.txt - when: never - - when: on_success + extends: .docker_retag_image + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "foxx" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - cmake/**/* + - core/database/**/* + - core/CMakeLists.txt + - common/proto/**/* + - .gitlab-ci.yml + - .gitlab/**/* + - CMakeLists.txt + when: never + - when: on_success diff --git a/.gitlab/build/build_gcs_base_image.yml b/.gitlab/build/build_gcs_base_image.yml index 8e8b2d01b..a437f7502 100644 --- a/.gitlab/build/build_gcs_base_image.yml +++ b/.gitlab/build/build_gcs_base_image.yml @@ -1,73 +1,73 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-gcs-base: - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "gcs-base" - GIT_SUBMODULE_STRATEGY: recursive - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - ci-datafed-globus - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - common/**/* - - .gitlab-ci.yml - - CMakeLists.txt - - cmake/**/* - when: on_success - script: - - BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') - - echo "$BRANCH_LOWER" - - source "scripts/dependency_versions.sh" - - cd "external/globus-connect-server-deploy/docker" - - git checkout "$DATAFED_GCS_SUBMODULE_VERSION" - - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" - - docker build --no-cache --progress plain -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" - < "./docker-files/Dockerfile.ubuntu-20.04" - - docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" - - export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" - - export DATAFED_HARBOR_USERNAME="${HARBOR_USER}" - - export DATAFED_HARBOR_PASSWORD="${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" - - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" - - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" - - cd "${CI_PROJECT_DIR}" - - | - while [ "$(${CI_PROJECT_DIR}/scripts/ci_harbor_artifact_count.sh -r ${DATAFED_HARBOR_REPOSITORY})" == "0" ]; do - echo "Artifact missing from harbor..." - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" - sleep 5 # Optional: Add a sleep to avoid busy waiting - done - - cat "${CI_PROJECT_DIR}/harbor_check.log" + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "gcs-base" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + GCS_BASE_IMAGE_DISTRO: "debian-12" + tags: + - ci-datafed-globus + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - common/**/* + - .gitlab-ci.yml + - CMakeLists.txt + - cmake/**/* + when: on_success + script: + - BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') + - echo "$BRANCH_LOWER" + - source "scripts/dependency_versions.sh" + - cd "external/globus-connect-server-deploy/docker" + - git checkout "$DATAFED_GCS_SUBMODULE_VERSION" + - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + - docker build --no-cache --progress plain -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" - < "./docker-files/Dockerfile.${GCS_BASE_IMAGE_DISTRO}" + - docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" + - export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" + - export DATAFED_HARBOR_USERNAME="${HARBOR_USER}" + - export DATAFED_HARBOR_PASSWORD="${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" + - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" + - cd "${CI_PROJECT_DIR}" + - | + while [ "$(${CI_PROJECT_DIR}/scripts/ci_harbor_artifact_count.sh -r ${DATAFED_HARBOR_REPOSITORY})" == "0" ]; do + echo "Artifact missing from harbor..." + docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" + docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" + sleep 5 # Optional: Add a sleep to avoid busy waiting + done + - cat "${CI_PROJECT_DIR}/harbor_check.log" retag-image: - extends: .docker_retag_image - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "gcs-base" - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - common/**/* - - .gitlab-ci.yml - - CMakeLists.txt - - cmake/**/* - when: never - - when: on_success + extends: .docker_retag_image + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "gcs-base" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - common/**/* + - .gitlab-ci.yml + - CMakeLists.txt + - cmake/**/* + when: never + - when: on_success diff --git a/.gitlab/build/build_gcs_image.yml b/.gitlab/build/build_gcs_image.yml index b2da9fea7..4d53e04eb 100644 --- a/.gitlab/build/build_gcs_image.yml +++ b/.gitlab/build/build_gcs_image.yml @@ -1,78 +1,88 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-gcs: - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "gcs" - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - ci-datafed-globus - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - common/**/* - - .gitlab-ci.yml - - CMakeLists.txt - - cmake/**/* - - repository/docker/entrypoint_authz.sh - - repository/docker/Dockerfile.gcs - - repository/CMakeLists.txt - - repository/gridftp/**/* - when: on_success - script: - - BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') - - echo "$BRANCH_LOWER" - - "${CI_PROJECT_DIR}/scripts/generate_datafed.sh" - - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" - - docker build --build-arg DEPENDENCIES="${REGISTRY}/datafed/dependencies-${BRANCH_LOWER}:latest" --build-arg RUNTIME="${REGISTRY}/datafed/runtime-${BRANCH_LOWER}:latest" --build-arg GCS_IMAGE="${REGISTRY}/datafed/gcs-base-${BRANCH_LOWER}:latest" -f repository/docker/Dockerfile.gcs -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" . - - docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" - - export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" - - export DATAFED_HARBOR_USERNAME="${HARBOR_USER}" - - export DATAFED_HARBOR_PASSWORD="${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" - - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" - - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" - - | - while [ "$(${CI_PROJECT_DIR}/scripts/ci_harbor_artifact_count.sh -r ${DATAFED_HARBOR_REPOSITORY})" == "0" ]; do - echo "Artifact missing from harbor..." - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" - sleep 5 # Optional: Add a sleep to avoid busy waiting - done - - cat "${CI_PROJECT_DIR}/harbor_check.log" + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "gcs" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - ci-datafed-globus + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - common/**/* + - .gitlab-ci.yml + - .gitlab/build/build_gcs_base_image.sh + - .gitlab/build/build_gcs_image.sh + - .gitlab/stage_build_base.sh + - external/globus-connect-server/**/* + - CMakeLists.txt + - cmake/**/* + - repository/docker/entrypoint_authz.sh + - repository/docker/Dockerfile.gcs + - repository/CMakeLists.txt + - repository/gridftp/**/* + when: on_success + script: + - BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') + - echo "$BRANCH_LOWER" + - "${CI_PROJECT_DIR}/scripts/generate_datafed.sh" + - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + - DOWNSTREAM_SHA=$( git submodule status ./external/DataFedDependencies/ | awk '{print $1}' ) + - DOWNSTREAM_SHA=${DOWNSTREAM_SHA#-} + - docker build --build-arg DEPENDENCIES="${REGISTRY}/datafed/dependencies:$DOWNSTREAM_SHA" --build-arg RUNTIME="${REGISTRY}/datafed/runtime-${BRANCH_LOWER}:latest" --build-arg GCS_IMAGE="${REGISTRY}/datafed/gcs-base-${BRANCH_LOWER}:latest" -f repository/docker/Dockerfile.gcs -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" . + - docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" + - export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" + - export DATAFED_HARBOR_USERNAME="${HARBOR_USER}" + - export DATAFED_HARBOR_PASSWORD="${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" + - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" + - | + while [ "$(${CI_PROJECT_DIR}/scripts/ci_harbor_artifact_count.sh -r ${DATAFED_HARBOR_REPOSITORY})" == "0" ]; do + echo "Artifact missing from harbor..." + docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" + docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" + sleep 5 # Optional: Add a sleep to avoid busy waiting + done + - cat "${CI_PROJECT_DIR}/harbor_check.log" retag-image: - extends: .docker_retag_image - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "gcs" - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - ci-datafed-globus - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - common/**/* - - .gitlab-ci.yml - - CMakeLists.txt - - cmake/**/* - - repository/docker/entrypoint_authz.sh - - repository/docker/Dockerfile.gcs - - repository/CMakeLists.txt - - repository/gridftp/**/* - when: never - - when: on_success + extends: .docker_retag_image + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "gcs" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - ci-datafed-globus + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - common/**/* + - .gitlab-ci.yml + - .gitlab/build/build_gcs_base_image.sh + - .gitlab/build/build_gcs_image.sh + - .gitlab/stage_build_base.sh + - external/globus-connect-server/**/* + - CMakeLists.txt + - cmake/**/* + - repository/docker/entrypoint_authz.sh + - repository/docker/Dockerfile.gcs + - repository/CMakeLists.txt + - repository/gridftp/**/* + when: never + - when: on_success diff --git a/.gitlab/build/build_repo_image.yml b/.gitlab/build/build_repo_image.yml index 059b30745..9ee9fd4b5 100644 --- a/.gitlab/build/build_repo_image.yml +++ b/.gitlab/build/build_repo_image.yml @@ -1,56 +1,55 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-repo: - extends: .docker_build_script - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "repo" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "repository/docker/Dockerfile" - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - ci-datafed-repo - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - common/proto/**/* - - .gitlab-ci.yml - - CMakeLists.txt - - cmake/**/* - - repository/CMakeLists.txt - - repository/server/**/* - when: on_success + extends: .docker_build_script + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "repo" + GIT_STRATEGY: clone + DOCKER_FILE_PATH: "repository/docker/Dockerfile" + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - ci-datafed-repo + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - common/proto/**/* + - .gitlab-ci.yml + - CMakeLists.txt + - cmake/**/* + - repository/CMakeLists.txt + - repository/server/**/* + when: on_success retag-image: - extends: .docker_retag_image - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "repo" - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - common/proto/**/* - - .gitlab-ci.yml - - CMakeLists.txt - - cmake/**/* - - repository/CMakeLists.txt - - repository/server/**/* - when: never - - when: on_success - + extends: .docker_retag_image + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "repo" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - common/proto/**/* + - .gitlab-ci.yml + - CMakeLists.txt + - cmake/**/* + - repository/CMakeLists.txt + - repository/server/**/* + when: never + - when: on_success diff --git a/.gitlab/build/build_ws_image.yml b/.gitlab/build/build_ws_image.yml index 6c710caa0..9ad5767c2 100644 --- a/.gitlab/build/build_ws_image.yml +++ b/.gitlab/build/build_ws_image.yml @@ -1,57 +1,57 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-ws: - extends: .docker_build_script - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "ws" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "web/docker/Dockerfile" - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "TRUE" - INTERMEDIATE_TARGET: "ws-build" # Name of the layer in the dockerfile - INTERMEDIATE_LAYER_NAME: "build" - tags: - - ci-datafed-core - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - web/**/* - - cmake/**/* - - common/proto/**/* - - .gitlab-ci.yml - - CMakeLists.txt - when: on_success + extends: .docker_build_script + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "ws" + GIT_STRATEGY: clone + DOCKER_FILE_PATH: "web/docker/Dockerfile" + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "TRUE" + INTERMEDIATE_TARGET: "ws-build" # Name of the layer in the dockerfile + INTERMEDIATE_LAYER_NAME: "build" + tags: + - ci-datafed-core + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - web/**/* + - cmake/**/* + - common/proto/**/* + - .gitlab-ci.yml + - CMakeLists.txt + when: on_success retag-image: - extends: .docker_retag_image - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "ws" - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "TRUE" - INTERMEDIATE_TARGET: "ws-build" # Name of the layer in the dockerfile - INTERMEDIATE_LAYER_NAME: "build" - tags: - - docker - rules: - - changes: - - docker/**/* - - scripts/**/* - - web/**/* - - cmake/**/* - - common/proto/**/* - - .gitlab-ci.yml - - CMakeLists.txt - when: never - - when: on_success + extends: .docker_retag_image + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "ws" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "TRUE" + INTERMEDIATE_TARGET: "ws-build" # Name of the layer in the dockerfile + INTERMEDIATE_LAYER_NAME: "build" + tags: + - docker + rules: + - changes: + - docker/**/* + - scripts/**/* + - web/**/* + - cmake/**/* + - common/proto/**/* + - .gitlab-ci.yml + - CMakeLists.txt + when: never + - when: on_success diff --git a/.gitlab/build/force_build_core_image.yml b/.gitlab/build/force_build_core_image.yml index 4458ada62..1520cd505 100644 --- a/.gitlab/build/force_build_core_image.yml +++ b/.gitlab/build/force_build_core_image.yml @@ -1,20 +1,20 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-core: - extends: .docker_build_script - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "core" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "core/docker/Dockerfile" - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - ci-datafed-core - - docker + extends: .docker_build_script + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "core" + GIT_STRATEGY: clone + DOCKER_FILE_PATH: "core/docker/Dockerfile" + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - ci-datafed-core + - docker diff --git a/.gitlab/build/force_build_dependencies_image.yml b/.gitlab/build/force_build_dependencies_image.yml new file mode 100644 index 000000000..e44f3bda2 --- /dev/null +++ b/.gitlab/build/force_build_dependencies_image.yml @@ -0,0 +1,71 @@ +--- +stages: + - build + +build-dependencies: + stage: build + tags: + - ci-datafed-core + - docker + script: + - | + # Variables you need set in CI/CD Settings or here + DOWNSTREAM_SHA=$(git submodule status ./external/DataFedDependencies/ | awk '{print $1}') # Commit SHA to trigger on + # Remove leading '-' if one exists + DOWNSTREAM_SHA=${DOWNSTREAM_SHA#-} + echo "DataFedDependencies current commit: $DOWNSTREAM_SHA" + # Trigger the downstream pipeline + echo "Triggering downstream pipeline... $CI_API_V4_URL/projects/$DATAFED_DEPENDENCIES_GITLAB_PROJECT_ID/trigger/pipeline" + PIPELINE=$(curl --silent --fail --show-error -X POST \ + -F "token=$CI_JOB_TOKEN" \ + -F "ref=main" \ + --form "variables[UPSTREAM_DATAFED_DEPENDENCIES_SUBMODULE_SHA]=$DOWNSTREAM_SHA" \ + "$CI_API_V4_URL/projects/$DATAFED_DEPENDENCIES_GITLAB_PROJECT_ID/trigger/pipeline" ) + PIPELINE_ID=$(echo "$PIPELINE" | jq -r '.id') + if [ "$PIPELINE_ID" = "null" ] || [ -z "$PIPELINE_ID" ]; then + echo "❌ Failed to create pipeline" + echo "$PIPELINE" + exit 1 + fi + echo "✅ Triggered pipeline $PIPELINE_ID for commit $DOWNSTREAM_SHA" + # Wait for the downstream pipeline to complete + echo "⏳ Waiting for downstream pipeline to complete..." + TIMEOUT=3600 # 1 hour timeout + ELAPSED=0 + POLL_INTERVAL=30 # Check every 30 seconds + + while [ $ELAPSED -lt $TIMEOUT ]; do + # Get pipeline status + PIPELINE_STATUS=$(curl --silent --fail --show-error \ + --header "PRIVATE-TOKEN: $GITLAB_DATAFED_DEPENDENCIES_REPO_API_TOKEN" \ + "$CI_API_V4_URL/projects/$DATAFED_DEPENDENCIES_GITLAB_PROJECT_ID/pipelines/$PIPELINE_ID" | jq -r '.status') + + echo "Pipeline $PIPELINE_ID status: $PIPELINE_STATUS (elapsed: ${ELAPSED}s)" + + case "$PIPELINE_STATUS" in + "success") + echo "✅ Downstream pipeline completed successfully!" + exit 0 + ;; + "failed"|"canceled"|"skipped") + echo "❌ Downstream pipeline failed with status: $PIPELINE_STATUS" + echo "Pipeline URL: $CI_SERVER_URL/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/-/pipelines/$PIPELINE_ID" + exit 1 + ;; + "created"|"waiting_for_resource"|"preparing"|"pending"|"running") + # Pipeline is still in progress, continue waiting + sleep $POLL_INTERVAL + ELAPSED=$((ELAPSED + POLL_INTERVAL)) + ;; + *) + echo "⚠️ Unknown pipeline status: $PIPELINE_STATUS" + sleep $POLL_INTERVAL + ELAPSED=$((ELAPSED + POLL_INTERVAL)) + ;; + esac + done + + # If we reach here, the timeout was exceeded + echo "❌ Timeout waiting for downstream pipeline to complete after ${TIMEOUT}s" + echo "Pipeline URL: $CI_SERVER_URL/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/-/pipelines/$PIPELINE_ID" + exit 1 diff --git a/.gitlab/build/force_build_foxx_image.yml b/.gitlab/build/force_build_foxx_image.yml index afe90f1e6..2942aa700 100644 --- a/.gitlab/build/force_build_foxx_image.yml +++ b/.gitlab/build/force_build_foxx_image.yml @@ -1,19 +1,19 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-foxx: - extends: .docker_build_script - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "foxx" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "docker/Dockerfile.foxx" - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - docker + extends: .docker_build_script + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "foxx" + GIT_STRATEGY: clone + DOCKER_FILE_PATH: "docker/Dockerfile.foxx" + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - docker diff --git a/.gitlab/build/force_build_gcs_base_image.yml b/.gitlab/build/force_build_gcs_base_image.yml index 6499ed226..7e32fad39 100644 --- a/.gitlab/build/force_build_gcs_base_image.yml +++ b/.gitlab/build/force_build_gcs_base_image.yml @@ -1,38 +1,38 @@ --- stages: - - build + - build build-gcs-base: - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "gcs-base" - GIT_SUBMODULE_STRATEGY: recursive - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - tags: - - ci-datafed-globus - - docker - script: - - BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') - - echo "$BRANCH_LOWER" - - source "scripts/dependency_versions.sh" - - cd "external/globus-connect-server-deploy/docker" - - git checkout "$DATAFED_GCS_SUBMODULE_VERSION" - - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" - - docker build --no-cache --progress plain -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" - < "./docker-files/Dockerfile.ubuntu-20.04" - - docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" - - export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" - - export DATAFED_HARBOR_USERNAME="${HARBOR_USER}" - - export DATAFED_HARBOR_PASSWORD="${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" - - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" - - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" - - cd "${CI_PROJECT_DIR}" - - | - while [ "$(${CI_PROJECT_DIR}/scripts/ci_harbor_artifact_count.sh -r ${DATAFED_HARBOR_REPOSITORY})" == "0" ]; do - echo "Artifact missing from harbor..." - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" - sleep 5 # Optional: Add a sleep to avoid busy waiting - done - - cat "${CI_PROJECT_DIR}/harbor_check.log" + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "gcs-base" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + GCS_BASE_IMAGE_DISTRO: "debian-12" + tags: + - ci-datafed-globus + - docker + script: + - BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') + - echo "$BRANCH_LOWER" + - source "scripts/dependency_versions.sh" + - cd "external/globus-connect-server-deploy/docker" + - git checkout "$DATAFED_GCS_SUBMODULE_VERSION" + - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + - docker build --no-cache --progress plain -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" - < "./docker-files/Dockerfile.${GCS_BASE_IMAGE_DISTRO}" + - docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" + - export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" + - export DATAFED_HARBOR_USERNAME="${HARBOR_USER}" + - export DATAFED_HARBOR_PASSWORD="${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" + - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" + - cd "${CI_PROJECT_DIR}" + - | + while [ "$(${CI_PROJECT_DIR}/scripts/ci_harbor_artifact_count.sh -r ${DATAFED_HARBOR_REPOSITORY})" == "0" ]; do + echo "Artifact missing from harbor..." + docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" + docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" + sleep 5 # Optional: Add a sleep to avoid busy waiting + done + - cat "${CI_PROJECT_DIR}/harbor_check.log" diff --git a/.gitlab/build/force_build_gcs_image.yml b/.gitlab/build/force_build_gcs_image.yml index 4cae5d148..0a3eb8e3d 100644 --- a/.gitlab/build/force_build_gcs_image.yml +++ b/.gitlab/build/force_build_gcs_image.yml @@ -1,36 +1,37 @@ --- stages: - - build + - build build-gcs: - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "gcs" - GIT_STRATEGY: clone - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - ci-datafed-globus - - docker - script: - - BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') - - echo "$BRANCH_LOWER" - - ./scripts/generate_datafed.sh - - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" - - docker build --no-cache --build-arg DEPENDENCIES="${REGISTRY}/datafed/dependencies-${BRANCH_LOWER}:latest" --build-arg RUNTIME="${REGISTRY}/datafed/runtime-${BRANCH_LOWER}:latest" --build-arg GCS_IMAGE="${REGISTRY}/datafed/gcs-base-${BRANCH_LOWER}:latest" -f repository/docker/Dockerfile.gcs -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" . - - docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" - - export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" - - export DATAFED_HARBOR_USERNAME="${HARBOR_USER}" - - export DATAFED_HARBOR_PASSWORD="${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" - - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" - - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" - - | - while [ "$(${CI_PROJECT_DIR}/scripts/ci_harbor_artifact_count.sh -r ${DATAFED_HARBOR_REPOSITORY})" == "0" ]; do - echo "Artifact missing from harbor..." - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" - sleep 5 # Optional: Add a sleep to avoid busy waiting - done - - cat "${CI_PROJECT_DIR}/harbor_check.log" - + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "gcs" + GIT_STRATEGY: clone + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - ci-datafed-globus + - docker + script: + - BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') + - echo "$BRANCH_LOWER" + - ./scripts/generate_datafed.sh + - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + - DOWNSTREAM_SHA=$( git submodule status ./external/DataFedDependencies/ | awk '{print $1}' ) + - DOWNSTREAM_SHA=${DOWNSTREAM_SHA#-} + - docker build --no-cache --build-arg DEPENDENCIES="${REGISTRY}/datafed/dependencies:$DOWNSTREAM_SHA" --build-arg RUNTIME="${REGISTRY}/datafed/runtime-${BRANCH_LOWER}:latest" --build-arg GCS_IMAGE="${REGISTRY}/datafed/gcs-base-${BRANCH_LOWER}:latest" -f repository/docker/Dockerfile.gcs -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" . + - docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" + - export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" + - export DATAFED_HARBOR_USERNAME="${HARBOR_USER}" + - export DATAFED_HARBOR_PASSWORD="${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" + - docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" + - | + while [ "$(${CI_PROJECT_DIR}/scripts/ci_harbor_artifact_count.sh -r ${DATAFED_HARBOR_REPOSITORY})" == "0" ]; do + echo "Artifact missing from harbor..." + docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" + docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" + sleep 5 # Optional: Add a sleep to avoid busy waiting + done + - cat "${CI_PROJECT_DIR}/harbor_check.log" diff --git a/.gitlab/build/force_build_repo_image.yml b/.gitlab/build/force_build_repo_image.yml index 3c21cf10e..4efab00f2 100644 --- a/.gitlab/build/force_build_repo_image.yml +++ b/.gitlab/build/force_build_repo_image.yml @@ -1,20 +1,20 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-repo: - extends: .docker_build_script - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "repo" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "repository/docker/Dockerfile" - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "FALSE" - tags: - - ci-datafed-repo - - docker + extends: .docker_build_script + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "repo" + GIT_STRATEGY: clone + DOCKER_FILE_PATH: "repository/docker/Dockerfile" + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "FALSE" + tags: + - ci-datafed-repo + - docker diff --git a/.gitlab/build/force_build_ws_image.yml b/.gitlab/build/force_build_ws_image.yml index 0355bfbc8..d0833890a 100644 --- a/.gitlab/build/force_build_ws_image.yml +++ b/.gitlab/build/force_build_ws_image.yml @@ -1,22 +1,22 @@ --- stages: - - build + - build include: - - local: .gitlab/common.yml + - local: .gitlab/common.yml build-ws: - extends: .docker_build_script - stage: build - variables: - PROJECT: "datafed" - COMPONENT: "ws" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "web/docker/Dockerfile" - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - BUILD_INTERMEDIATE: "TRUE" - INTERMEDIATE_TARGET: "ws-build" # Name of the layer in the dockerfile - INTERMEDIATE_LAYER_NAME: "build" - tags: - - ci-datafed-core - - docker + extends: .docker_build_script + stage: build + variables: + PROJECT: "datafed" + COMPONENT: "ws" + GIT_STRATEGY: clone + DOCKER_FILE_PATH: "web/docker/Dockerfile" + DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count + BUILD_INTERMEDIATE: "TRUE" + INTERMEDIATE_TARGET: "ws-build" # Name of the layer in the dockerfile + INTERMEDIATE_LAYER_NAME: "build" + tags: + - ci-datafed-core + - docker diff --git a/.gitlab/build/skip_build_dependencies_image.yml b/.gitlab/build/skip_build_dependencies_image.yml new file mode 100644 index 000000000..36cb4fc88 --- /dev/null +++ b/.gitlab/build/skip_build_dependencies_image.yml @@ -0,0 +1,11 @@ +--- +stages: + - build + +build-dependencies: + stage: build + tags: + - ci-datafed-core + - docker + script: + - echo "Skipping dependency build, up todate dependencies image was found for commit." diff --git a/.gitlab/common.yml b/.gitlab/common.yml index 5d528b00e..ee42bffbd 100644 --- a/.gitlab/common.yml +++ b/.gitlab/common.yml @@ -168,7 +168,9 @@ .build_image: &build_image | BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${BRANCH_LOWER}" - docker build --no-cache --build-arg DEPENDENCIES="${REGISTRY}/datafed/dependencies-${BRANCH_LOWER}:latest" --build-arg RUNTIME="${REGISTRY}/datafed/runtime-${BRANCH_LOWER}:latest" -f "${DOCKER_FILE_PATH}" -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" . + DOWNSTREAM_SHA=$( git submodule status ./external/DataFedDependencies/ | awk '{print $1}' ) + DOWNSTREAM_SHA=${DOWNSTREAM_SHA#-} + docker build --no-cache --build-arg DEPENDENCIES="${REGISTRY}/datafed/dependencies:$DOWNSTREAM_SHA" --build-arg RUNTIME="${REGISTRY}/datafed/runtime-${BRANCH_LOWER}:latest" -f "${DOCKER_FILE_PATH}" -t "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" . docker tag "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:latest" "${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:$CI_COMMIT_SHA" docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" @@ -194,7 +196,9 @@ then BRANCH_LOWER=$(echo "$CI_COMMIT_REF_NAME" | tr '[:upper:]' '[:lower:]') export DATAFED_HARBOR_REPOSITORY="${COMPONENT}-${INTERMEDIATE_LAYER_NAME}-${BRANCH_LOWER}" - docker build --no-cache --build-arg DEPENDENCIES="${REGISTRY}/${PROJECT}/dependencies-${BRANCH_LOWER}:latest" --build-arg RUNTIME="${REGISTRY}/${PROJECT}/runtime-${BRANCH_LOWER}:latest" --target "${INTERMEDIATE_TARGET}" -f "${DOCKER_FILE_PATH}" -t "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" . + DOWNSTREAM_SHA=$( git submodule status ./external/DataFedDependencies/ | awk '{print $1}' ) + DOWNSTREAM_SHA=${DOWNSTREAM_SHA#-} + docker build --no-cache --build-arg DEPENDENCIES="${REGISTRY}/datafed/dependencies:$DOWNSTREAM_SHA" --build-arg RUNTIME="${REGISTRY}/${PROJECT}/runtime-${BRANCH_LOWER}:latest" --target "${INTERMEDIATE_TARGET}" -f "${DOCKER_FILE_PATH}" -t "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" . echo "Tagging ${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest ${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" docker tag "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:$CI_COMMIT_SHA" docker push "${REGISTRY}/${PROJECT}/${DATAFED_HARBOR_REPOSITORY}:latest" diff --git a/.gitlab/end_to_end.yml b/.gitlab/end_to_end.yml index c2b8cd4e4..23f0eed64 100644 --- a/.gitlab/end_to_end.yml +++ b/.gitlab/end_to_end.yml @@ -39,6 +39,7 @@ end-to-end-foxx-setup: - ./scripts/generate_datafed.sh - env > env_file - mkdir foxx_tmp + - chmod 774 foxx_tmp - ls -la foxx_tmp - if [ -f foxx_tmp/.foxx_is_installed ]; then rm foxx_tmp/.foxx_is_installed; fi - docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" @@ -50,14 +51,14 @@ end-to-end-foxx-setup: - echo "#!/bin/bash" > "${RUN_FILE}" - echo "docker run -d \\" >> "${RUN_FILE}" - echo "--name \"${CONTAINER_NAME}\" \\" >> "${RUN_FILE}" - - echo "-e DATAFED_ZEROMQ_SYSTEM_SECRET=\"$CI_DATAFED_ZEROMQ_SYSTEM_SECRET\" \\" >> "${RUN_FILE}" + - echo "--user \"${USER_ID}:0\" \\" >> "${RUN_FILE}" + - echo "--security-opt no-new-privileges \\" >> "${RUN_FILE}" - echo "-e ENABLE_FOXX_TESTS=\"TRUE\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_DOMAIN=\"$CI_DATAFED_DOMAIN\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_DATABASE_PASSWORD=\"$CI_DATAFED_DATABASE_PASSWORD\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_DATABASE_IP_ADDRESS_PORT=\"$CI_DATAFED_DATABASE_IP_ADDRESS_PORT\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_DATABASE_HOST=\"$CI_DATAFED_DATABASE_HOST\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_DEFAULT_LOG_PATH=\"$CONTAINER_LOG_FILE_PATH\" \\" >> "${RUN_FILE}" - - echo "-e UID=\"$USER_ID\" \\" >> "${RUN_FILE}" - echo "-v \"${HOST_LOG_FILE_PATH}:${CONTAINER_LOG_FILE_PATH}\" \\" >> "${RUN_FILE}" - echo "-v \"./foxx_tmp:/tmp\" \\" >> "${RUN_FILE}" - echo "-t \"${REGISTRY}/${PROJECT}/${COMPONENT}-${BRANCH_LOWER}:${CI_COMMIT_SHA}\"" >> "${RUN_FILE}" @@ -143,7 +144,6 @@ end-to-end-core-setup: - echo "-e DATAFED_GLOBUS_APP_SECRET=\"$CI_DATAFED_GLOBUS_APP_SECRET\" \\" >> run_core.sh - echo "-e DATAFED_GLOBUS_APP_ID=\"$CI_DATAFED_GLOBUS_APP_ID\" \\" >> run_core.sh - echo "-e DATAFED_ZEROMQ_SESSION_SECRET=\"$CI_DATAFED_ZEROMQ_SESSION_SECRET\" \\" >> run_core.sh - - echo "-e DATAFED_ZEROMQ_SYSTEM_SECRET=\"$CI_DATAFED_ZEROMQ_SYSTEM_SECRET\" \\" >> run_core.sh - echo "-e DATAFED_DOMAIN=\"$CI_DATAFED_DOMAIN\" \\" >> run_core.sh - echo "-e DATAFED_DATABASE_PASSWORD=\"$CI_DATAFED_DATABASE_PASSWORD\" \\" >> run_core.sh - echo "-e DATAFED_DATABASE_IP_ADDRESS_PORT=\"$CI_DATAFED_DATABASE_IP_ADDRESS_PORT\" \\" >> run_core.sh @@ -202,7 +202,6 @@ end-to-end-ws-setup: - echo "-e DATAFED_GLOBUS_APP_SECRET=\"$CI_DATAFED_GLOBUS_APP_SECRET\" \\" >> run_web.sh - echo "-e DATAFED_GLOBUS_APP_ID=\"$CI_DATAFED_GLOBUS_APP_ID\" \\" >> run_web.sh - echo "-e DATAFED_ZEROMQ_SESSION_SECRET=\"$CI_DATAFED_ZEROMQ_SESSION_SECRET\" \\" >> run_web.sh - - echo "-e DATAFED_ZEROMQ_SYSTEM_SECRET=\"$CI_DATAFED_ZEROMQ_SYSTEM_SECRET\" \\" >> run_web.sh - echo "-e DATAFED_DOMAIN=\"$CI_DATAFED_DOMAIN\" \\" >> run_web.sh - echo "-e DATAFED_WEB_CERT_PATH=\"/opt/datafed/keys/${DATAFED_WEB_CERT_NAME}\" \\" >> run_web.sh - echo "-e DATAFED_WEB_KEY_PATH=\"/opt/datafed/keys/${DATAFED_WEB_KEY_NAME}\" \\" >> run_web.sh @@ -258,7 +257,6 @@ end-to-end-repo-setup: - echo "-e DATAFED_GLOBUS_APP_SECRET=\"$CI_DATAFED_GLOBUS_APP_SECRET\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_GLOBUS_APP_ID=\"$CI_DATAFED_GLOBUS_APP_ID\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_ZEROMQ_SESSION_SECRET=\"$CI_DATAFED_ZEROMQ_SESSION_SECRET\" \\" >> "${RUN_FILE}" - - echo "-e DATAFED_ZEROMQ_SYSTEM_SECRET=\"$CI_DATAFED_ZEROMQ_SYSTEM_SECRET\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_HTTPS_SERVER_PORT=\"443\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_DOMAIN=\"$CI_DATAFED_DOMAIN\" \\" >> "${RUN_FILE}" - echo "-e DATAFED_CORE_ADDRESS_PORT_INTERNAL=\"${CI_DATAFED_DOMAIN}:7513\" \\" >> "${RUN_FILE}" @@ -322,7 +320,6 @@ end-to-end-gcs-authz-setup: - echo "-e DATAFED_GLOBUS_APP_SECRET=\"$CI_DATAFED_GLOBUS_APP_SECRET\" \\" >> run_globus.sh - echo "-e DATAFED_GLOBUS_APP_ID=\"$CI_DATAFED_GLOBUS_APP_ID\" \\" >> run_globus.sh - echo "-e DATAFED_ZEROMQ_SESSION_SECRET=\"$CI_DATAFED_ZEROMQ_SESSION_SECRET\" \\" >> run_globus.sh - - echo "-e DATAFED_ZEROMQ_SYSTEM_SECRET=\"$CI_DATAFED_ZEROMQ_SYSTEM_SECRET\" \\" >> run_globus.sh - echo "-e DATAFED_DOMAIN=\"$CI_DATAFED_DOMAIN\" \\" >> run_globus.sh - echo "-e DATAFED_HTTPS_SERVER_PORT=\"443\" \\" >> run_globus.sh - echo "-e DATAFED_DEFAULT_LOG_PATH=\"$CONTAINER_LOG_FILE_PATH\" \\" >> run_globus.sh @@ -370,7 +367,6 @@ end_to_end_client-test: variables: GIT_STRATEGY: clone DATAFED_DATABASE_HOST: "${CI_DATAFED_DATABASE_HOST}" - DATAFED_DATABASE_ZEROMQ_SYSTEM_SECRET: "${CI_DATAFED_DATABASE_ZEROMQ_SYSTEM_SECRET}" DATAFED_DATABASE_PASSWORD: "${CI_DATAFED_DATABASE_PASSWORD}" DATAFED_USER89_PASSWORD: "${CI_DATAFED_USER89_PASSWORD}" DATAFED_USER89_GLOBUS_REFRESH_TOKEN: "${CI_DATAFED_USER89_GLOBUS_REFRESH_TOKEN}" @@ -380,7 +376,6 @@ end_to_end_client-test: DATAFED_USER99_GLOBUS_REFRESH_TOKEN: "${CI_DATAFED_USER99_GLOBUS_REFRESH_TOKEN}" DATAFED_USER99_GLOBUS_ACCESS_TOKEN: "${CI_DATAFED_USER99_GLOBUS_ACCESS_TOKEN}" DATAFED_USER99_GLOBUS_UUID: "${CI_DATAFED_USER99_GLOBUS_UUID}" - DATAFED_ZEROMQ_SYSTEM_SECRET: "${CI_DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${CI_DATAFED_DOMAIN}" DATAFED_PYTHON_CLIENT_ALLOW_SELF_SIGNED_CERTS: "TRUE" stage: end-to-end-test @@ -467,7 +462,7 @@ end_to_end_error_discovery_arango: tags: - ci-datafed-arango script: - - sudo journalctl --no-pager -u arangodb3.service + - sudo journalctl --no-pager -u arangodb3.service --since "3 hours ago" end_to_end_error_discovery_gcs: needs: ["check-ci-infrastructure", "end-to-end-gcs-authz-setup", "end-to-end-signal"] diff --git a/.gitlab/infrastructure.yml b/.gitlab/infrastructure.yml index f061cdeb4..2d71c5b57 100644 --- a/.gitlab/infrastructure.yml +++ b/.gitlab/infrastructure.yml @@ -22,6 +22,8 @@ check-ci-infrastructure: BUILD_INFRASTRUCTURE="TRUE" elif [ "${EXIT_CODE}" -eq 2 ]; then exit 1 + elif [ "${EXIT_CODE}" -eq 3 ]; then + exit 1 fi done if [ "$BUILD_INFRASTRUCTURE" == "TRUE" ] diff --git a/.gitlab/stage_base_image_check.yml b/.gitlab/stage_base_image_check.yml new file mode 100644 index 000000000..37ee8510d --- /dev/null +++ b/.gitlab/stage_base_image_check.yml @@ -0,0 +1,38 @@ +--- +check-dependencies-image: + stage: base-image-check + variables: + PROJECT: "datafed" + COMPONENT: "dependencies" + BUILD_INTERMEDIATE: "FALSE" + tags: + - docker + script: + - | + cd "$CI_PROJECT_DIR/external/DataFedDependencies" + BRANCH=$(git branch --show-current) + cd "$CI_PROJECT_DIR" + DOWNSTREAM_SHA=$(git submodule status ./external/DataFedDependencies/ | awk '{print $1}') + DOWNSTREAM_SHA="${DOWNSTREAM_SHA#-}" + docker login "${REGISTRY}" -u "${HARBOR_USER}" -p "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" + FORCE_BUILD="FALSE" + echo "Pulling: ${REGISTRY}/${PROJECT}/${COMPONENT}:${DOWNSTREAM_SHA}" + set +e + docker pull --quiet "${REGISTRY}/${PROJECT}/${COMPONENT}:${DOWNSTREAM_SHA}" + if [ $? -eq 0 ]; then echo "Image exists"; else FORCE_BUILD="TRUE"; fi; + set -e + if [ "$FORCE_BUILD" == "TRUE" ] + then + cp .gitlab/build/force_build_${COMPONENT}_image.yml ${COMPONENT}_image.yml + else + cp .gitlab/build/skip_build_${COMPONENT}_image.yml ${COMPONENT}_image.yml + fi + echo "REGISTRY=${REGISTRY}" >> build.env + echo "HARBOR_USER=${HARBOR_USER}" >> build.env + echo "HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN=${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" >> build.env + sed -i 's/\(HARBOR_USER=.*\)\$/\1$$/g' build.env + artifacts: + paths: + - ${COMPONENT}_image.yml + reports: + dotenv: build.env diff --git a/.gitlab/stage_build.yml b/.gitlab/stage_build.yml index c8dabacc7..52a4c1c12 100644 --- a/.gitlab/stage_build.yml +++ b/.gitlab/stage_build.yml @@ -1,7 +1,7 @@ --- run-ws-build-job: needs: - - job: build-dependencies + - job: run-build-dependencies - job: build-runtime - job: check-ws-image artifacts: true @@ -20,7 +20,7 @@ run-core-build-job: needs: - job: build-runtime - job: check-core-image - - job: build-dependencies + - job: run-build-dependencies artifacts: true stage: build trigger: @@ -35,7 +35,7 @@ run-core-build-job: run-repo-build-job: needs: - - job: build-dependencies + - job: run-build-dependencies - job: build-runtime - job: check-repo-image artifacts: true @@ -52,7 +52,7 @@ run-repo-build-job: run-gcs-base-build-job: needs: - - job: build-dependencies + - job: run-build-dependencies - job: build-runtime - job: check-gcs-base-image artifacts: true @@ -70,7 +70,7 @@ run-gcs-base-build-job: run-gcs-build-job: needs: - - job: build-dependencies + - job: run-build-dependencies - job: build-runtime - job: run-gcs-base-build-job - job: check-gcs-image @@ -88,7 +88,7 @@ run-gcs-build-job: run-foxx-build-job: needs: - - job: build-dependencies + - job: run-build-dependencies - job: build-runtime - job: check-foxx-image artifacts: true diff --git a/.gitlab/stage_build_base.yml b/.gitlab/stage_build_base.yml index adcf5e993..842728e75 100644 --- a/.gitlab/stage_build_base.yml +++ b/.gitlab/stage_build_base.yml @@ -2,17 +2,20 @@ include: - local: .gitlab/common.yml -build-dependencies: - extends: .docker_base_build_script +run-build-dependencies: + needs: + - job: check-dependencies-image + artifacts: true stage: build-base + trigger: + include: + - artifact: dependencies_image.yml + job: check-dependencies-image + strategy: depend variables: - DATAFED_HARBOR_REGISTRY: "$REGISTRY" # needed by c_harbor_artifact_count - PROJECT: "datafed" - COMPONENT: "dependencies" - GIT_STRATEGY: clone - DOCKER_FILE_PATH: "docker/Dockerfile.dependencies" - tags: - - docker + REGISTRY: "${REGISTRY}" + HARBOR_USER: "${HARBOR_USER}" + HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN: "${HARBOR_DATAFED_GITLAB_CI_REGISTRY_TOKEN}" build-runtime: extends: .docker_base_build_script diff --git a/.gitlab/stage_provision_client.yml b/.gitlab/stage_provision_client.yml index 0ee3d06a3..21f3c6549 100644 --- a/.gitlab/stage_provision_client.yml +++ b/.gitlab/stage_provision_client.yml @@ -6,14 +6,16 @@ provision-client: needs: ["signal"] variables: GIT_STRATEGY: clone - DATAFED_PYTHON_DEPENDENCIES_DIR: /opt/datafed/dependencies/python + DATAFED_PYTHON_DEPENDENCIES_DIR: "${CI_PROJECT_DIR}/dependencies/python" + DATAFED_DEPENDENCIES_INSTALL_PATH: "/opt/datafed/dependencies/" stage: provision-client tags: - ci-datafed-client before_script: - - export PATH=/opt/datafed/dependencies/bin:$PATH - - rm -rf $DATAFED_PYTHON_DEPENDENCIES_DIR + - sudo chown -R gitlab-runner:gitlab-runner "$DATAFED_DEPENDENCIES_INSTALL_PATH" + - rm -rf "$DATAFED_PYTHON_DEPENDENCIES_DIR" script: - - ./scripts/generate_datafed.sh - - ./scripts/install_client_dependencies.sh - - ./scripts/install_end_to_end_test_dependencies.sh + - export PATH="/opt/datafed/dependencies/bin:$DATAFED_PYTHON_DEPENDENCIES_DIR/bin:$PATH" + - ./external/DataFedDependencies/scripts/generate_dependencies_config.sh + - ./external/DataFedDependencies/scripts/install_client_dependencies.sh + - ./external/DataFedDependencies/scripts/install_end_to_end_test_dependencies.sh diff --git a/.gitlab/stage_unit.yml b/.gitlab/stage_unit.yml index 172135693..70e4e5a98 100644 --- a/.gitlab/stage_unit.yml +++ b/.gitlab/stage_unit.yml @@ -39,17 +39,17 @@ run-ws-unit-job: - env - ./scripts/container_stop.sh -n "ws-" -p - random_string=$(bash -c "cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w "10" | head -n 1") + - source scripts/dependency_versions.sh # Don't run in daemon mode this is just a unit test - echo "#!/bin/bash" > run_web.sh - echo "docker run \\" >> run_web.sh - echo "--name \"ws-${BRANCH_LOWER}-${INTERMEDIATE_LAYER_NAME}-${CI_COMMIT_SHORT_SHA}-${random_string}\" \\" >> run_web.sh - - echo "-e NVM_INC=/opt/datafed/dependencies/nvm/versions/node/v14.21.3/include/node \\" >> run_web.sh - - echo "-e PATH=/opt/datafed/dependencies/nvm/versions/node/v14.21.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \\" >> run_web.sh - - echo "-e NVM_INC=/opt/datafed/dependencies/nvm/versions/node/v14.21.3/include/node \\" >> run_web.sh + - echo "-e NVM_INC=/opt/datafed/dependencies/nvm/versions/node/${DATAFED_NODE_VERSION}/include/node \\" >> run_web.sh + - echo "-e PATH=/opt/datafed/dependencies/nvm/versions/node/${DATAFED_NODE_VERSION}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \\" >> run_web.sh + - echo "-e NVM_INC=/opt/datafed/dependencies/nvm/versions/node/${DATAFED_NODE_VERSION}/include/node \\" >> run_web.sh - echo "-e DATAFED_GLOBUS_APP_SECRET=\"$CI_DATAFED_GLOBUS_APP_SECRET\" \\" >> run_web.sh - echo "-e DATAFED_GLOBUS_APP_ID=\"$CI_DATAFED_GLOBUS_APP_ID\" \\" >> run_web.sh - echo "-e DATAFED_ZEROMQ_SESSION_SECRET=\"$CI_DATAFED_ZEROMQ_SESSION_SECRET\" \\" >> run_web.sh - - echo "-e DATAFED_ZEROMQ_SYSTEM_SECRET=\"$CI_DATAFED_ZEROMQ_SYSTEM_SECRET\" \\" >> run_web.sh - echo "-e DATAFED_DOMAIN=\"$CI_DATAFED_DOMAIN\" \\" >> run_web.sh - echo "-e DATAFED_WEB_CERT_PATH=\"/opt/datafed/keys/${DATAFED_WEB_CERT_NAME}\" \\" >> run_web.sh - echo "-e DATAFED_WEB_KEY_PATH=\"/opt/datafed/keys/${DATAFED_WEB_KEY_NAME}\" \\" >> run_web.sh @@ -102,7 +102,6 @@ run-authz-unit-job: - echo "-e DATAFED_GLOBUS_APP_SECRET=\"$CI_DATAFED_GLOBUS_APP_SECRET\" \\" >> run_globus.sh - echo "-e DATAFED_GLOBUS_APP_ID=\"$CI_DATAFED_GLOBUS_APP_ID\" \\" >> run_globus.sh - echo "-e DATAFED_ZEROMQ_SESSION_SECRET=\"$CI_DATAFED_ZEROMQ_SESSION_SECRET\" \\" >> run_globus.sh - - echo "-e DATAFED_ZEROMQ_SYSTEM_SECRET=\"$CI_DATAFED_ZEROMQ_SYSTEM_SECRET\" \\" >> run_globus.sh - echo "-e DATAFED_DOMAIN=\"$CI_DATAFED_DOMAIN\" \\" >> run_globus.sh - echo "-e DATAFED_HTTPS_SERVER_PORT=\"443\" \\" >> run_globus.sh - echo "-e DATAFED_DEFAULT_LOG_PATH=\"$CONTAINER_LOG_FILE_PATH\" \\" >> run_globus.sh diff --git a/.gitmodules b/.gitmodules index a7921d851..2f55771cf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "external/globus-connect-server-deploy"] path = external/globus-connect-server-deploy url = https://github.com/globus/globus-connect-server-deploy.git -[submodule "external/protobuf"] - path = external/protobuf - url = https://github.com/protocolbuffers/protobuf.git +[submodule "external/DataFedDependencies"] + path = external/DataFedDependencies + url = https://github.com/ORNL/DataFedDependencies.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 2385d3249..1196f2e18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Pre-release ## MAJOR Breaking changes +1. [1336] - Changed base container for all builds to debian:bookworm-slim and addressed a majority of CVEs. ## MINOR Feature 1. [987] - This implements serialized GitLab CI pipelines diff --git a/CMakeLists.txt b/CMakeLists.txt index 019f389ba..c3ba0b055 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,14 @@ if(NOT EXISTS ${DATAFED_CONFIG_SH}) "${PROJECT_SOURCE_DIR}/scripts/generate_datafed.sh") endif() -file(READ "${PROJECT_SOURCE_DIR}/scripts/dependency_versions.sh" DEPENDENCY_VERSIONS) +set(DATAFED_DEPENDENCIES_SH "${DataFed_SOURCE_DIR}/external/DataFedDependencies/config/dependencies.sh") +if(NOT EXISTS ${DATAFED_DEPENDENCIES_SH}) + message(FATAL_ERROR "Error: File '${DATAFED_DEPENDENCIES_SH}' does not exist. " + "Please run generate_dependencies.sh first to populate defaults." + "${PROJECT_SOURCE_DIR}/external/DataFedDependencies/scripts/generate_datafed.sh") +endif() + +file(READ "${PROJECT_SOURCE_DIR}/external/DataFedDependencies/scripts/dependency_versions.sh" DEPENDENCY_VERSIONS) get_version_from_script(${DEPENDENCY_VERSIONS} "DATAFED_DYNAMIC_LIBRARY_PROTOBUF_VERSION" PROTOBUF_LIBRARY_VERSION) get_version_from_script(${DEPENDENCY_VERSIONS} "DATAFED_PROTOBUF_VERSION" PROTOBUF_COMPILER_VERSION) @@ -76,7 +83,7 @@ if(NOT DEFINED DATAFED_DOMAIN) endif() if(NOT DEFINED DATAFED_DEPENDENCIES_INSTALL_PATH) - get_value_from_datafed_sh("DATAFED_DEPENDENCIES_INSTALL_PATH" DEPENDENCY_INSTALL_PATH) + get_value_from_dependencies_sh("DATAFED_DEPENDENCIES_INSTALL_PATH" DEPENDENCY_INSTALL_PATH) endif() set(CMAKE_PREFIX_PATH "${DEPENDENCY_INSTALL_PATH}") @@ -108,13 +115,18 @@ if(CMAKE_MAKE_PROGRAM MATCHES "(make|gmake)") add_definitions( -Wall -Wextra ) endif() -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/common/proto/common/Version.proto.in" - "${CMAKE_CURRENT_SOURCE_DIR}/common/proto/common/Version.proto" - @ONLY) -# Create file glob here because need to be made visible here as well -file( GLOB ProtoFiles "${PROJECT_SOURCE_DIR}/common/proto/common/*.proto" ) +if ( BUILD_REPO_SERVER OR BUILD_CORE_SERVER OR BUILD_AUTHZ OR BUILD_COMMON OR BUILD_PYTHON_CLIENT OR BUILD_WEB_SERVER) + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/common/proto/common/Version.proto.in" + "${CMAKE_CURRENT_SOURCE_DIR}/common/proto/common/Version.proto" + @ONLY) + + # Create file glob here because need to be made visible here as well + file( GLOB ProtoFiles "${PROJECT_SOURCE_DIR}/common/proto/common/*.proto" ) + include(./cmake/Protobuf.cmake) +endif() + if( BUILD_WEB_SERVER ) include(./cmake/Web.cmake) @@ -132,10 +144,6 @@ if( BUILD_AUTHZ_TESTS ) include(./cmake/GlobusCommon.cmake) endif() -if ( BUILD_REPO_SERVER OR BUILD_CORE_SERVER OR BUILD_AUTHZ OR BUILD_COMMON OR BUILD_PYTHON_CLIENT) - include(./cmake/Protobuf.cmake) -endif() - if ( BUILD_REPO_SERVER OR BUILD_CORE_SERVER OR BUILD_AUTHZ OR BUILD_COMMON) include_directories( "/usr/include/globus" ) @@ -186,6 +194,7 @@ endif() if( BUILD_PYTHON_CLIENT ) # make target = pydatafed + file(COPY ${PROJECT_SOURCE_DIR}/external/DataFedDependencies/python/datafed_pkg/requirements.txt DESTINATION ${PROJECT_SOURCE_DIR}/python/datafed_pkg/requirements.txt) add_subdirectory( python EXCLUDE_FROM_ALL ) endif() @@ -224,8 +233,10 @@ if( INSTALL_FOXX ) OUTPUT_VARIABLE _out ERROR_VARIABLE _err RESULT_VARIABLE _res) - If (NOT \${_res} EQUAL \"0\") + if (NOT \${_res} EQUAL \"0\") message( FATAL_ERROR \"out: \${_out} install_foxx failed: \${_err}\") + else() + message( \"\${_out} install_foxx failed: \${_err}\") endif()" ) endif() diff --git a/cmake/Utils.cmake b/cmake/Utils.cmake index 9ae7fabab..e4f8e6819 100644 --- a/cmake/Utils.cmake +++ b/cmake/Utils.cmake @@ -45,3 +45,24 @@ function(get_value_from_datafed_sh INPUT_KEY OUTPUT_VALUE) set(${OUTPUT_VALUE} "${OUTPUT_VAR}" PARENT_SCOPE) endfunction() +# Function will get exported value from a shell script +# +# i.e. if dependencies.sh has +# +# dependencies.sh +# export MY_NAME="Barry" +# +# set(DATAFED_CONFIG_SH "external/DataFedDependencies/config/dependencies.sh") +# get_value_from_dependencies_sh "MY_NAME" name) +# message("$name") +# +# Will output "Barry" +function(get_value_from_dependencies_sh INPUT_KEY OUTPUT_VALUE) + execute_process( + COMMAND bash "-c" "source ${DATAFED_CONFIG_SH} && echo \$${INPUT_KEY}" + OUTPUT_VARIABLE OUTPUT_VAR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(${OUTPUT_VALUE} "${OUTPUT_VAR}" PARENT_SCOPE) +endfunction() + diff --git a/cmake/Version.cmake b/cmake/Version.cmake index 7b5ef09ca..7e2f65df7 100644 --- a/cmake/Version.cmake +++ b/cmake/Version.cmake @@ -1,14 +1,14 @@ set(DATAFED_RELEASE_YEAR 2025) -set(DATAFED_RELEASE_MONTH 6) -set(DATAFED_RELEASE_DAY 11) +set(DATAFED_RELEASE_MONTH 10) +set(DATAFED_RELEASE_DAY 7) set(DATAFED_RELEASE_HOUR 14) set(DATAFED_RELEASE_MINUTE 1) set(DATAFED_COMMON_LIB_MAJOR 1) set(DATAFED_COMMON_LIB_MINOR 0) -set(DATAFED_COMMON_LIB_PATCH 1) +set(DATAFED_COMMON_LIB_PATCH 2) set(DATAFED_COMMON_PROTOCOL_API_MAJOR 1) set(DATAFED_COMMON_PROTOCOL_API_MINOR 1) diff --git a/common/include/common/IAuthenticationManager.hpp b/common/include/common/IAuthenticationManager.hpp index 86d8a4a65..262b9601e 100644 --- a/common/include/common/IAuthenticationManager.hpp +++ b/common/include/common/IAuthenticationManager.hpp @@ -55,6 +55,8 @@ class IAuthenticationManager { * Purge keys if needed **/ virtual void purge() = 0; + + virtual ~IAuthenticationManager() {}; }; } // namespace SDMS diff --git a/common/proto/common/CMakeLists.txt b/common/proto/common/CMakeLists.txt index ac65a08de..47d00e102 100644 --- a/common/proto/common/CMakeLists.txt +++ b/common/proto/common/CMakeLists.txt @@ -1,21 +1,24 @@ cmake_minimum_required (VERSION 3.17.0) -add_library( protobuf-target ${ProtoFiles} ) - # Create the .cpp and .hpp files protobuf_generate( - TARGET protobuf-target LANGUAGE cpp + PROTOS ${ProtoFiles} IMPORT_DIRS "${DataFed_SOURCE_DIR}/common/proto/common" OUT_VAR protobuf-generated-files ) +add_custom_target(protobuf-gen-target DEPENDS ${protobuf-generated-files}) + # make sure that datafed-protobuf is dependent on the cpp files when it compiles if(BUILD_SHARED_LIBS) - add_library( datafed-protobuf SHARED ${protobuf-generated-files} ) + add_library( datafed-protobuf SHARED ${protobuf-generated-files} ) else() add_library( datafed-protobuf STATIC ${protobuf-generated-files} ) endif() +# The following command makes sure that the protobuf files are generated +# before attempting to compile with them. +add_dependencies(datafed-protobuf protobuf-gen-target) set_target_properties(datafed-protobuf PROPERTIES POSITION_INDEPENDENT_CODE ON SOVERSION ${DATAFED_COMMON_PROTOCOL_API_MAJOR} VERSION ${DATAFED_COMMON_PROTOCOL_API_MAJOR}.${DATAFED_COMMON_PROTOCOL_API_MINOR}.${DATAFED_COMMON_PROTOCOL_API_PATCH} ) target_link_libraries( datafed-protobuf protobuf::libprotobuf protobuf::libprotoc protobuf::libprotobuf-lite) target_include_directories( datafed-protobuf INTERFACE ${PROJECT_BINARY_DIR}/common/proto) diff --git a/common/proto/common/SDMS.proto b/common/proto/common/SDMS.proto index f173cdde1..14c2c984a 100644 --- a/common/proto/common/SDMS.proto +++ b/common/proto/common/SDMS.proto @@ -96,6 +96,11 @@ enum AccessTokenType { ACCESS_SENTINEL = 255; } +// Used to specify how the work is being done on the servers. +enum ExecutionMethod { + DIRECT = 1; + DEFERRED = 2; +} // ============================ Data Structures // Allocation-specific statistics data @@ -115,10 +120,11 @@ message AllocData required uint64 data_size = 3; required uint32 rec_limit = 4; required uint32 rec_count = 5; - required string path = 6; + optional string path = 6; optional string id = 7; optional bool is_def = 8; optional AllocStatsData stats = 9; + optional string repo_type = 10; } // For viewing dependencies @@ -318,6 +324,7 @@ message RepoData optional string domain = 9; optional string exp_path = 10; repeated string admin = 11; + optional string type = 12; } diff --git a/common/proto/common/SDMS_Auth.proto b/common/proto/common/SDMS_Auth.proto index 38c57f29c..71fbf293c 100644 --- a/common/proto/common/SDMS_Auth.proto +++ b/common/proto/common/SDMS_Auth.proto @@ -149,7 +149,7 @@ message UserCreateRequest required string email = 4; // Email address repeated string uuid = 5; // UUID for primary Globus account optional string options = 6; // DataFed options (JSON string) - required string secret = 7; // System secret + optional string secret = 7; // System secret } // Request to find DataFed user by one or more Globus UUIDs @@ -916,13 +916,14 @@ message RepoCreateRequest required string title = 2; // Title optional string desc = 3; // Description optional string domain = 5; // RESERVED - required string path = 6; // Path to storage directories + optional string path = 6; // Path to storage directories optional string exp_path = 7; // RESERVED - required string address = 8; // Repo server address - required string endpoint = 9; // Globus endpoint UUID or legacy name - required string pub_key = 10; // Public encryption key + optional string address = 8; // Repo server address + optional string endpoint = 9; // Globus endpoint UUID or legacy name + optional string pub_key = 10; // Public encryption key required uint64 capacity = 11; // Total data capacity repeated string admin = 12; // Repo admin(s) + optional string type = 13; // Repository type (defaults to "globus") } // Request to update an existing repository. Only system or repos admins may @@ -942,6 +943,7 @@ message RepoUpdateRequest optional string pub_key = 10; // Public encryption key optional uint64 capacity = 11; // Total data capacity repeated string admin = 12; // Repo admin(s) + optional string type = 13; // Repository type } // Request to delete a repository. Only system or repos admins may send this @@ -1029,8 +1031,10 @@ message RepoAllocationStatsReply // Request to create a new allocation on a repo for a user or project. // Only repo admins may make this request. On success, a background task is -// started to create the allocation. -// Reply: TaskDataReply on success, NackError on error +// started to create the allocation if it is a DataFed managed globus repo, +// for a metadata only repo it is created immediatly. +// Reply: TaskDataReply (to be superseded by RepoAllocationCreateResponse) +// on success, NackError on error message RepoAllocationCreateRequest { required string repo = 1; // Repo ID @@ -1039,6 +1043,13 @@ message RepoAllocationCreateRequest required uint32 rec_limit = 4; // Data record limit(count) } +message RepoAllocationCreateResponse +{ + required SDMS.ExecutionMethod execution_method = 1; // The execution method that was used to create the allocation + optional SDMS.TaskData task = 2; // The task data if deferred execution + optional SDMS.AllocData result = 3; // The Allocation data if direct execution +} + // Request to update an existing allocation. Only repo admins may make this // request. // Reply: AckReply on success, NackError on error diff --git a/common/source/operators/AuthenticationOperator.cpp b/common/source/operators/AuthenticationOperator.cpp index 9c9113f09..e611bd74f 100644 --- a/common/source/operators/AuthenticationOperator.cpp +++ b/common/source/operators/AuthenticationOperator.cpp @@ -33,8 +33,17 @@ void AuthenticationOperator::execute(IMessage &message) { std::string uid = "anon"; if (m_authentication_manager->hasKey(key)) { m_authentication_manager->incrementKeyAccessCounter(key); - uid = m_authentication_manager->getUID(key); + + try { + uid = m_authentication_manager->getUID(key); + } catch (const std::exception& e) { + // Log the exception to help diagnose authentication issues + std::cerr << "[AuthenticationOperator] Failed to get UID for key: " + << key.substr(0, 8) << "... Exception: " << e.what() << std::endl; + // Keep uid as "anon" if we fail to get the actual UID + } } + message.set(MessageAttribute::ID, uid); } diff --git a/common/tests/security/tcp_secure/test_tcp_insecure.sh b/common/tests/security/tcp_secure/test_tcp_insecure.sh index e89ba227d..d24e427b5 100755 --- a/common/tests/security/tcp_secure/test_tcp_insecure.sh +++ b/common/tests/security/tcp_secure/test_tcp_insecure.sh @@ -1,8 +1,7 @@ #!/bin/bash # If no arguments are provided assume command paths have not been passed in -if [ $# -eq 0 ] -then +if [ $# -eq 0 ]; then TIMEOUT_CMD="timeout" TCPDUMP_CMD="tcpdump" MAX_TEST_TIME_SEC=4 @@ -13,10 +12,8 @@ else fi # Check that pcap group exists and the user is part of it -if [ $(getent group pcap) ] -then - if id -nG "$USER" | grep -qw "pcap" - then +if [ $(getent group pcap) ]; then + if id -nG "$USER" | grep -qw "pcap"; then echo "CONTINUE" else echo "SKIPPING - user does not belong to pcap group cannot run tcp_secure test" @@ -27,28 +24,27 @@ else exit 0 fi -echo +echo echo "Running with:" echo "TCPDUMP: ${TCPDUMP_CMD}" echo "TIMEOUT: ${TIMEOUT_CMD}" echo "MAX_TEST_TIME: ${MAX_TEST_TIME_SEC}" # Grab the packets sent on the loop back interface (127.0.0.1) and port 7515 -output=$( ${TIMEOUT_CMD} ${MAX_TEST_TIME_SEC} ${TCPDUMP_CMD} -vvv -A port 7515 -i lo) -match=$( echo "$output" | grep token) +output=$(${TIMEOUT_CMD} ${MAX_TEST_TIME_SEC} ${TCPDUMP_CMD} -vvv -A port 7515 -i lo) +match=$(echo "$output" | grep token) echo "Content of grep ${match}" -# If '.magic_token' is returned from the network sniffer then we know that +# If '.magic_token' is returned from the network sniffer then we know that # the encryption is not working -if [[ "${match}" == ".magic_token" ]] -then +if [[ "${match}" == ".magic_token" ]]; then echo "SUCCESS - the connection is expected to be insecure" exit 0 else echo "FAILED - the connection is unreadable, either it is encrypted when it should not be or there is an error." echo " it could be the case that the permissions have changed on tcpdump. See the README for settings" echo " that must be enabled to run it correctly." - echo + echo echo "$output" exit 1 fi diff --git a/common/tests/security/tcp_secure/test_tcp_secure.sh b/common/tests/security/tcp_secure/test_tcp_secure.sh index e0e1b6053..cb4e4e4be 100755 --- a/common/tests/security/tcp_secure/test_tcp_secure.sh +++ b/common/tests/security/tcp_secure/test_tcp_secure.sh @@ -1,8 +1,7 @@ #!/bin/bash # If no arguments are provided assume command paths have not been passed in -if [ $# -eq 0 ] -then +if [ $# -eq 0 ]; then TIMEOUT_CMD="timeout" TCPDUMP_CMD="tcpdump" MAX_TEST_TIME_SEC=2 @@ -13,10 +12,8 @@ else fi # Check that pcap group exists and the user is part of it -if [ $(getent group pcap) ] -then - if id -nG "$USER" | grep -qw "pcap" - then +if [ $(getent group pcap) ]; then + if id -nG "$USER" | grep -qw "pcap"; then echo "CONTINUE" else echo "SKIPPING - user does not belong to pcap group cannot run tcp_secure test" @@ -34,13 +31,12 @@ echo "TIMEOUT: ${TIMEOUT_CMD}" echo "MAX_TEST_TIME: ${MAX_TEST_TIME_SEC}" # Grab the first 30 packets sent on the loop back interface (127.0.0.1) and port 7515 -match=$( "${TIMEOUT_CMD}" "${MAX_TEST_TIME_SEC}" "${TCPDUMP_CMD}" -vvv -A port 7515 -i lo | grep token) +match=$("${TIMEOUT_CMD}" "${MAX_TEST_TIME_SEC}" "${TCPDUMP_CMD}" -vvv -A port 7515 -i lo | grep token) echo "Content of grep ${match}" -# If '.magic_token' is returned from the network sniffer then we know that +# If '.magic_token' is returned from the network sniffer then we know that # the encryption is not working -if [[ "${match}" == ".magic_token" ]] -then +if [[ "${match}" == ".magic_token" ]]; then echo "FAILED - the connection is insecure we were able to pull out the token" exit 1 else diff --git a/common/tests/unit/test_Buffer.cpp b/common/tests/unit/test_Buffer.cpp index 74ff9dec8..e258b2b30 100644 --- a/common/tests/unit/test_Buffer.cpp +++ b/common/tests/unit/test_Buffer.cpp @@ -108,6 +108,70 @@ BOOST_AUTO_TEST_CASE(testing_Buffer_non_trivial2) { BOOST_CHECK(buffer.size() == array_size); } +BOOST_AUTO_TEST_CASE(testing_Buffer_googleprotobuf_repo_create_request) { + + ProtoBufMap proto_map; + ProtoBufFactory proto_factory; + + SDMS::Auth::RepoCreateRequest repo_create_req; + + const std::string id = "bonanza"; + const std::string title = "All you can eat."; + const std::string path = "/"; + const std::string address = "tcp://best_burgers.com"; + const std::string endpoint = ""; + const std::string pub_key; + uint64_t capacity = 0; + const std::string type = "globus"; + + repo_create_req.set_id(id); + repo_create_req.set_title(title); + repo_create_req.set_path(path); + repo_create_req.set_address(address); + repo_create_req.set_endpoint(endpoint); + repo_create_req.set_pub_key(pub_key); + repo_create_req.set_capacity(capacity); + repo_create_req.set_type(type); + + BOOST_CHECK(repo_create_req.id().compare(id) == 0); + BOOST_CHECK(repo_create_req.title().compare(title) == 0); + BOOST_CHECK(repo_create_req.path().compare(path) == 0); + BOOST_CHECK(repo_create_req.address().compare(address) == 0); + BOOST_CHECK(repo_create_req.endpoint().compare(endpoint) == 0); + BOOST_CHECK(repo_create_req.pub_key().compare(pub_key) == 0); + BOOST_CHECK(repo_create_req.capacity() == capacity); + BOOST_CHECK(repo_create_req.type().compare(type) == 0); + + Buffer buffer; + std::cout << "Calling Copy to buffer" << std::endl; + size_t size = repo_create_req.ByteSizeLong(); + copyToBuffer(buffer, &repo_create_req, size); + + BOOST_CHECK(buffer.size() == buffer.capacity()); + BOOST_CHECK(buffer.size() == repo_create_req.ByteSizeLong()); + + // Create a new message and copy the buffer into it + uint16_t msg_type = proto_map.getMessageType(repo_create_req); + std::unique_ptr<::google::protobuf::Message> new_msg = + proto_factory.create(msg_type); + + copyFromBuffer(new_msg.get(), buffer); + + auto new_repo_create_req = + dynamic_cast(new_msg.get()); + + BOOST_CHECK(new_repo_create_req->id().compare(id) == 0); + BOOST_CHECK(new_repo_create_req->title().compare(title) == 0); + BOOST_CHECK(new_repo_create_req->path().compare(path) == 0); + BOOST_CHECK(new_repo_create_req->address().compare(address) == 0); + BOOST_CHECK(new_repo_create_req->endpoint().compare(endpoint) == 0); + BOOST_CHECK(new_repo_create_req->pub_key().compare(pub_key) == 0); + BOOST_CHECK(new_repo_create_req->capacity() == capacity); + BOOST_CHECK(new_repo_create_req->type().compare(type) == 0); + + +} + BOOST_AUTO_TEST_CASE(testing_Buffer_googleprotobuf) { ProtoBufMap proto_map; diff --git a/compose/README.md b/compose/README.md index 4bdb021ec..3a8d50f19 100644 --- a/compose/README.md +++ b/compose/README.md @@ -37,6 +37,35 @@ Create the .env file fill in the missing components that are required. ```bash ./generate_env.sh ``` + +Note: For the DataFed web service container in the compose instance, the SSL +certificate and key paths are now hardcoded to + +    /opt/datafed/keys/cert.crt +    /opt/datafed/keys/cert.key + +Ensure that if you are replacing the self‐signed certificates manually, the new +certificates are placed in a keys folder (DataFed/compose/metadata|all/keys) that is +mounted by the container. + +An optional flag ‘--arango-use-ssl’ (or -a) has been added to the +generate_env.sh script. When this flag is set, additional SSL certificates for +ArangoDB will be generated and the .env file will be populated with the +following new variables: + +   DATAFED_ARANGO_CERT_PATH +   DATAFED_ARANGO_KEY_PATH +   DATAFED_ARANGO_PEM_PATH + +Be sure you have your keys folder correctly set up in (DataFed/compose/metadata|all/keys) so that +the ArangoDB container can mount it and locate the necessary certificate files. +If not using SSL with Arango, omit this flag so that the container will run +over TCP (HTTP). + +WARNING - If you do not want to run with HTTPS be sure to remove +datafed-arango.key, datafed-arango.pem, datafed-arango.crt from +(DataFed/compose/metadata|all/keys) folder. + ### 2. Fill in the needed .env variables for the Metadata Core Services The .env file will be created in the DataFed/compose/metadata folder and will be hidden. @@ -305,19 +334,36 @@ docker run --env-file .env \ To interact more directly with the container the '-i' flag can be added and the entrypoint file can be overwritten by including '--entrypoint /bin/bash' -## Common Errors +## Troubleshooting & Common Errors + +### Errors with HTTP and HTTPS for the ArangoDB instance + +It is advised to run the `generate_env.sh` script anytime you make changes to the +.env file. It is designed to keep existing variables while ensuring consistency +of compatible configuration arguments. + +To Turn on ssl. + +``` +./generate_env.sh --arango-use-ssl +``` + +If you want to turn it off you will have to be careful to remove the certificate +files that are located in the compose/metadata|all/keys folders. ### Errors during Compose up -Make sure all the ports that are needed are open on the local host. These +Make sure all the ports that are needed are open on the localhost. These include, ports -443 for the datafed-web and datafed-gcs container -7512 for the datafed-core container -50000-51000 for the datafed-gcs container -9000 for the datafed-repo container -80 for the datafed-gcs container -8512 for arangodb web server interface +| Port | Description | +|--------------|-------------------------------------------------| +| 443 | DataFed-web and DataFed-gcs container | +| 7512 | DataFed-core container | +| 50000–51000 | DataFed-gcs container | +| 9000 | DataFed-repo container | +| 80 | DataFed-gcs container | +| 8529 | ArangoDB web server interface | Make sure port 80 is not already bound on the host. Also note that the repo server keys should exist in the keys folder before running the gcs instance. diff --git a/compose/all/build_images_for_compose.sh b/compose/all/build_images_for_compose.sh index cf5d04e6e..19e16fab0 100755 --- a/compose/all/build_images_for_compose.sh +++ b/compose/all/build_images_for_compose.sh @@ -6,4 +6,4 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../../") -"${PROJECT_ROOT}/scripts/compose_build_images.sh" +"${PROJECT_ROOT}/scripts/compose_build_images.sh" $@ diff --git a/compose/all/cleanup_globus_files.sh b/compose/all/cleanup_globus_files.sh index e9990c5fd..99cdecaeb 100755 --- a/compose/all/cleanup_globus_files.sh +++ b/compose/all/cleanup_globus_files.sh @@ -4,4 +4,3 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../../") "${PROJECT_ROOT}/scripts/compose_cleanup_globus_files.sh" -d "$(pwd)" - diff --git a/compose/all/compose.yml b/compose/all/compose.yml index 280703601..7d2be0dee 100644 --- a/compose/all/compose.yml +++ b/compose/all/compose.yml @@ -10,11 +10,10 @@ services: DATAFED_GLOBUS_APP_SECRET: "${DATAFED_GLOBUS_APP_SECRET}" DATAFED_GLOBUS_APP_ID: "${DATAFED_GLOBUS_APP_ID}" DATAFED_ZEROMQ_SESSION_SECRET: "${DATAFED_ZEROMQ_SESSION_SECRET}" - DATAFED_ZEROMQ_SYSTEM_SECRET: "${DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${DATAFED_DOMAIN}" DATAFED_HTTPS_SERVER_PORT: "${DATAFED_HTTPS_SERVER_PORT}" - DATAFED_WEB_CERT_PATH: "${DATAFED_WEB_CERT_PATH}" - DATAFED_WEB_KEY_PATH: "${DATAFED_WEB_KEY_PATH}" + DATAFED_WEB_CERT_PATH: "/opt/datafed/keys/cert.crt" + DATAFED_WEB_KEY_PATH: "/opt/datafed/keys/cert.key" DATAFED_WEB_USER: "datafed" DATAFED_DEFAULT_LOG_PATH: "${DATAFED_CONTAINER_LOG_PATH}" DATAFED_CORE_ADDRESS_PORT_INTERNAL: "datafed-core:7513" @@ -37,16 +36,18 @@ services: DATAFED_GLOBUS_APP_SECRET: "${DATAFED_GLOBUS_APP_SECRET}" DATAFED_GLOBUS_APP_ID: "${DATAFED_GLOBUS_APP_ID}" DATAFED_ZEROMQ_SESSION_SECRET: "${DATAFED_ZEROMQ_SESSION_SECRET}" - DATAFED_ZEROMQ_SYSTEM_SECRET: "${DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${DATAFED_DOMAIN}" - DATAFED_WEB_CERT_PATH: "${DATAFED_WEB_CERT_PATH}" - DATAFED_WEB_KEY_PATH: "${DATAFED_WEB_KEY_PATH}" + DATAFED_WEB_CERT_PATH: "/opt/datafed/keys/cert.crt" + DATAFED_WEB_KEY_PATH: "/opt/datafed/keys/cert.key" DATAFED_DEFAULT_LOG_PATH: "${DATAFED_CONTAINER_LOG_PATH}" - UID: "${DATAFED_UID}" DATAFED_DATABASE_PASSWORD: "${DATAFED_DATABASE_PASSWORD}" DATAFED_DATABASE_IP_ADDRESS: "${DATAFED_DATABASE_IP_ADDRESS}" DATAFED_DATABASE_IP_ADDRESS_PORT: "${DATAFED_DATABASE_IP_ADDRESS}:${DATAFED_DATABASE_PORT}" DATAFED_CORE_LOG_LEVEL: "${DATAFED_CORE_LOG_LEVEL}" + SSL_CERT_FILE: "/opt/datafed/keys/datafed-arango.crt" + user: "${DATAFED_UID}:0" + security_opt: + - no-new-privileges:true ports: - 7513 # Communication web server - 7512:7512 # Secure core server communication must be exposed outside of the container @@ -60,16 +61,18 @@ services: image: datafed-foxx:latest depends_on: ["arango"] environment: - DATAFED_ZEROMQ_SYSTEM_SECRET: "${DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${DATAFED_DOMAIN}" DATAFED_DEFAULT_LOG_PATH: "${DATAFED_CONTAINER_LOG_PATH}" - UID: "${DATAFED_UID}" DATAFED_DATABASE_PASSWORD: "${DATAFED_DATABASE_PASSWORD}" DATAFED_DATABASE_IP_ADDRESS: "${DATAFED_DATABASE_IP_ADDRESS}" DATAFED_DATABASE_HOST: "arango" # NOTE enabling foxx tests will cause state changes in the database # do not run this unless you are ok with the database being wiped. ENABLE_FOXX_TESTS: "${DATAFED_ENABLE_FOXX_TESTS}" + SSL_CERT_FILE: "/usr/local/share/ca-certificates/datafed-arango.crt" + user: "${DATAFED_UID}:0" + security_opt: + - no-new-privileges:true healthcheck: test: ["CMD", "/bin/bash", "-c", "[ -f /tmp/.foxx_is_installed ]"] interval: 10s @@ -77,6 +80,7 @@ services: retries: 20 volumes: - foxx_tmp:/tmp + - ./keys/:/usr/local/share/ca-certificates/ networks: - datafed-internal @@ -86,17 +90,24 @@ services: ARANGO_ROOT_PASSWORD: "${DATAFED_DATABASE_PASSWORD}" volumes: - arango_db:/var/lib/arangodb3 + - ./keys/:/usr/local/share/ca-certificates/ ports: - 8529:8529 # Arangodb web UI networks: - datafed-internal + entrypoint: > + sh -c 'if [ -f /usr/local/share/ca-certificates/datafed-arango.pem ]; then + exec /entrypoint.sh --ssl.keyfile /usr/local/share/ca-certificates/datafed-arango.pem \ + --server.endpoint ssl://0.0.0.0:8529; + else + exec /entrypoint.sh --server.endpoint tcp://0.0.0.0:8529; + fi' # Needs the datafed-core to be up so it doesn't fail when trying to connect datafed-repo: depends_on: ["datafed-core"] environment: DATAFED_ZEROMQ_SESSION_SECRET: "${DATAFED_ZEROMQ_SESSION_SECRET}" - DATAFED_ZEROMQ_SYSTEM_SECRET: "${DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${DATAFED_DOMAIN}" DATAFED_HTTPS_SERVER_PORT: "${DATAFED_HTTPS_SERVER_PORT}" DATAFED_DEFAULT_LOG_PATH: "${DATAFED_CONTAINER_LOG_PATH}" @@ -123,7 +134,6 @@ services: depends_on: ["datafed-web"] environment: DATAFED_ZEROMQ_SESSION_SECRET: "${DATAFED_ZEROMQ_SESSION_SECRET}" - DATAFED_ZEROMQ_SYSTEM_SECRET: "${DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${DATAFED_DOMAIN}" DATAFED_HTTPS_SERVER_PORT: "${DATAFED_HTTPS_SERVER_PORT}" DATAFED_DEFAULT_LOG_PATH: "${DATAFED_CONTAINER_LOG_PATH}" @@ -134,7 +144,7 @@ services: DATAFED_GLOBUS_CONTROL_PORT: "${DATAFED_GLOBUS_CONTROL_PORT}" DATAFED_GCS_COLLECTION_BASE_PATH: "${DATAFED_GCS_COLLECTION_BASE_PATH}" DATAFED_GCS_COLLECTION_ROOT_PATH: "${DATAFED_GCS_COLLECTION_ROOT_PATH}" - DATAFED_REPO_USER: "${DATAFED_REPO_USER}" + DATAFED_REPO_USER: "datafed" UID: "${DATAFED_UID}" HOST_HOSTNAME: "localhost" DATAFED_AUTHZ_USER: "datafed" diff --git a/compose/all/generate_env.sh b/compose/all/generate_env.sh index 47be24538..23f80a82c 100755 --- a/compose/all/generate_env.sh +++ b/compose/all/generate_env.sh @@ -4,7 +4,6 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../../") # Variables specific to running the compose instance -export DATAFED_COMPOSE_REPO_DOMAIN="datafed-repo" - -"${PROJECT_ROOT}/scripts/compose_generate_env.sh" -d "$(pwd)" +export DATAFED_REPO_DOMAIN="datafed-repo" +"${PROJECT_ROOT}/scripts/compose_generate_env.sh" -d "$(pwd)" "$@" diff --git a/compose/metadata/build_metadata_images_for_compose.sh b/compose/metadata/build_metadata_images_for_compose.sh index 28f8f4de4..a63ed336f 100755 --- a/compose/metadata/build_metadata_images_for_compose.sh +++ b/compose/metadata/build_metadata_images_for_compose.sh @@ -8,17 +8,16 @@ PROJECT_ROOT=$(realpath "${SOURCE}/../../") BUILD_ARG_FILE="$SOURCE/.build-args" if [ $# -gt 0 ]; then - # Do not check if file already exists becuase other generate scripts - # from a different repo might have already put their args in the file - # and calling this script might be the second step. Where this step would - # be appending to an existing file. - BUILD_ARG_FILE="$1/.build-args" + # Do not check if file already exists becuase other generate scripts + # from a different repo might have already put their args in the file + # and calling this script might be the second step. Where this step would + # be appending to an existing file. + BUILD_ARG_FILE="$1/.build-args" fi # Generate arg list -if [ ! -f "$BUILD_ARG_FILE" ] -then +if [ ! -f "$BUILD_ARG_FILE" ]; then echo "Missing .build-args file, please run generate_build_args.sh first." fi diff --git a/compose/metadata/compose.yml b/compose/metadata/compose.yml index 53a81eb97..3ee54ee7f 100644 --- a/compose/metadata/compose.yml +++ b/compose/metadata/compose.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: datafed-web: depends_on: ["datafed-core"] @@ -7,11 +5,10 @@ services: DATAFED_GLOBUS_APP_SECRET: "${DATAFED_GLOBUS_APP_SECRET}" DATAFED_GLOBUS_APP_ID: "${DATAFED_GLOBUS_APP_ID}" DATAFED_ZEROMQ_SESSION_SECRET: "${DATAFED_ZEROMQ_SESSION_SECRET}" - DATAFED_ZEROMQ_SYSTEM_SECRET: "${DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${DATAFED_DOMAIN}" DATAFED_HTTPS_SERVER_PORT: "${DATAFED_HTTPS_SERVER_PORT}" - DATAFED_WEB_CERT_PATH: "${DATAFED_WEB_CERT_PATH}" - DATAFED_WEB_KEY_PATH: "${DATAFED_WEB_KEY_PATH}" + DATAFED_WEB_CERT_PATH: "/opt/datafed/keys/cert.crt" + DATAFED_WEB_KEY_PATH: "/opt/datafed/keys/cert.key" DATAFED_WEB_USER: "datafed" DATAFED_DEFAULT_LOG_PATH: "${DATAFED_CONTAINER_LOG_PATH}" DATAFED_CORE_ADDRESS_PORT_INTERNAL: "datafed-core:7513" @@ -34,16 +31,17 @@ services: DATAFED_GLOBUS_APP_SECRET: "${DATAFED_GLOBUS_APP_SECRET}" DATAFED_GLOBUS_APP_ID: "${DATAFED_GLOBUS_APP_ID}" DATAFED_ZEROMQ_SESSION_SECRET: "${DATAFED_ZEROMQ_SESSION_SECRET}" - DATAFED_ZEROMQ_SYSTEM_SECRET: "${DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${DATAFED_DOMAIN}" - DATAFED_WEB_CERT_PATH: "${DATAFED_WEB_CERT_PATH}" - DATAFED_WEB_KEY_PATH: "${DATAFED_WEB_KEY_PATH}" + DATAFED_WEB_CERT_PATH: "/opt/datafed/keys/cert.crt" + DATAFED_WEB_KEY_PATH: "/opt/datafed/keys/cert.key" DATAFED_DEFAULT_LOG_PATH: "${DATAFED_CONTAINER_LOG_PATH}" - UID: "${DATAFED_UID}" DATAFED_DATABASE_PASSWORD: "${DATAFED_DATABASE_PASSWORD}" DATAFED_DATABASE_IP_ADDRESS: "${DATAFED_DATABASE_IP_ADDRESS}" DATAFED_DATABASE_IP_ADDRESS_PORT: "${DATAFED_DATABASE_IP_ADDRESS}:${DATAFED_DATABASE_PORT}" DATAFED_CORE_LOG_LEVEL: "${DATAFED_CORE_LOG_LEVEL}" + user: "${DATAFED_UID}:0" + security_opt: + - no-new-privileges:true ports: - 7513 # Communication web server - 7512:7512 # Secure core server communication must be exposed outside of the container @@ -57,16 +55,18 @@ services: image: datafed-foxx:latest depends_on: ["arango"] environment: - DATAFED_ZEROMQ_SYSTEM_SECRET: "${DATAFED_ZEROMQ_SYSTEM_SECRET}" DATAFED_DOMAIN: "${DATAFED_DOMAIN}" DATAFED_DEFAULT_LOG_PATH: "${DATAFED_CONTAINER_LOG_PATH}" - UID: "${DATAFED_UID}" DATAFED_DATABASE_PASSWORD: "${DATAFED_DATABASE_PASSWORD}" DATAFED_DATABASE_IP_ADDRESS: "${DATAFED_DATABASE_IP_ADDRESS}" DATAFED_DATABASE_HOST: "arango" # NOTE enabling foxx tests will cause state changes in the database # do not run this unless you are ok with the database being wiped. ENABLE_FOXX_TESTS: "${DATAFED_ENABLE_FOXX_TESTS}" + SSL_CERT_FILE: "/usr/local/share/ca-certificates/datafed-arango.crt" + user: "${DATAFED_UID}:0" + security_opt: + - no-new-privileges:true healthcheck: test: ["CMD", "/bin/bash", "-c", "[ -f /tmp/.foxx_is_installed ]"] interval: 10s @@ -74,6 +74,7 @@ services: retries: 20 volumes: - foxx_tmp:/tmp + - ./keys/:/usr/local/share/ca-certificates/ networks: - datafed-internal @@ -83,10 +84,18 @@ services: ARANGO_ROOT_PASSWORD: "${DATAFED_DATABASE_PASSWORD}" volumes: - arango_db:/var/lib/arangodb3 + - ./keys/:/usr/local/share/ca-certificates/ ports: - 8529:8529 # Arangodb web UI networks: - datafed-internal + entrypoint: > + sh -c 'if [ -f /usr/local/share/ca-certificates/datafed-arango.pem ]; then + exec /entrypoint.sh --ssl.keyfile /usr/local/share/ca-certificates/datafed-arango.pem \ + --server.endpoint ssl://0.0.0.0:8529; + else + exec /entrypoint.sh --server.endpoint tcp://0.0.0.0:8529; + fi' # Fox tmp is used so that if docker compose up is run a second time it won't # need to overwrite the database it will simply use the existing one hence diff --git a/compose/metadata/generate_build_args.sh b/compose/metadata/generate_build_args.sh index 6a054ddbc..e4595bcaf 100755 --- a/compose/metadata/generate_build_args.sh +++ b/compose/metadata/generate_build_args.sh @@ -22,14 +22,13 @@ if [ $# -gt 0 ]; then else # Force the user to manaully rm the file to avoid accidental overwrites. - if [ -f "$BUILD_ARG_FILE" ] - then + if [ -f "$BUILD_ARG_FILE" ]; then echo "$BUILD_ARG_FILE already exist! Will not overwrite!" exit 0 fi fi # Needs to append to the ./build-args.sh file not overwrite. -cat << EOF >> "$BUILD_ARG_FILE" -BASE_IMAGE=ubuntu:focal +cat <>"$BUILD_ARG_FILE" +BASE_IMAGE=debian:bookworm-slim EOF diff --git a/compose/metadata/generate_env.sh b/compose/metadata/generate_env.sh index aed7c70e4..bfd4ca0ac 100755 --- a/compose/metadata/generate_env.sh +++ b/compose/metadata/generate_env.sh @@ -3,5 +3,4 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../../") -"${PROJECT_ROOT}/scripts/compose_generate_env.sh" -d "$(pwd)" -m - +"${PROJECT_ROOT}/scripts/compose_generate_env.sh" -d "$(pwd)" -m "$@" diff --git a/compose/repo/cleanup_globus_files.sh b/compose/repo/cleanup_globus_files.sh index e9990c5fd..99cdecaeb 100755 --- a/compose/repo/cleanup_globus_files.sh +++ b/compose/repo/cleanup_globus_files.sh @@ -4,4 +4,3 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../../") "${PROJECT_ROOT}/scripts/compose_cleanup_globus_files.sh" -d "$(pwd)" - diff --git a/compose/repo/compose.yml b/compose/repo/compose.yml index 463012ee3..efdd75eb8 100644 --- a/compose/repo/compose.yml +++ b/compose/repo/compose.yml @@ -47,7 +47,7 @@ services: DATAFED_GLOBUS_CONTROL_PORT: "${DATAFED_GLOBUS_CONTROL_PORT}" DATAFED_GCS_COLLECTION_BASE_PATH: "${DATAFED_GCS_COLLECTION_BASE_PATH}" DATAFED_GCS_COLLECTION_ROOT_PATH: "${DATAFED_GCS_COLLECTION_ROOT_PATH}" - DATAFED_REPO_USER: "${DATAFED_REPO_USER}" + DATAFED_REPO_USER: "datafed" UID: "${DATAFED_UID}" HOST_HOSTNAME: "localhost" DATAFED_AUTHZ_USER: "datafed" diff --git a/compose/repo/generate_env.sh b/compose/repo/generate_env.sh index 31eca3ec5..b5c6c3f18 100755 --- a/compose/repo/generate_env.sh +++ b/compose/repo/generate_env.sh @@ -4,4 +4,3 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../../") "${PROJECT_ROOT}/scripts/compose_generate_env.sh" -d "$(pwd)" -r - diff --git a/core/database/CMakeLists.txt b/core/database/CMakeLists.txt index 17bdd6da1..f55f842d2 100644 --- a/core/database/CMakeLists.txt +++ b/core/database/CMakeLists.txt @@ -13,19 +13,26 @@ configure_file( if( ENABLE_FOXX_TESTS ) add_test(NAME foxx_setup COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_setup.sh") add_test(NAME foxx_teardown COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_teardown.sh") - add_test(NAME foxx_authz COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_authz") - add_test(NAME foxx_record COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_record") - add_test(NAME foxx_repo COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_repo") - add_test(NAME foxx_path COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_path") add_test(NAME foxx_db_fixtures COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_fixture_setup.sh") - add_test(NAME foxx_version COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_version") - add_test(NAME foxx_support COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_support") - add_test(NAME foxx_user_router COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_user_router") - add_test(NAME foxx_authz_router COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_authz_router") - add_test(NAME foxx_unit_user_token COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_user_token") - add_test(NAME foxx_unit_user_model COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_user_model") - add_test(NAME foxx_unit_globus_collection_model COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_globus_collection_model") - add_test(NAME foxx_unit_globus_token_model COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_globus_token_model") + + add_test(NAME foxx_authz COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_authz:") + add_test(NAME foxx_record COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_record:") + add_test(NAME foxx_repo COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_repo:") + add_test(NAME foxx_repo_globus COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_repository_globus:") + add_test(NAME foxx_repo_metadata COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_repository_metadata:") + add_test(NAME foxx_base_repo COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_base_repository:") + add_test(NAME foxx_repositories COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "integration_repositories:") + add_test(NAME foxx_repo_router COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "integration_repo_router:") + add_test(NAME foxx_validation_repo COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_validation_repository:") + add_test(NAME foxx_path COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_path:") + add_test(NAME foxx_version COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_version:") + add_test(NAME foxx_support COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_support:") + add_test(NAME foxx_user_router COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_user_router:") + add_test(NAME foxx_authz_router COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_authz_router:") + add_test(NAME foxx_unit_user_token COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_user_token:") + add_test(NAME foxx_unit_user_model COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_user_model:") + add_test(NAME foxx_unit_globus_collection_model COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_globus_collection_model:") + add_test(NAME foxx_unit_globus_token_model COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_foxx.sh" -t "unit_globus_token_model:") set_tests_properties(foxx_setup PROPERTIES FIXTURES_SETUP Foxx) set_tests_properties(foxx_teardown PROPERTIES FIXTURES_CLEANUP Foxx) @@ -36,6 +43,12 @@ if( ENABLE_FOXX_TESTS ) set_tests_properties(foxx_authz_router PROPERTIES FIXTURES_REQUIRED Foxx) set_tests_properties(foxx_record PROPERTIES FIXTURES_REQUIRED Foxx) set_tests_properties(foxx_repo PROPERTIES FIXTURES_REQUIRED Foxx) + set_tests_properties(foxx_repo_globus PROPERTIES FIXTURES_REQUIRED Foxx) + set_tests_properties(foxx_repo_metadata PROPERTIES FIXTURES_REQUIRED Foxx) + set_tests_properties(foxx_base_repo PROPERTIES FIXTURES_REQUIRED Foxx) + set_tests_properties(foxx_repositories PROPERTIES FIXTURES_REQUIRED Foxx) + set_tests_properties(foxx_repo_router PROPERTIES FIXTURES_REQUIRED Foxx) + set_tests_properties(foxx_validation_repo PROPERTIES FIXTURES_REQUIRED Foxx) set_tests_properties(foxx_path PROPERTIES FIXTURES_REQUIRED Foxx) set_tests_properties(foxx_user_router PROPERTIES FIXTURES_REQUIRED "Foxx;FoxxDBFixtures") set_tests_properties(foxx_unit_user_token PROPERTIES FIXTURES_REQUIRED Foxx) diff --git a/core/database/foxx/api/acl_router.js b/core/database/foxx/api/acl_router.js index 9f66b643c..336afbc00 100644 --- a/core/database/foxx/api/acl_router.js +++ b/core/database/foxx/api/acl_router.js @@ -5,6 +5,8 @@ const router = createRouter(); const joi = require("joi"); const g_db = require("@arangodb").db; const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); module.exports = router; @@ -37,20 +39,24 @@ router else is_coll = false; if (!is_coll && object._id[0] != "d") - throw [g_lib.ERR_INVALID_PARAM, "Invalid object type, " + object._id]; + throw [error.ERR_INVALID_PARAM, "Invalid object type, " + object._id]; var is_admin = true; - if (!g_lib.hasAdminPermObject(client, object._id)) { + if (!permissions.hasAdminPermObject(client, object._id)) { is_admin = false; - if (!g_lib.hasPermissions(client, object, g_lib.PERM_SHARE)) - throw g_lib.ERR_PERM_DENIED; + if (!permissions.hasPermissions(client, object, permissions.PERM_SHARE)) + throw error.ERR_PERM_DENIED; } var client_perm, cur_rules; if (!is_admin) { - client_perm = g_lib.getPermissions(client, object, g_lib.PERM_ALL); + client_perm = permissions.getPermissions( + client, + object, + permissions.PERM_ALL, + ); cur_rules = g_db ._query( "for v, e in 1..1 outbound @object acl return { id: v._id, gid: v.gid, grant: e.grant, inhgrant: e.inhgrant }", @@ -77,7 +83,7 @@ router if (!is_coll && rule.inhgrant) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Inherited permissions cannot be applied to data records", ]; @@ -89,13 +95,13 @@ router }); if (!group) - throw [g_lib.ERR_NOT_FOUND, "Group " + rule.id + " not found"]; + throw [error.ERR_NOT_FOUND, "Group " + rule.id + " not found"]; rule.id = group._id; } else { acl_mode |= 1; if (!g_db._exists(rule.id)) - throw [g_lib.ERR_NOT_FOUND, "User " + rule.id + " not found"]; + throw [error.ERR_NOT_FOUND, "User " + rule.id + " not found"]; } if (!is_admin) { @@ -108,7 +114,10 @@ router old_rule = cur_rules[old_rule]; if (old_rule.grant != rule.grant) { chg = old_rule.grant ^ rule.grant; - if ((chg & client_perm) != (chg & ~g_lib.PERM_SHARE)) { + if ( + (chg & client_perm) != + (chg & ~permissions.PERM_SHARE) + ) { console.log( "bad alter", rule.id, @@ -117,7 +126,7 @@ router client_perm, ); throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Attempt to alter protected permissions on " + rule.id + " ACL.", @@ -126,7 +135,7 @@ router } } else { if ( - rule.grant & g_lib.PERM_SHARE || + rule.grant & permissions.PERM_SHARE || (rule.grant & client_perm) != rule.grant ) { console.log( @@ -137,7 +146,7 @@ router client_perm, ); throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Attempt to exceed controlled permissions on " + rule.id + " ACL.", @@ -199,11 +208,11 @@ router var object = g_lib.getObject(req.queryParams.id, client); if (object._id[0] != "c" && object._id[0] != "d") - throw [g_lib.ERR_INVALID_PARAM, "Invalid object type, " + object._id]; + throw [error.ERR_INVALID_PARAM, "Invalid object type, " + object._id]; - if (!g_lib.hasAdminPermObject(client, object._id)) { - if (!g_lib.hasPermissions(client, object, g_lib.PERM_SHARE)) - throw g_lib.ERR_PERM_DENIED; + if (!permissions.hasAdminPermObject(client, object._id)) { + if (!permissions.hasPermissions(client, object, permissions.PERM_SHARE)) + throw error.ERR_PERM_DENIED; } var rules = g_db @@ -259,7 +268,7 @@ router // Verify project exists if (!g_db._exists(owner_id)) - throw [g_lib.ERR_NOT_FOUND, "Project " + owner_id + " not found"]; + throw [error.ERR_NOT_FOUND, "Project " + owner_id + " not found"]; } else { owner_id = g_lib.getUserFromClientID(req.queryParams.owner)._id; } @@ -420,12 +429,12 @@ function dedupShares(client, shares) { for (k = path.path.length - 1; k > 0; k--) { coll = g_db.c.document(path.path[k]); - perm = g_lib.getPermissionsLocal(client._id, coll); - if (perm.inhgrant & g_lib.PERM_LIST) { + perm = permissions.getPermissionsLocal(client._id, coll); + if (perm.inhgrant & permissions.PERM_LIST) { k = 0; break; } - if ((perm.grant & g_lib.PERM_LIST) == 0) break; + if ((perm.grant & permissions.PERM_LIST) == 0) break; } if (k == 0) { @@ -492,11 +501,11 @@ router.get('/by_proj/list', function (req, res) { // Verify owner ID is a project if ( !owner_id.startsWith( "p/" )) - throw [g_lib.ERR_INVALID_PARAM,"Invalid project ID: "+owner_id]; + throw [error.ERR_INVALID_PARAM,"Invalid project ID: "+owner_id]; // Verify owner exists if ( !g_db._exists( owner_id )) - throw [g_lib.ERR_NOT_FOUND,"Project "+owner_id+" not found"]; + throw [error.ERR_NOT_FOUND,"Project "+owner_id+" not found"]; var shares = g_db._query("for v in 1..2 inbound @client member, acl filter v.owner == @owner return {id:v._id,title:v.title,alias:v.alias, doi:v.doi,locked:v.locked}", { client: client._id, owner: owner_id }).toArray(); diff --git a/core/database/foxx/api/admin_router.js b/core/database/foxx/api/admin_router.js index 977a6ad70..9468118f1 100644 --- a/core/database/foxx/api/admin_router.js +++ b/core/database/foxx/api/admin_router.js @@ -6,6 +6,7 @@ const joi = require("joi"); const g_db = require("@arangodb").db; const g_lib = require("./support"); +const permissions = require("./lib/permissions"); //const perf = require('@arangodb/foxx'); module.exports = router; @@ -27,7 +28,6 @@ router .get("/test", function (req, res) { try { const client = g_lib.getUserFromClientID(req.queryParams.client); - //var perms = req.queryParams.perms?req.queryParams.perms:g_lib.PERM_ALL; var result = true; var item = g_lib.resolveID(req.queryParams.item, client); var obj = g_db[item[0]].document(item); @@ -35,8 +35,7 @@ router var t1 = new Date(); for (var i = 0; i < 1000; i++) { - result = g_lib.hasPermissions(client, obj, 3); - //result = g_lib.getPermissions( client, obj, 255 ); + result = permissions.hasPermissions(client, obj, 3); } var t2 = new Date(); diff --git a/core/database/foxx/api/authz.js b/core/database/foxx/api/authz.js index 94950d541..8ecbd8227 100644 --- a/core/database/foxx/api/authz.js +++ b/core/database/foxx/api/authz.js @@ -5,6 +5,8 @@ const path = require("path"); const Record = require("./record"); const pathModule = require("./posix_path"); const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); const { Repo, PathType } = require("./repo"); module.exports = (function () { @@ -36,26 +38,26 @@ module.exports = (function () { const data_id = "d/" + a_data_key; // If the user is not an admin of the object we will need // to check if the user has the write authorization - if (g_lib.hasAdminPermObject(a_client, data_id)) { + if (permissions.hasAdminPermObject(a_client, data_id)) { return true; } let data = g_db.d.document(data_id); // Grab the data item - if (g_lib.hasPermissions(a_client, data, a_perm)) { + if (permissions.hasPermissions(a_client, data, a_perm)) { return true; } return false; }; obj.readRecord = function (client, path) { - const permission = g_lib.PERM_RD_DATA; + const permission = permissions.PERM_RD_DATA; const path_components = pathModule.splitPOSIXPath(path); const data_key = path_components.at(-1); let record = new Record(data_key); if (!record.exists()) { // Return not found error for non-existent records console.log("AUTHZ act: read client: " + client._id + " path " + path + " NOT_FOUND"); - throw [g_lib.ERR_NOT_FOUND, "Record not found: " + path]; + throw [error.ERR_NOT_FOUND, "Record not found: " + path]; } // Special case - allow unknown client to read a publicly accessible record @@ -64,14 +66,14 @@ module.exports = (function () { if (!g_lib.hasPublicRead(record.id())) { console.log("AUTHZ act: read" + " unknown client " + " path " + path + " FAILED"); throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Unknown client does not have read permissions on " + path, ]; } } else if (!obj.isRecordActionAuthorized(client, data_key, permission)) { console.log("AUTHZ act: read" + " client: " + client._id + " path " + path + " FAILED"); throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Client " + client._id + " does not have read permissions on " + path, ]; } @@ -83,15 +85,15 @@ module.exports = (function () { }; obj.none = function (client, path) { - const permission = g_lib.PERM_NONE; + const permission = permissions.PERM_NONE; }; obj.denied = function (client, path) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; }; obj.createRecord = function (client, path) { - const permission = g_lib.PERM_WR_DATA; + const permission = permissions.PERM_WR_DATA; const path_components = pathModule.splitPOSIXPath(path); const data_key = path_components.at(-1); @@ -100,7 +102,7 @@ module.exports = (function () { "AUTHZ act: create" + " client: " + client._id + " path " + path + " FAILED", ); throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Unknown client does not have create permissions on " + path, ]; } else if (!obj.isRecordActionAuthorized(client, data_key, permission)) { @@ -108,7 +110,7 @@ module.exports = (function () { "AUTHZ act: create" + " client: " + client._id + " path " + path + " FAILED", ); throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Client " + client._id + " does not have create permissions on " + path, ]; } @@ -119,7 +121,7 @@ module.exports = (function () { if (!record.exists()) { // If the record does not exist then the path would not be consistent. console.log("AUTHZ act: create client: " + client._id + " path " + path + " FAILED"); - throw [g_lib.ERR_PERM_DENIED, "Invalid record specified: " + path]; + throw [error.ERR_PERM_DENIED, "Invalid record specified: " + path]; } // This will tell us if the proposed path is consistent with what we expect diff --git a/core/database/foxx/api/authz_router.js b/core/database/foxx/api/authz_router.js index ff160e764..162585499 100644 --- a/core/database/foxx/api/authz_router.js +++ b/core/database/foxx/api/authz_router.js @@ -5,6 +5,8 @@ const router = createRouter(); const joi = require("joi"); const g_db = require("@arangodb").db; const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); const authzModule = require("./authz"); const { Repo, PathType } = require("./repo"); @@ -48,7 +50,7 @@ router req.queryParams.file + " FAILED", ); - throw [g_lib.ERR_PERM_DENIED, "Unknown client: " + req.queryParams.client]; + throw [error.ERR_PERM_DENIED, "Unknown client: " + req.queryParams.client]; } let repo = new Repo(req.queryParams.repo); let path_type = repo.pathType(req.queryParams.file); @@ -65,7 +67,7 @@ router " FAILED", ); throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Unknown path, or path is not consistent with supported repository folder hierarchy: " + req.queryParams.file, ]; @@ -79,7 +81,7 @@ router req.queryParams.file, ); } else { - throw [g_lib.ERR_INVALID_PARAM, "Invalid gridFTP action: ", req.queryParams.act]; + throw [error.ERR_INVALID_PARAM, "Invalid gridFTP action: ", req.queryParams.act]; } console.log( "AUTHZ act: " + @@ -113,37 +115,37 @@ router .get("/perm/check", function (req, res) { try { const client = g_lib.getUserFromClientID(req.queryParams.client); - var perms = req.queryParams.perms ? req.queryParams.perms : g_lib.PERM_ALL; + var perms = req.queryParams.perms ? req.queryParams.perms : permissions.PERM_ALL; var obj, result = true, id = g_lib.resolveID(req.queryParams.id, client), ty = id[0]; if (id[1] != "/") { - throw [g_lib.ERR_INVALID_PARAM, "Invalid ID, " + req.queryParams.id]; + throw [error.ERR_INVALID_PARAM, "Invalid ID, " + req.queryParams.id]; } if (ty == "p") { var role = g_lib.getProjectRole(client._id, id); if (role == g_lib.PROJ_NO_ROLE) { // Non members have only VIEW permissions - if (perms != g_lib.PERM_RD_REC) result = false; + if (perms != permissions.PERM_RD_REC) result = false; } else if (role == g_lib.PROJ_MEMBER) { // Non members have only VIEW permissions - if ((perms & ~g_lib.PERM_MEMBER) != 0) result = false; + if ((perms & ~permissions.PERM_MEMBER) != 0) result = false; } else if (role == g_lib.PROJ_MANAGER) { // Managers have all but UPDATE - if ((perms & ~g_lib.PERM_MANAGER) != 0) result = false; + if ((perms & ~permissions.PERM_MANAGER) != 0) result = false; } } else if (ty == "d") { - if (!g_lib.hasAdminPermObject(client, id)) { + if (!permissions.hasAdminPermObject(client, id)) { obj = g_db.d.document(id); if (obj.locked) result = false; - else result = g_lib.hasPermissions(client, obj, perms); + else result = permissions.hasPermissions(client, obj, perms); } } else if (ty == "c") { // If create perm is requested, ensure owner of collection has at least one allocation - if (perms & g_lib.PERM_CREATE) { + if (perms & permissions.PERM_CREATE) { var owner = g_db.owner.firstExample({ _from: id, }); @@ -153,18 +155,18 @@ router }) ) { throw [ - g_lib.ERR_NO_ALLOCATION, + error.ERR_NO_ALLOCATION, "An allocation is required to create a collection.", ]; } } - if (!g_lib.hasAdminPermObject(client, id)) { + if (!permissions.hasAdminPermObject(client, id)) { obj = g_db.c.document(id); - result = g_lib.hasPermissions(client, obj, perms); + result = permissions.hasPermissions(client, obj, perms); } } else { - throw [g_lib.ERR_INVALID_PARAM, "Invalid ID, " + req.queryParams.id]; + throw [error.ERR_INVALID_PARAM, "Invalid ID, " + req.queryParams.id]; } res.send({ @@ -184,36 +186,36 @@ router .get("/perm/get", function (req, res) { try { const client = g_lib.getUserFromClientID(req.queryParams.client); - var result = req.queryParams.perms ? req.queryParams.perms : g_lib.PERM_ALL; + var result = req.queryParams.perms ? req.queryParams.perms : permissions.PERM_ALL; var obj, id = g_lib.resolveID(req.queryParams.id, client), ty = id[0]; - if (id[1] != "/") throw [g_lib.ERR_INVALID_PARAM, "Invalid ID, " + req.queryParams.id]; + if (id[1] != "/") throw [error.ERR_INVALID_PARAM, "Invalid ID, " + req.queryParams.id]; if (ty == "p") { var role = g_lib.getProjectRole(client._id, id); if (role == g_lib.PROJ_NO_ROLE) { // Non members have only VIEW permissions - result &= g_lib.PERM_RD_REC; + result &= permissions.PERM_RD_REC; } else if (role == g_lib.PROJ_MEMBER) { - result &= g_lib.PERM_MEMBER; + result &= permissions.PERM_MEMBER; } else if (role == g_lib.PROJ_MANAGER) { // Managers have all but UPDATE - result &= g_lib.PERM_MANAGER; + result &= permissions.PERM_MANAGER; } } else if (ty == "d") { - if (!g_lib.hasAdminPermObject(client, id)) { + if (!permissions.hasAdminPermObject(client, id)) { obj = g_db.d.document(id); if (obj.locked) result = 0; - else result = g_lib.getPermissions(client, obj, result); + else result = permissions.getPermissions(client, obj, result); } } else if (ty == "c") { - if (!g_lib.hasAdminPermObject(client, id)) { + if (!permissions.hasAdminPermObject(client, id)) { obj = g_db.c.document(id); - result = g_lib.getPermissions(client, obj, result); + result = permissions.getPermissions(client, obj, result); } - } else throw [g_lib.ERR_INVALID_PARAM, "Invalid ID, " + req.queryParams.id]; + } else throw [error.ERR_INVALID_PARAM, "Invalid ID, " + req.queryParams.id]; res.send({ granted: result, diff --git a/core/database/foxx/api/coll_router.js b/core/database/foxx/api/coll_router.js index 98383210f..e3c66b21d 100644 --- a/core/database/foxx/api/coll_router.js +++ b/core/database/foxx/api/coll_router.js @@ -7,6 +7,8 @@ const joi = require("joi"); const g_db = require("@arangodb").db; const g_graph = require("@arangodb/general-graph")._graph("sdmsg"); const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); module.exports = router; @@ -37,17 +39,17 @@ router _from: parent_id, })._to; if (owner_id != client._id) { - if (!g_lib.hasManagerPermProj(client, owner_id)) { + if (!permissions.hasManagerPermProj(client, owner_id)) { var parent_coll = g_db.c.document(parent_id); if ( - !g_lib.hasPermissions( + !permissions.hasPermissions( client, parent_coll, - g_lib.PERM_CREATE, + permissions.PERM_CREATE, ) ) - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } owner = g_db._document(owner_id); } @@ -62,7 +64,7 @@ router }) ) { throw [ - g_lib.ERR_NO_ALLOCATION, + error.ERR_NO_ALLOCATION, "An allocation is required to create a collection.", ]; } @@ -79,7 +81,7 @@ router .next(); if (count >= owner.max_coll) throw [ - g_lib.ERR_ALLOCATION_EXCEEDED, + error.ERR_ALLOCATION_EXCEEDED, "Collection limit reached (" + owner.max_coll + "). Contact system administrator to increase limit.", @@ -232,7 +234,7 @@ router //console.log("coll obj:",obj); - if (!g_lib.hasAdminPermObject(client, coll_id)) { + if (!permissions.hasAdminPermObject(client, coll_id)) { var perms = 0; if ( @@ -240,12 +242,12 @@ router obj.alias !== undefined || obj.desc !== undefined ) - perms |= g_lib.PERM_WR_REC; + perms |= permissions.PERM_WR_REC; - if (obj.topic !== undefined) perms |= g_lib.PERM_SHARE; + if (obj.topic !== undefined) perms |= permissions.PERM_SHARE; - if (!g_lib.hasPermissions(client, coll, perms)) - throw g_lib.ERR_PERM_DENIED; + if (!permissions.hasPermissions(client, coll, perms)) + throw error.ERR_PERM_DENIED; } /* Updating topic and tags is complex because topic parts are added as @@ -422,16 +424,16 @@ router admin = false; if (client) { - admin = g_lib.hasAdminPermObject(client, coll_id); + admin = permissions.hasAdminPermObject(client, coll_id); if (!admin) { - if (!g_lib.hasPermissions(client, coll, g_lib.PERM_RD_REC)) { + if (!permissions.hasPermissions(client, coll, permissions.PERM_RD_REC)) { //console.log("perm denied"); - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } } else if (!g_lib.hasPublicRead(coll_id)) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } coll.notes = g_lib.getNoteMask(client, coll, admin); @@ -463,14 +465,14 @@ router admin = false; if (client) { - admin = g_lib.hasAdminPermObject(client, coll_id); + admin = permissions.hasAdminPermObject(client, coll_id); if (!admin) { - if (!g_lib.hasPermissions(client, coll, g_lib.PERM_LIST)) - throw g_lib.ERR_PERM_DENIED; + if (!permissions.hasPermissions(client, coll, permissions.PERM_LIST)) + throw error.ERR_PERM_DENIED; } } else if (!g_lib.hasPublicRead(coll_id)) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } var qry = @@ -540,7 +542,7 @@ router if (req.queryParams.add && req.queryParams.remove) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Cannot add and remove collection items at the same time.", ]; } @@ -552,13 +554,11 @@ router })._to; var chk_perm = false; - if (!g_lib.hasAdminPermObject(client, coll_id)) { - var req_perm = g_lib.PERM_LINK; - //if ( req.queryParams.remove && req.queryParams.remove.length ) - // req_perm |= g_lib.PERM_SHARE; - if (!g_lib.hasPermissions(client, coll, req_perm, true)) + if (!permissions.hasAdminPermObject(client, coll_id)) { + var req_perm = permissions.PERM_LINK; + if (!permissions.hasPermissions(client, coll, req_perm, true)) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied - requires LINK on collection.", ]; @@ -595,7 +595,7 @@ router }) ) throw [ - g_lib.ERR_UNLINK, + error.ERR_UNLINK, obj._id + " is not in collection " + coll_id, ]; @@ -603,7 +603,7 @@ router // Check if another instance exists in same scope, if not deny permission if (!g_lib.hasAnyCommonAccessScope(obj._id, coll_id)) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Cannot unlink items owned by other users.", ]; } @@ -641,7 +641,7 @@ router //console.log("coll item count:",cres.count()); if (cres.count() + req.queryParams.add.length > g_lib.MAX_COLL_ITEMS) throw [ - g_lib.ERR_INPUT_TOO_LONG, + error.ERR_INPUT_TOO_LONG, "Collection item limit exceeded (" + g_lib.MAX_COLL_ITEMS + " items)", @@ -659,10 +659,10 @@ router _to: obj._id, }) ) - throw [g_lib.ERR_LINK, obj._id + " already linked to " + coll_id]; + throw [error.ERR_LINK, obj._id + " already linked to " + coll_id]; // Check if item is a root collection - if (obj.is_root) throw [g_lib.ERR_LINK, "Cannot link root collection"]; + if (obj.is_root) throw [error.ERR_LINK, "Cannot link root collection"]; // Check if item has same owner as this collection if ( @@ -671,7 +671,7 @@ router })._to != owner_id ) throw [ - g_lib.ERR_LINK, + error.ERR_LINK, obj._id + " and " + coll_id + " have different owners", ]; @@ -679,7 +679,7 @@ router // TODO check if another instance exists in same scope, if not deny if (!g_lib.hasAnyCommonAccessScope(obj._id, coll_id)) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Cannot link items from other access-control scopes.", ]; } @@ -689,7 +689,7 @@ router // Check for circular dependency if (obj._id == coll_id || g_lib.isSrcParentOfDest(obj._id, coll_id)) throw [ - g_lib.ERR_LINK, + error.ERR_LINK, "Cannot link ancestor, " + obj._id + ", to descendant, " + @@ -742,7 +742,7 @@ router g_lib.MAX_COLL_ITEMS ) throw [ - g_lib.ERR_INPUT_TOO_LONG, + error.ERR_INPUT_TOO_LONG, "Root collection item limit exceeded (" + g_lib.MAX_COLL_ITEMS + " items)", @@ -827,7 +827,7 @@ router if (src.owner != dst.owner) throw [ - g_lib.ERR_LINK, + error.ERR_LINK, req.queryParams.source + " and " + req.queryParams.dest + @@ -838,27 +838,32 @@ router src_perms = 0, dst_perms = 0; - if (!g_lib.hasAdminPermObject(client, src_id)) { - src_perms = g_lib.getPermissions(client, src, g_lib.PERM_LINK, true); - if ((src_perms & g_lib.PERM_LINK) == 0) + if (!permissions.hasAdminPermObject(client, src_id)) { + src_perms = permissions.getPermissions( + client, + src, + permissions.PERM_LINK, + true, + ); + if ((src_perms & permissions.PERM_LINK) == 0) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied - requires LINK on source collection.", ]; chk_perm = true; } - if (!g_lib.hasAdminPermObject(client, dst_id)) { - dst_perms = g_lib.getPermissions( + if (!permissions.hasAdminPermObject(client, dst_id)) { + dst_perms = permissions.getPermissions( client, dst, - g_lib.PERM_LINK /*| g_lib.PERM_SHARE*/, + permissions.PERM_LINK, true, ); - if ((dst_perms & g_lib.PERM_LINK) == 0) + if ((dst_perms & permissions.PERM_LINK) == 0) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied - requires LINK on destination collection.", ]; @@ -871,12 +876,12 @@ router // TODO - should aliases be resolved with client or owner ID? item = g_lib.getObject(req.queryParams.items[i], client); - if (item.is_root) throw [g_lib.ERR_LINK, "Cannot link root collection"]; + if (item.is_root) throw [error.ERR_LINK, "Cannot link root collection"]; if (chk_perm && item.creator != client._id /*&& !has_share*/) { if (!g_lib.hasCommonAccessScope(src_id, dst_id)) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Cannot move items across access-control scopes.", ]; } @@ -888,7 +893,7 @@ router _to: item._id, }) ) - throw [g_lib.ERR_UNLINK, item._id + " is not in collection " + src_id]; + throw [error.ERR_UNLINK, item._id + " is not in collection " + src_id]; if ( g_db.item.firstExample({ @@ -897,7 +902,7 @@ router }) ) throw [ - g_lib.ERR_LINK, + error.ERR_LINK, item._id + " is already in collection " + dst_id, ]; @@ -905,7 +910,7 @@ router // Check for circular dependency if (item._id == dst_id || g_lib.isSrcParentOfDest(item._id, dst_id)) throw [ - g_lib.ERR_LINK, + error.ERR_LINK, "Cannot link ancestor, " + item._id + ", to descendant, " + @@ -940,7 +945,7 @@ router if (cres.count() > g_lib.MAX_COLL_ITEMS) throw [ - g_lib.ERR_INPUT_TOO_LONG, + error.ERR_INPUT_TOO_LONG, "Collection item limit exceeded (" + g_lib.MAX_COLL_ITEMS + " items)", ]; @@ -967,7 +972,7 @@ router var item_id = g_lib.resolveID(req.queryParams.id, client); if (!item_id.startsWith("d/") && !item_id.startsWith("c/")) - throw [g_lib.ERR_INVALID_PARAM, "ID is not a collection or record."]; + throw [error.ERR_INVALID_PARAM, "ID is not a collection or record."]; var results = g_lib.getParents(item_id); if (req.queryParams.inclusive) { @@ -1003,13 +1008,7 @@ router var item_id = g_lib.resolveID(req.queryParams.item, client); if (coll_id.charAt(0) != "c") - throw [g_lib.ERR_INVALID_PARAM, "ID is not a collection."]; - - /*if ( !g_lib.hasAdminPermObject( client, coll_id )) { - var coll = g_db.c.document( coll_id ); - if ( !g_lib.hasPermissions( client, coll, g_lib.PERM_LIST )) - throw g_lib.ERR_PERM_DENIED; - }*/ + throw [error.ERR_INVALID_PARAM, "ID is not a collection."]; var qry = "for v in 1..1 outbound @coll item "; if (item_id.charAt(0) == "c") @@ -1029,7 +1028,7 @@ router var idx = ids.indexOf(item_id); if (idx < 0) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Item " + req.queryParams.item + " was not found in collection " + diff --git a/core/database/foxx/api/data_router.js b/core/database/foxx/api/data_router.js index 0b2f74d98..c72f20b05 100644 --- a/core/database/foxx/api/data_router.js +++ b/core/database/foxx/api/data_router.js @@ -5,6 +5,8 @@ const router = createRouter(); const joi = require("joi"); const g_db = require("@arangodb").db; const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); const g_proc = require("./process"); const g_tasks = require("./tasks"); const { UserToken } = require("./lib/user_token"); @@ -26,10 +28,10 @@ function recordCreate(client, record, result) { _from: parent_id, })._to; if (owner_id != client._id) { - if (!g_lib.hasManagerPermProj(client, owner_id)) { + if (!permissions.hasManagerPermProj(client, owner_id)) { var parent_coll = g_db.c.document(parent_id); - if (!g_lib.hasPermissions(client, parent_coll, g_lib.PERM_CREATE)) { - throw g_lib.ERR_PERM_DENIED; + if (!permissions.hasPermissions(client, parent_coll, permissions.PERM_CREATE)) { + throw error.ERR_PERM_DENIED; } } } @@ -49,7 +51,7 @@ function recordCreate(client, record, result) { ); if (cnt_res.next() >= g_lib.MAX_COLL_ITEMS) throw [ - g_lib.ERR_INPUT_TOO_LONG, + error.ERR_INPUT_TOO_LONG, "Parent collection item limit exceeded (" + g_lib.MAX_COLL_ITEMS + " items)", ]; @@ -75,7 +77,7 @@ function recordCreate(client, record, result) { // Verify source path is a full globus path to a file if (obj.source) { if (!g_lib.isFullGlobusPath(obj.source, true, false)) { - throw [g_lib.ERR_INVALID_PARAM, "Source must be a full Globus path to a file."]; + throw [error.ERR_INVALID_PARAM, "Source must be a full Globus path to a file."]; } obj.size = 1048576; // Don't know actual size - doesn't really matter @@ -88,7 +90,7 @@ function recordCreate(client, record, result) { repo_alloc = g_lib.assignRepo(owner_id); } - if (!repo_alloc) throw [g_lib.ERR_NO_ALLOCATION, "No allocation available"]; + if (!repo_alloc) throw [error.ERR_NO_ALLOCATION, "No allocation available"]; // Extension setting only apply to managed data if (record.ext) { @@ -102,7 +104,7 @@ function recordCreate(client, record, result) { if (record.md) { obj.md = JSON.parse(record.md); // parse escaped JSON string TODO: this could be dangerous - if (Array.isArray(obj.md)) throw [g_lib.ERR_INVALID_PARAM, "Metadata cannot be an array"]; + if (Array.isArray(obj.md)) throw [error.ERR_INVALID_PARAM, "Metadata cannot be an array"]; } if (obj.alias) { @@ -127,15 +129,15 @@ function recordCreate(client, record, result) { if (obj.sch_id) { var idx = obj.sch_id.indexOf(":"); if (idx < 0) { - throw [g_lib.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; + throw [error.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; } - (sch_id = obj.sch_id.substr(0, idx)), (sch_ver = parseInt(obj.sch_id.substr(idx + 1))); + ((sch_id = obj.sch_id.substr(0, idx)), (sch_ver = parseInt(obj.sch_id.substr(idx + 1)))); var sch = g_db.sch.firstExample({ id: sch_id, ver: sch_ver, }); - if (!sch) throw [g_lib.ERR_INVALID_PARAM, "Schema '" + obj.sch_id + "' does not exist"]; + if (!sch) throw [error.ERR_INVALID_PARAM, "Schema '" + obj.sch_id + "' does not exist"]; obj.sch_id = sch._id; g_db._update(sch._id, { @@ -174,7 +176,7 @@ function recordCreate(client, record, result) { _key: alias_key, }) ) - throw [g_lib.ERR_INVALID_PARAM, "Alias, " + alias_key + ", already in use"]; + throw [error.ERR_INVALID_PARAM, "Alias, " + alias_key + ", already in use"]; g_db.a.save({ _key: alias_key, @@ -210,7 +212,7 @@ function recordCreate(client, record, result) { }) ) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Only one dependency can be defined between any two data records.", ]; g_db.dep.save({ @@ -422,11 +424,11 @@ function recordUpdate(client, record, result) { var data_id = g_lib.resolveDataID(record.id, client); var data = g_db.d.document(data_id); - if (!g_lib.hasAdminPermObject(client, data_id)) { + if (!permissions.hasAdminPermObject(client, data_id)) { // Required permissions depend on which fields are being modified: // Metadata = PERM_WR_META, file_size = PERM_WR_DATA, all else = ADMIN var perms = 0; - if (record.md !== undefined) perms |= g_lib.PERM_WR_META; + if (record.md !== undefined) perms |= permissions.PERM_WR_META; if ( record.title !== undefined || @@ -437,10 +439,11 @@ function recordUpdate(client, record, result) { (record.dep_add && record.dep_add.length) || (record.dep_rem && record.dep_rem.length) ) { - perms |= g_lib.PERM_WR_REC; + perms |= permissions.PERM_WR_REC; } - if (data.locked || !g_lib.hasPermissions(client, data, perms)) throw g_lib.ERR_PERM_DENIED; + if (data.locked || !permissions.hasPermissions(client, data, perms)) + throw error.ERR_PERM_DENIED; } var owner_id = g_db.owner.firstExample({ @@ -465,7 +468,7 @@ function recordUpdate(client, record, result) { } else if (record.md) { obj.md = JSON.parse(record.md); if (Array.isArray(obj.md)) { - throw [g_lib.ERR_INVALID_PARAM, "Metadata cannot be an array"]; + throw [error.ERR_INVALID_PARAM, "Metadata cannot be an array"]; } obj.md_err_msg = null; obj.md_err = false; @@ -491,7 +494,7 @@ function recordUpdate(client, record, result) { var idx = obj.sch_id.indexOf(":"); if (idx < 0) { - throw [g_lib.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; + throw [error.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; } var sch_id = obj.sch_id.substr(0, idx), sch_ver = parseInt(obj.sch_id.substr(idx + 1)); @@ -502,7 +505,7 @@ function recordUpdate(client, record, result) { }); if (!sch) { - throw [g_lib.ERR_INVALID_PARAM, "Schema '" + obj.sch_id + "' does not exist"]; + throw [error.ERR_INVALID_PARAM, "Schema '" + obj.sch_id + "' does not exist"]; } obj.sch_id = sch._id; @@ -521,7 +524,7 @@ function recordUpdate(client, record, result) { if (data.external) { if (obj.source) { if (!g_lib.isFullGlobusPath(obj.source, true, false)) { - throw [g_lib.ERR_INVALID_PARAM, "Source must be a full Globus path to a file."]; + throw [error.ERR_INVALID_PARAM, "Source must be a full Globus path to a file."]; } obj.size = 1048576; // Don't know actual size - doesn't really matter @@ -529,7 +532,7 @@ function recordUpdate(client, record, result) { } else { if (obj.source) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Raw data source cannot be specified for managed data records.", ]; } @@ -616,7 +619,7 @@ function recordUpdate(client, record, result) { _key: alias_key, }) ) - throw [g_lib.ERR_INVALID_PARAM, "Alias, " + obj.alias + ", already in use"]; + throw [error.ERR_INVALID_PARAM, "Alias, " + obj.alias + ", already in use"]; g_db.a.save({ _key: alias_key, @@ -633,7 +636,7 @@ function recordUpdate(client, record, result) { } if (record.deps != undefined && (record.deps_add != undefined || record.deps_rem != undefined)) - throw [g_lib.ERR_INVALID_PARAM, "Cannot use both dependency set and add/remove."]; + throw [error.ERR_INVALID_PARAM, "Cannot use both dependency set and add/remove."]; var dep, id, @@ -654,7 +657,7 @@ function recordUpdate(client, record, result) { }); if (!dep) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Specified dependency on " + id + " does not exist.", ]; @@ -676,7 +679,7 @@ function recordUpdate(client, record, result) { dep = record.dep_add[i]; id = g_lib.resolveDataID(dep.id, client); if (!id.startsWith("d/")) - throw [g_lib.ERR_INVALID_PARAM, "Dependencies can only be set on data records."]; + throw [error.ERR_INVALID_PARAM, "Dependencies can only be set on data records."]; if ( g_db.dep.firstExample({ @@ -686,7 +689,7 @@ function recordUpdate(client, record, result) { }) ) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Only one dependency of each type may be defined between any two data records.", ]; @@ -980,7 +983,7 @@ router _id: data_id, }) ) - throw [g_lib.ERR_INVALID_PARAM, "Record, " + data_id + ", does not exist."]; + throw [error.ERR_INVALID_PARAM, "Record, " + data_id + ", does not exist."]; // TODO Update schema validation error flag g_db._update( @@ -1105,20 +1108,23 @@ router admin = false; if (client) { - admin = g_lib.hasAdminPermObject(client, data_id); + admin = permissions.hasAdminPermObject(client, data_id); if (!admin) { - var perms = g_lib.getPermissions( + var perms = permissions.getPermissions( client, data, - g_lib.PERM_RD_REC | g_lib.PERM_RD_META, + permissions.PERM_RD_REC | permissions.PERM_RD_META, ); - if (data.locked || (perms & (g_lib.PERM_RD_REC | g_lib.PERM_RD_META)) == 0) - throw g_lib.ERR_PERM_DENIED; - if ((perms & g_lib.PERM_RD_META) == 0) rem_md = true; + if ( + data.locked || + (perms & (permissions.PERM_RD_REC | permissions.PERM_RD_META)) == 0 + ) + throw error.ERR_PERM_DENIED; + if ((perms & permissions.PERM_RD_META) == 0) rem_md = true; } } else if (!g_lib.hasPublicRead(data_id)) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } data.notes = g_lib.getNoteMask(client, data); @@ -1431,9 +1437,9 @@ router for (i in req.queryParams.ids) { obj = g_lib.getObject(req.queryParams.ids[i], client); - if (!g_lib.hasAdminPermObject(client, obj._id)) { - if (!g_lib.hasPermissions(client, obj, g_lib.PERM_LOCK)) - throw g_lib.ERR_PERM_DENIED; + if (!permissions.hasAdminPermObject(client, obj._id)) { + if (!permissions.hasPermissions(client, obj, permissions.PERM_LOCK)) + throw error.ERR_PERM_DENIED; } g_db._update( obj._id, @@ -1476,9 +1482,9 @@ router * @param {object} req - The request object, containing the query parameters. * @param {object} res - The response object, used to send the raw data path or error. * - * @throws {Error} g_lib.ERR_PERM_DENIED - If the client does not have permission to read the data. - * @throws {Error} g_lib.ERR_NO_RAW_DATA - If the raw data is not found. - * @throws {Error} g_lib.ERR_INVALID_PARAM - If the data belongs to a different domain than specified. + * @throws {Error} error.ERR_PERM_DENIED - If the client does not have permission to read the data. + * @throws {Error} error.ERR_NO_RAW_DATA - If the raw data is not found. + * @throws {Error} error.ERR_INVALID_PARAM - If the data belongs to a different domain than specified. * * @returns {void} - Returns the raw data path in the response if the request is successful. */ @@ -1488,21 +1494,21 @@ router const client = g_lib.getUserFromClientID(req.queryParams.client); var data_id = g_lib.resolveDataID(req.queryParams.id, client); - if (!g_lib.hasAdminPermObject(client, data_id)) { + if (!permissions.hasAdminPermObject(client, data_id)) { var data = g_db.d.document(data_id); - var perms = g_lib.getPermissions(client, data, g_lib.PERM_RD_DATA); - if ((perms & g_lib.PERM_RD_DATA) == 0) throw g_lib.ERR_PERM_DENIED; + var perms = permissions.getPermissions(client, data, permissions.PERM_RD_DATA); + if ((perms & permissions.PERM_RD_DATA) == 0) throw error.ERR_PERM_DENIED; } var loc = g_db.loc.firstExample({ _from: data_id, }); - if (!loc) throw g_lib.ERR_NO_RAW_DATA; + if (!loc) throw error.ERR_NO_RAW_DATA; var repo = g_db.repo.document(loc._to); if (repo.domain != req.queryParams.domain) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Can only access data from '" + repo.domain + "' domain", ]; @@ -1530,9 +1536,9 @@ router if (req.queryParams.subject) { owner_id = req.queryParams.subject; if (req.queryParams.subject.startsWith("u/")) { - g_lib.ensureAdminPermUser(client, owner_id); + permissions.ensureAdminPermUser(client, owner_id); } else { - g_lib.ensureManagerPermProj(client, owner_id); + permissions.ensureManagerPermProj(client, owner_id); } } else { owner_id = client._id; @@ -1611,7 +1617,7 @@ router if (!req.body.check && !req.body.path) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Must provide path parameter if not running check.", ]; @@ -1623,7 +1629,7 @@ router }).exists(); if (is_collection && !token_exists) { throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Globus token for mapped collection " + collection_id + " for user " + @@ -1693,13 +1699,13 @@ router if (!req.body.check && !req.body.path) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Must provide path parameter if not running check.", ]; if (req.body.id.length > 1) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Concurrent put of multiple records no supported.", ]; @@ -1711,7 +1717,7 @@ router }).exists(); if (is_collection && !token_exists) { throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Globus token for mapped collection " + collection_id + " for user " + diff --git a/core/database/foxx/api/group_router.js b/core/database/foxx/api/group_router.js index 4d4f53416..f2b0960a6 100644 --- a/core/database/foxx/api/group_router.js +++ b/core/database/foxx/api/group_router.js @@ -3,6 +3,8 @@ const createRouter = require("@arangodb/foxx/router"); const router = createRouter(); const joi = require("joi"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); const g_db = require("@arangodb").db; const g_graph = require("@arangodb/general-graph")._graph("sdmsg"); @@ -28,13 +30,13 @@ router if (req.queryParams.proj) { uid = req.queryParams.proj; - g_lib.ensureManagerPermProj(client, uid); + permissions.ensureManagerPermProj(client, uid); } else { uid = client._id; } if (req.queryParams.gid == "members") - throw [g_lib.ERR_PERM_DENIED, "Group ID 'members' is reserved"]; + throw [error.ERR_PERM_DENIED, "Group ID 'members' is reserved"]; var obj = { uid: uid, @@ -50,7 +52,7 @@ router gid: obj.gid, }) ) - throw [g_lib.ERR_IN_USE, "Group ID '" + obj.gid + "' already exists."]; + throw [error.ERR_IN_USE, "Group ID '" + obj.gid + "' already exists."]; var group = g_db.g.save(obj, { returnNew: true, @@ -67,7 +69,7 @@ router for (var i in req.queryParams.members) { mem = req.queryParams.members[i]; if (!g_db._exists(mem)) - throw [g_lib.ERR_NOT_FOUND, "User, " + mem + ", not found"]; + throw [error.ERR_NOT_FOUND, "User, " + mem + ", not found"]; g_db.member.save({ _from: group._id, @@ -122,12 +124,11 @@ router }); if (!group) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Group ID '" + req.queryParams.gid + "' not found", ]; - //g_lib.ensureAdminPermObject( client, group._id ); - g_lib.ensureManagerPermProj(client, uid); + permissions.ensureManagerPermProj(client, uid); } else { group = g_db.g.firstExample({ uid: client._id, @@ -135,7 +136,7 @@ router }); if (!group) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Group ID '" + req.queryParams.gid + "' not found", ]; } @@ -161,7 +162,7 @@ router mem = req.queryParams.add[i]; if (!g_db._exists(mem)) - throw [g_lib.ERR_NOT_FOUND, "User, " + mem + ", not found"]; + throw [error.ERR_NOT_FOUND, "User, " + mem + ", not found"]; if ( !g_db.member.firstExample({ @@ -247,15 +248,14 @@ router }); if (!group) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Group ID '" + req.queryParams.gid + "' not found", ]; - //g_lib.ensureAdminPermObject( client, group._id ); - g_lib.ensureManagerPermProj(client, uid); + permissions.ensureManagerPermProj(client, uid); // Make sure special members project is protected - if (group.gid == "members") throw g_lib.ERR_PERM_DENIED; + if (group.gid == "members") throw error.ERR_PERM_DENIED; } else { group = g_db.g.firstExample({ uid: client._id, @@ -263,7 +263,7 @@ router }); if (!group) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Group, " + req.queryParams.gid + ", not found", ]; } @@ -290,7 +290,7 @@ router if (req.queryParams.proj) { owner_id = req.queryParams.proj; if (g_lib.getProjectRole(client._id, owner_id) == g_lib.PROJ_NO_ROLE) - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } else { owner_id = client._id; } @@ -327,17 +327,17 @@ router gid: req.queryParams.gid, }); if (!group) - throw [g_lib.ERR_NOT_FOUND, "Group ID '" + req.queryParams.gid + "' not found"]; + throw [error.ERR_NOT_FOUND, "Group ID '" + req.queryParams.gid + "' not found"]; if (g_lib.getProjectRole(client._id, uid) == g_lib.PROJ_NO_ROLE) - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } else { group = g_db.g.firstExample({ uid: client._id, gid: req.queryParams.gid, }); if (!group) - throw [g_lib.ERR_NOT_FOUND, "Group ID '" + req.queryParams.gid + "' not found"]; + throw [error.ERR_NOT_FOUND, "Group ID '" + req.queryParams.gid + "' not found"]; } var result = { diff --git a/core/database/foxx/api/lib/error_codes.js b/core/database/foxx/api/lib/error_codes.js new file mode 100644 index 000000000..a93f22067 --- /dev/null +++ b/core/database/foxx/api/lib/error_codes.js @@ -0,0 +1,42 @@ +"use strict"; + +module.exports = (function () { + var obj = {}; + obj.ERR_INFO = []; + obj.ERR_COUNT = 0; + + obj.ERR_AUTHN_FAILED = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Authentication Failed"]); + obj.ERR_PERM_DENIED = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Permission Denied"]); + obj.ERR_INVALID_PARAM = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Invalid Parameter"]); + obj.ERR_INPUT_TOO_LONG = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Input value too long"]); + obj.ERR_INVALID_CHAR = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Invalid character"]); + obj.ERR_NOT_FOUND = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Record Not Found"]); + obj.ERR_IN_USE = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Value In Use"]); + obj.ERR_LINK = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Collection Link Error"]); + obj.ERR_UNLINK = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Collection Unlink Error"]); + obj.ERR_MISSING_REQ_PARAM = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Missing one or more required parameters"]); + obj.ERR_NO_RAW_DATA = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Record has no raw data"]); + obj.ERR_XFR_CONFLICT = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Data transfer conflict"]); + obj.ERR_INTERNAL_FAULT = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Internal server fault"]); + obj.ERR_NO_ALLOCATION = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "No allocation available"]); + obj.ERR_ALLOCATION_EXCEEDED = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Storage allocation exceeded"]); + obj.ERR_INVALID_OPERATION = obj.ERR_COUNT++; + obj.ERR_INFO.push([400, "Invalid operation"]); + + return obj; +})(); diff --git a/core/database/foxx/api/lib/execution_types.js b/core/database/foxx/api/lib/execution_types.js new file mode 100644 index 000000000..db0b33c84 --- /dev/null +++ b/core/database/foxx/api/lib/execution_types.js @@ -0,0 +1,15 @@ +"use strict"; + +/** + * Execution methods + * A enum-like constant representing different execution strategies + * @type {Readonly<{DEFERRED: string, DIRECT: string}>} + */ +const ExecutionMethod = Object.freeze({ + DEFERRED: "deferred", + DIRECT: "direct", +}); + +module.exports = { + ExecutionMethod, +}; diff --git a/core/database/foxx/api/lib/logger.js b/core/database/foxx/api/lib/logger.js new file mode 100644 index 000000000..c410a8040 --- /dev/null +++ b/core/database/foxx/api/lib/logger.js @@ -0,0 +1,114 @@ +"use strict"; +const g_lib = require("../support"); + +function logRequestSuccess({ + client, + correlationId, + httpVerb, + routePath, + status, + description, + extra, +}) { + // helper to pad fields + const pad = (label, value, length = 20) => + `${label}: ${value || "unknown"}`.padEnd(length, " "); + + console.info( + pad("Client", client) + + " | " + + pad("Correlation_ID", correlationId) + + " | " + + pad("HTTP", httpVerb) + + " | " + + pad("Route", routePath) + + " | " + + pad("Status", status) + + " | " + + pad("Desc", description) + + " | " + + pad("Extra", typeof extra === "object" ? JSON.stringify(extra) : extra), + ); +} + +function logRequestFailure({ + client, + correlationId, + httpVerb, + routePath, + status, + description, + extra, + error, +}) { + // helper to pad fields + const pad = (label, value, length = 20) => + `${label}: ${value || "unknown"}`.padEnd(length, " "); + //PUT IF STATEMENT + if (g_lib.isInteger(error) || Array.isArray(error)) { + console.error( + pad("Client", client) + + " | " + + pad("Correlation_ID", correlationId) + + " | " + + pad("HTTP", httpVerb) + + " | " + + pad("Route", routePath) + + " | " + + pad("Status", status) + + " | " + + pad("Desc", description) + + " | " + + pad("Extra", typeof extra === "object" ? JSON.stringify(extra) : extra) + + " | " + + pad("Error", error), + ); + } else { + console.error( + pad("Client", client) + + " | " + + pad("Correlation_ID", correlationId) + + " | " + + pad("HTTP", httpVerb) + + " | " + + pad("Route", routePath) + + " | " + + pad("Status", status) + + " | " + + pad("Desc", description) + + " | " + + pad("Extra", typeof extra === "object" ? JSON.stringify(extra) : extra) + + " | " + + pad("Error", error.message) + + " | " + + pad("Stack", error.stack), + ); + } +} + +function logRequestStarted({ client, correlationId, httpVerb, routePath, status, description }) { + // helper to pad fields + const pad = (label, value, length = 20) => + `${label}: ${value || "unknown"}`.padEnd(length, " "); + + console.info( + pad("Client", client) + + " | " + + pad("Correlation_ID", correlationId) + + " | " + + pad("HTTP", httpVerb) + + " | " + + pad("Route", routePath) + + " | " + + pad("Status", status) + + " | " + + pad("Desc", description), + ); +} + +// Export the functions +module.exports = { + logRequestSuccess, + logRequestFailure, + logRequestStarted, +}; diff --git a/core/database/foxx/api/lib/permissions.js b/core/database/foxx/api/lib/permissions.js new file mode 100644 index 000000000..285bcf5db --- /dev/null +++ b/core/database/foxx/api/lib/permissions.js @@ -0,0 +1,653 @@ +"use strict"; + +const error = require("./error_codes"); + +module.exports = (function () { + var obj = {}; + + obj.db = require("@arangodb").db; + + obj.PERM_RD_REC = 0x0001; // Read record info (description, keywords, details) + obj.PERM_RD_META = 0x0002; // Read structured metadata + obj.PERM_RD_DATA = 0x0004; // Read raw data + obj.PERM_WR_REC = 0x0008; // Write record info (description, keywords, details) + obj.PERM_WR_META = 0x0010; // Write structured metadata + obj.PERM_WR_DATA = 0x0020; // Write raw data + obj.PERM_LIST = 0x0040; // Find record and view ID, alias, title, and owner + obj.PERM_LINK = 0x0080; // Link/unlink child records (collections only) + obj.PERM_CREATE = 0x0100; // Create new child records (collections only) + obj.PERM_DELETE = 0x0200; // Delete record + obj.PERM_SHARE = 0x0400; // View/set ACLs + obj.PERM_LOCK = 0x0800; // Lock record + obj.PERM_LABEL = 0x1000; // Label record + obj.PERM_TAG = 0x2000; // Tag record + obj.PERM_ANNOTATE = 0x4000; // Annotate record + + obj.PERM_NONE = 0x0000; + obj.PERM_RD_ALL = 0x0007; // Read all + obj.PERM_WR_ALL = 0x0038; // Write all + obj.PERM_ALL = 0x7fff; + obj.PERM_MEMBER = 0x0047; // Project record perms + obj.PERM_MANAGER = 0x0407; // Project record perms + obj.PERM_PUBLIC = 0x0047; + + obj.hasAdminPermUser = function (a_client, a_user_id) { + if (a_client._id != a_user_id && !a_client?.is_admin) { + return false; + } else { + return true; + } + }; + + obj.hasAdminPermProj = function (a_client, a_proj_id) { + if ( + !a_client?.is_admin && + !obj.db.owner.firstExample({ + _from: a_proj_id, + _to: a_client._id, + }) + ) { + return false; + } else { + return true; + } + }; + + obj.hasManagerPermProj = function (a_client, a_proj_id) { + if ( + !a_client?.is_admin && + !obj.db.owner.firstExample({ + _from: a_proj_id, + _to: a_client._id, + }) && + !obj.db.admin.firstExample({ + _from: a_proj_id, + _to: a_client._id, + }) + ) { + return false; + } else { + return true; + } + }; + + obj.hasAdminPermObjectLoaded = function (a_client, a_object) { + // TODO Should collection creator have admin rights? + if ( + a_object.owner == a_client._id || + a_object.creator == a_client._id || + a_client?.is_admin + ) + return true; + + if (a_object.owner.charAt(0) == "p") { + if ( + obj.db.owner.firstExample({ + _from: a_object.owner, + _to: a_client._id, + }) + ) + return true; + + if ( + obj.db.admin.firstExample({ + _from: a_object.owner, + _to: a_client._id, + }) + ) + return true; + } + + return false; + }; + + /** + * checks to make sure the client has admin permissions on an object + * + * @param {object} a_client - this is a user document i.e. + * + * + * "_key" : "bob", + * "_id" : "u/bob", + * "name" : "bob junior ", + * "name_first" : "bob", + * "name_last" : "jones", + * "is_admin" : true, + * "max_coll" : 50, + * "max_proj" : 10, + * "max_sav_qry" : 20, + * : + * "email" : "bobjones@gmail.com" + * + * @param {string} a_object_id - the identity of a record or collection or project + * + * "d/fdakjfla" + * "p/big_thing" + * "c/my_collection" + * + * @returns {boolean} - if client has admin rights on the object. + **/ + obj.hasAdminPermObject = function (a_client, a_object_id) { + if (a_client?.is_admin) return true; + + var first_owner = obj.db.owner.firstExample({ + _from: a_object_id, + }); + if (first_owner !== null) { + var owner_id = first_owner._to; // obj.db.owner.firstExample({ _from: a_object_id })._to; + } else { + throw [error.ERR_NOT_FOUND, "Data record for owner not found " + a_object_id + "."]; + } + if (owner_id == a_client._id) return true; + + if (owner_id[0] == "p") { + // Object owned by a project + if ( + obj.db.admin.firstExample({ + _from: owner_id, + _to: a_client._id, + }) + ) + return true; + + if ( + obj.db.owner.firstExample({ + _from: owner_id, + _to: a_client._id, + }) + ) + return true; + } + + if (a_object_id[0] == "d") { + var data = obj.db._query("for i in d filter i._id == @id return i.creator", { + id: a_object_id, + }); + if (!data.hasNext()) { + throw [error.ERR_NOT_FOUND, "Data record " + a_object_id + " not found."]; + } + data = data.next(); + if (a_client._id == data) return true; + } + return false; + }; + + obj.hasAdminPermRepo = function (a_client, a_repo_id) { + if ( + !a_client?.is_admin && + !obj.db.admin.firstExample({ + _from: a_repo_id, + _to: a_client._id, + }) + ) { + return false; + } else { + return true; + } + }; + + obj.ensureAdminPermUser = function (a_client, a_user_id) { + if (!obj.hasAdminPermUser(a_client, a_user_id)) throw error.ERR_PERM_DENIED; + }; + + obj.ensureAdminPermProj = function (a_client, a_user_id) { + if (!obj.hasAdminPermProj(a_client, a_user_id)) throw error.ERR_PERM_DENIED; + }; + + obj.ensureManagerPermProj = function (a_client, a_user_id) { + if (!obj.hasManagerPermProj(a_client, a_user_id)) throw error.ERR_PERM_DENIED; + }; + + obj.ensureAdminPermObject = function (a_client, a_object_id) { + if (!obj.hasAdminPermObject(a_client, a_object_id)) throw error.ERR_PERM_DENIED; + }; + + obj.ensureAdminPermRepo = function (a_client, a_repo_id) { + if (!obj.hasAdminPermRepo(a_client, a_repo_id)) + throw [ + error.ERR_PERM_DENIED, + "Client, '" + + a_client?._id + + "', does not have administrative repository permissions on " + + a_repo_id, + ]; + }; + + /* Test if client has requested permission(s) for specified object. Note: this call does NOT check for + * ownership or admin privilege - the hasAdminPermObject function performs these checks and should be + * called first if needed. This function is typically used when filtering a list of objects that are + * known not to be owned by the client (and that the client is not an admin). In this case, those checks + * would add performance cost for no benefit. + */ + obj.hasPermissions = function ( + a_client, + a_object, + a_req_perm, + a_inherited = false, + any = false, + ) { + var perm_found = 0, + acl, + acls, + result, + i; + + // If object is marked "public", everyone is granted VIEW, and READ permissions + // The current implementation allows users to be denied access to public data (maybe wrong?) + + if (a_object.topic) { + perm_found = obj.PERM_PUBLIC; + + result = obj.evalPermissions(a_req_perm, perm_found, any); + if (result != null) return result; + } + + // Evaluate user permissions set directly on object + if (a_object.acls & 1) { + acls = obj.db + ._query("for v, e in 1..1 outbound @object acl filter v._id == @client return e", { + object: a_object._id, + client: a_client._id, + }) + .toArray(); + + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm_found |= acl.grant; + if (a_inherited && acl.inhgrant) perm_found |= acl.inhgrant; + } + + result = obj.evalPermissions(a_req_perm, perm_found, any); + if (result != null) return result; + } + } + + // Evaluate group permissions on object + if (a_object.acls & 2) { + acls = obj.db + ._query( + "for v, e, p in 2..2 outbound @object acl, outbound member filter p.vertices[2]._id == @client return p.edges[0]", + { + object: a_object._id, + client: a_client._id, + }, + ) + .toArray(); + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm_found |= acl.grant; + if (a_inherited && acl.inhgrant) perm_found |= acl.inhgrant; + } + + result = obj.evalPermissions(a_req_perm, perm_found, any); + if (result != null) return result; + } + } + + // If not all requested permissions have been found, evaluate permissions inherited from parent collections + // Note that items can only be linked to containers that share the same owner + // This evaluation is implemented as a manually guided breadth-first search + + var children = [a_object]; + var parents, parent; + + for (;;) { + // Find all parent collections owned by object owner + + parents = obj.db + ._query( + "for i in @children for v in 1..1 inbound i item return {_id:v._id,topic:v.topic,acls:v.acls}", + { + children: children, + }, + ) + .toArray(); + + if (parents.length == 0) break; + + for (i in parents) { + parent = parents[i]; + + if (parent.topic) { + perm_found |= obj.PERM_PUBLIC; + + result = obj.evalPermissions(a_req_perm, perm_found, any); + if (result != null) return result; + } + + // User ACL first + if (parent.acls && (parent.acls & 1) !== 0) { + acls = obj.db + ._query( + "for v, e in 1..1 outbound @object acl filter v._id == @client return e", + { + object: parent._id, + client: a_client._id, + }, + ) + .toArray(); + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm_found |= acl.inhgrant; + } + + result = obj.evalPermissions(a_req_perm, perm_found, any); + if (result != null) return result; + } + } + + // Group ACL next + if (parent.acls && (parent.acls & 2) !== 0) { + acls = obj.db + ._query( + "for v, e, p in 2..2 outbound @object acl, outbound member filter is_same_collection('g',p.vertices[1]) and p.vertices[2]._id == @client return p.edges[0]", + { + object: parent._id, + client: a_client._id, + }, + ) + .toArray(); + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm_found |= acl.inhgrant; + } + + result = obj.evalPermissions(a_req_perm, perm_found, any); + if (result != null) return result; + } + } + } + + // If there are still missing require permissions... + // Determine which parents are candidates for further evaluation (have req bits not set in inherited permissions) + children = parents; + } + + return false; + }; + + obj.evalPermissions = function (a_req_perm, a_perm_found, any) { + if (any) { + // If any requested permission have been found, return true (granted) + if (a_perm_found & a_req_perm) return true; + else return null; // Else, keep looking + } else { + // If not all requested permissions have been found return NULL (keep looking) + if ((a_perm_found & a_req_perm) != a_req_perm) return null; + else return true; // Else, permission granted + } + }; + + obj.getPermissions = function (a_client, a_object, a_req_perm, a_inherited = false) { + var perm_found = 0, + acl, + acls, + i; + + // If object has a topic (collections only), everyone is granted VIEW, and READ permissions + // The current implementation allows users to be denied access to public data (maybe wrong?) + + if (a_object.topic) { + perm_found = obj.PERM_PUBLIC; + + if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; + } + + // Evaluate permissions set directly on object + + if (a_object.acls && (a_object.acls & 1) !== 0) { + acls = obj.db + ._query("for v, e in 1..1 outbound @object acl filter v._id == @client return e", { + object: a_object._id, + client: a_client._id, + }) + .toArray(); + + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm_found |= acl.grant; + if (a_inherited && acl.inhgrant) perm_found |= acl.inhgrant; + } + + if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; + } + } + + // Evaluate group permissions on object + + if (a_object.acls && (a_object.acls & 2) !== 0) { + acls = obj.db + ._query( + "for v, e, p in 2..2 outbound @object acl, outbound member filter p.vertices[2]._id == @client return p.edges[0]", + { + object: a_object._id, + client: a_client._id, + }, + ) + .toArray(); + + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm_found |= acl.grant; + if (a_inherited && acl.inhgrant) perm_found |= acl.inhgrant; + } + + if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; + } + } + + // If not all requested permissions have been found, evaluate permissions inherited from parent collections + // Note that items can only be linked to containers that share the same owner + + var children = [a_object]; + var parents, parent; + + for (;;) { + // Find all parent collections owned by object owner + + parents = obj.db + ._query( + "for i in @children for v in 1..1 inbound i item return {_id:v._id,topic:v.topic,acls:v.acls}", + { + children: children, + }, + ) + .toArray(); + + if (parents.length == 0) break; + + for (i in parents) { + parent = parents[i]; + + if (parent.topic) { + perm_found |= obj.PERM_PUBLIC; + + if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; + } + + // User ACL + if (parent.acls && (parent.acls & 1) != 0) { + acls = obj.db + ._query( + "for v, e in 1..1 outbound @object acl filter v._id == @client return e", + { + object: parent._id, + client: a_client._id, + }, + ) + .toArray(); + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm_found |= acl.inhgrant; + } + + if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; + } + } + + // Group ACL + if (parent.acls && (parent.acls & 2) != 0) { + acls = obj.db + ._query( + "for v, e, p in 2..2 outbound @object acl, outbound member filter is_same_collection('g',p.vertices[1]) and p.vertices[2]._id == @client return p.edges[0]", + { + object: parent._id, + client: a_client._id, + }, + ) + .toArray(); + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm_found |= acl.inhgrant; + } + + if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; + } + } + } + + // If there are still missing require permissions... + // Determine which parents are candidates for further evaluation (have req bits not set in inherited permissions) + children = parents; + } + + return perm_found & a_req_perm; + }; + + obj.getPermissionsLocal = function (a_client_id, a_object, a_get_inherited, a_req_perm) { + var perm = { + grant: 0, + inhgrant: 0, + inherited: 0, + }, + acl, + acls, + i; + + if (a_object.topic) { + perm.grant |= obj.PERM_PUBLIC; + perm.inhgrant |= obj.PERM_PUBLIC; + } + + if (a_object.acls & 1) { + acls = obj.db + ._query("for v, e in 1..1 outbound @object acl filter v._id == @client return e", { + object: a_object._id, + client: a_client_id, + }) + .toArray(); + + for (i in acls) { + acl = acls[i]; + perm.grant |= acl.grant; + perm.inhgrant |= acl.inhgrant; + } + } + + // Evaluate group permissions on object + if (a_object.acls & 2) { + acls = obj.db + ._query( + "for v, e, p in 2..2 outbound @object acl, outbound member filter p.vertices[2]._id == @client return p.edges[0]", + { + object: a_object._id, + client: a_client_id, + }, + ) + .toArray(); + for (i in acls) { + acl = acls[i]; + perm.grant |= acl.grant; + perm.inhgrant |= acl.inhgrant; + } + } + + if (a_get_inherited) { + var children = [a_object]; + var parents, parent; + + for (;;) { + // Find all parent collections owned by object owner + + parents = obj.db + ._query( + "for i in @children for v in 1..1 inbound i item return {_id:v._id,topic:v.topic,acls:v.acls}", + { + children: children, + }, + ) + .toArray(); + + if (parents.length == 0) break; + + for (i in parents) { + parent = parents[i]; + + if (parent.topic) { + perm.inherited |= obj.PERM_PUBLIC; + + if ((a_req_perm & perm.inherited) == a_req_perm) break; + } + + // User ACL + if (parent.acls && (parent.acls & 1) != 0) { + acls = obj.db + ._query( + "for v, e in 1..1 outbound @object acl filter v._id == @client return e", + { + object: parent._id, + client: a_client_id, + }, + ) + .toArray(); + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm.inherited |= acl.inhgrant; + } + + if ((a_req_perm & perm.inherited) == a_req_perm) break; + } + } + + // Group ACL + if (parent.acls && (parent.acls & 2) != 0) { + acls = obj.db + ._query( + "for v, e, p in 2..2 outbound @object acl, outbound member filter is_same_collection('g',p.vertices[1]) and p.vertices[2]._id == @client return p.edges[0]", + { + object: parent._id, + client: a_client_id, + }, + ) + .toArray(); + if (acls.length) { + for (i in acls) { + acl = acls[i]; + perm.inherited |= acl.inhgrant; + } + + if ((a_req_perm & perm.inherited) == a_req_perm) break; + } + } + } + + // If there are still missing require permissions... + // Determine which parents are candidates for further evaluation (have req bits not set in inherited permissions) + children = parents; + } + } + + return perm; + }; + + return obj; +})(); diff --git a/core/database/foxx/api/lib/result.js b/core/database/foxx/api/lib/result.js new file mode 100644 index 000000000..7139423c9 --- /dev/null +++ b/core/database/foxx/api/lib/result.js @@ -0,0 +1,25 @@ +/** + * Result type for Rust-like error handling + * Rust's Result type is used for recoverable errors + * This pattern makes error handling explicit and composable + */ +const Result = { + ok: (value) => ({ + ok: true, + value, + raiseIfError() { + return this.value; + }, + }), + err: (error) => ({ + ok: false, + error, + raiseIfError() { + throw [this.error.code, this.error.message]; + }, + }), +}; + +module.exports = { + Result, +}; diff --git a/core/database/foxx/api/lib/user_token.js b/core/database/foxx/api/lib/user_token.js index a3f66bfda..71ea0cebe 100644 --- a/core/database/foxx/api/lib/user_token.js +++ b/core/database/foxx/api/lib/user_token.js @@ -1,6 +1,7 @@ "use strict"; const g_lib = require("../support.js"); +const error = require("./error_codes"); const { UserModel } = require("../models/user"); const { GlobusCollectionModel } = require("../models/globus_collection"); const { GlobusTokenModel } = require("../models/globus_token"); @@ -28,7 +29,7 @@ class UserToken { const { user_key, user_id, globus_collection_id } = kwargs; this.#user_model = new UserModel(user_id, user_key); if (!this.#user_model.exists()) { - throw [g_lib.ERR_NOT_FOUND, "Specified user does not exist: " + kwargs]; + throw [error.ERR_NOT_FOUND, "Specified user does not exist: " + kwargs]; } this.user = this.#user_model.get(); if (typeof globus_collection_id !== "undefined") { @@ -92,7 +93,7 @@ class UserToken { collection_token = true; } else { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "/token/get Requires 'collection_id' and 'collection_type' both if one is present, received " + "collection_id: " + collection_id + diff --git a/core/database/foxx/api/models/globus_collection.js b/core/database/foxx/api/models/globus_collection.js index 2b3355132..14aa72c51 100644 --- a/core/database/foxx/api/models/globus_collection.js +++ b/core/database/foxx/api/models/globus_collection.js @@ -1,6 +1,7 @@ "use strict"; const support = require("../support"); +const error = require("../lib/error_codes"); const database = require("@arangodb").db; const globus_collection_collection = database.globus_coll; @@ -32,7 +33,7 @@ class GlobusCollectionModel { */ constructor(globus_collection_id) { if (!globus_collection_id) { - throw [support.ERR_MISSING_REQ_PARAM, "A Globus Collection ID must be provided"]; + throw [error.ERR_MISSING_REQ_PARAM, "A Globus Collection ID must be provided"]; } this.#globus_collection_uuid = globus_collection_id; } diff --git a/core/database/foxx/api/models/repositories/base_repository.js b/core/database/foxx/api/models/repositories/base_repository.js new file mode 100644 index 000000000..f11878805 --- /dev/null +++ b/core/database/foxx/api/models/repositories/base_repository.js @@ -0,0 +1,228 @@ +"use strict"; + +const { RepositoryType } = require("./types"); +const g_db = require("@arangodb").db; +const { validateNonEmptyString } = require("./validation"); +const error = require("../../lib/error_codes"); +const { Result } = require("../../lib/result"); + +const createRepositoryData = ({ + key, + type, + title, + desc, + capacity, + // Type-specific fields handled through composition + typeSpecific = {}, +}) => ({ + key: key, + id: `repo/${key}`, + type, + title, + desc, + capacity, + ...typeSpecific, +}); + +// WARNING - this will completely replace arrays +function deepMerge(target, source) { + for (const key of Object.keys(source)) { + if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) { + if (!target[key] || typeof target[key] !== "object") { + target[key] = {}; + } + deepMerge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + return target; +} + +class BaseRepository { + constructor(config, typeSpecificConfig) { + if (new.target === BaseRepository) { + return Result.err({ + code: error.ERR_INTERNAL_FAULT, + message: "BaseRepository cannot be instantiated directly", + }); + } + + let new_repo_data = createRepositoryData({ + key: config.key, + type: config.type, + title: config.title, + desc: config.desc, + capacity: config.capacity, + typeSpecific: typeSpecificConfig, + }); + + let id_defined = false; + if (config.id !== undefined) { + if (config.id.startsWith("repo/") && config.id.length > "repo/".length) { + id_defined = true; + } + } + + let key_defined = false; + if (config.key !== undefined) { + key_defined = true; + } + + if (key_defined && id_defined) { + if (config.id !== `repo/${config.key}`) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: `BaseRepository - provided key ${config.key} is in conflict with id ${config.id}.`, + }); + } + } + + if (key_defined) { + config.id = `repo/${config.key}`; + } else if (id_defined) { + config.key = config.id.slice("repo/".length); + } + + // If we have a key we assume the repo exists + if (config.key != undefined) { + try { + if (g_db._exists(config.id)) { + const existingDoc = g_db.repo.document(config.key); + const { _id, _key, _rev, ...temp } = existingDoc; + console.log("existingData found"); + console.log(existingDoc); + this.repoData = { + id: existingDoc._id, + key: existingDoc._key, + ...temp, + }; + this.repoData = deepMerge(this.repoData, new_repo_data); + } else { + this.repoData = new_repo_data; + } + console.log("Repo data after deepMerge"); + console.log(this.repoData); + } catch { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: `BaseRepository - unable to create repository instance ${config.key}.`, + }); + } + } else { + this.repoData = { ...new_repo_data, id: `repo/${config.key}`, key: config.key }; + + console.log("Repo data, now that we know document doesn't exist"); + console.log(this.repoData); + } + + return Result.ok(this); + } + + id() { + return this.repoData.id; + } + + // Validate repository configuration + static validate(config) { + return Result.err({ + code: error.ERR_INVALID_OPERATION, + message: `BaseRepository - unimplemented validation method called.`, + }); + } + + // Create allocation for repository + createAllocation(allocationParams) { + return Result.err({ + code: error.ERR_INVALID_OPERATION, + message: `BaseRepository - unimplemented createAllocation method called.`, + }); + } + + // Delete allocation from repository + deleteAllocation(subjectId) { + return Result.ok(this.repoData.capacity); + } + + // Check if repository supports data operations + supportsDataOperations() { + return Result.err({ + code: error.ERR_INVALID_OPERATION, + message: `BaseRepository - unimplemented supportsDataOperations method called.`, + }); + } + + // Return repository type + type() { + return Result.err({ + code: error.ERR_INTERNAL_FAULT, + message: `BaseRepository - unimplemented type method called.`, + }); + } + + capacity() { + return this.repoData?.capacity; + } + + // Save repository to database + save() { + try { + const { id, key, ...repo_data } = this.repoData; + if (key != undefined) { + if (g_db._exists(id)) { + const updated = g_db.repo.update( + { _key: key, ...repo_data }, + { returnNew: true }, + ); + const { _id, _key, _rev, ...updated_repo_data } = updated.new; + this.repoData = { id: _id, key: _key, ...updated_repo_data }; + return Result.ok(updated.new); + } else { + const saved = g_db.repo.save({ _key: key, ...repo_data }, { returnNew: true }); + const { _id, _key, _rev, ...saved_repo_data } = saved.new; + this.repoData = { id: _id, key: _key, ...saved_repo_data }; + return Result.ok(saved.new); + } + } else { + const saved = g_db.repo.save(repo_data, { returnNew: true }); + const { _id, _key, _rev, ...saved_repo_data } = saved.new; + this.repoData = { id: _id, key: _key, ...saved_repo_data }; + return Result.ok(saved.new); + } + } catch (e) { + return Result.err({ + code: e.errorNum || 500, + message: e.errorMessage || "Failed to save repository", + }); + } + } + + // Update repository in database + update(updates) { + try { + // Lazy migration: ensure type field exists when updating + // If the repository doesn't have a type, add it based on current state + if (!this.repoData.type && !updates.type) { + updates.type = this.repoData.type || RepositoryType.GLOBUS; + } + + if (g_db._exists(this.repoData.id)) { + const updated = g_db.repo.update(this.repoData.key, updates, { returnNew: true }); + const { _id, _key, _rev, ...updated_repo_data } = updated.new; + this.repoData = { id: _id, key: _key, ...updated_repo_data }; + return Result.ok(updated.new); + } + return Result.err({ + code: error.ERR_INTERNAL_FAULT, + message: `Failed to update repository, repository document was not found (${this.repoData.id})`, + }); + } catch (e) { + return Result.err({ + code: e.errorNum || 500, + message: e.errorMessage || "Failed to update repository", + }); + } + } +} + +module.exports = { BaseRepository }; diff --git a/core/database/foxx/api/models/repositories/repositories.js b/core/database/foxx/api/models/repositories/repositories.js new file mode 100644 index 000000000..fd9bd6800 --- /dev/null +++ b/core/database/foxx/api/models/repositories/repositories.js @@ -0,0 +1,130 @@ +"use strict"; + +const { + RepositoryType, + createRepository, + createRepositoryData, + createGlobusConfig, +} = require("./types"); +const { GlobusRepo } = require("./repository/globus"); +const { MetadataRepo } = require("./repository/metadata"); +const error = require("../../lib/error_codes"); +const { Result } = require("../../lib/result"); + +/** + * Create repository based on type + * + * @param {object} config - Repository configuration object + * @param {string} config.id - Repository ID + * @param {string} config.type - Repository type (from RepositoryType enum) + * @param {string} config.title - Repository title + * @param {string} config.desc - Repository description + * @param {number} config.capacity - Storage capacity in bytes + * @param {string} config.endpoint - Globus endpoint (required for GLOBUS type) + * @param {string} config.path - File path (required for GLOBUS type) + * @param {string} config.pub_key - Public key for ZeroMQ CURVE authentication (required for GLOBUS type) + * @param {string} config.address - Network address (required for GLOBUS type) + * @param {string} config.exp_path - Export path (optional for GLOBUS type) + * @returns {{ok: boolean, error: *}|{ok: boolean, value: *}} Result object containing repository or error + */ +class Repositories { + static createRepositoryByType = (config) => { + const missingFields = []; + if (!("type" in config)) missingFields.push("type"); + if (!("title" in config)) missingFields.push("title"); + if (!("capacity" in config)) missingFields.push("capacity"); + + if (missingFields.length > 0) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: `Missing required repository fields: ${missingFields.join(", ")}`, + }); + } + /** + * Type-based creation using switch (Rust match pattern) + */ + switch (config.type) { + case RepositoryType.GLOBUS: { + return new GlobusRepo(config); + } + + case RepositoryType.METADATA: { + return new MetadataRepo(config); + } + + default: + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: `Unknown repository type: ${config.type}`, + }); + } + }; + + /** + * Find repository by ID + * This is an associated function (doesn't take self) + * @param {string} repoId - Repository ID (with or without "repo/" prefix) + * @returns {{ok: boolean, error?: *, value?: *}} Result containing repository or error + */ + static find(repoId) { + try { + const key = repoId.startsWith("repo/") ? repoId.slice(5) : repoId; + const repo = g_db.repo.document(key); + + // Default to GLOBUS type if missing (backward compatibility) + // This handles legacy repositories that don't have a type field + repo.type ??= RepositoryType.GLOBUS; + + // Return as tagged union based on type + return Result.ok({ + id: repo._id, // Add id at top level for easy access + type: repo.type, + data: repo, + }); + } catch (e) { + if (e.errorNum === 1202) { + // Document not found + return Result.err({ + code: 404, + message: `Repository not found: ${repoId}`, + }); + } + return Result.err({ + code: e.errorNum || 500, + message: e.errorMessage || "Failed to find repository", + }); + } + } + + // List repositories with optional filter + static list(filter = {}) { + try { + let query = "FOR r IN repo"; + const bindVars = {}; + + if (filter.type) { + query += " FILTER r.type == @type"; + bindVars.type = filter.type; + } + + query += " RETURN r"; + + const results = g_db._query(query, bindVars).toArray(); + return Result.ok( + results.map((repo) => ({ + type: repo.type, + data: repo, + })), + ); + } catch (e) { + return Result.err({ + code: e.errorNum || 500, + message: e.errorMessage || "Failed to list repositories", + }); + } + } +} + +module.exports = { + Repositories, +}; diff --git a/core/database/foxx/api/models/repositories/repository/globus.js b/core/database/foxx/api/models/repositories/repository/globus.js new file mode 100644 index 000000000..8179f7f73 --- /dev/null +++ b/core/database/foxx/api/models/repositories/repository/globus.js @@ -0,0 +1,275 @@ +"use strict"; + +const Joi = require("joi"); +const { RepositoryType, createAllocationResult } = require("../types"); +const { ExecutionMethod } = require("../../../lib/execution_types"); +const { BaseRepository } = require("../base_repository"); +const { + validateCommonFields, + validateAllocationParams, + validateNonEmptyString, + validateRepositoryPath, + validatePOSIXPath, +} = require("../validation"); +const g_tasks = require("../../../tasks"); +const error = require("../../../lib/error_codes"); +const { Result } = require("../../../lib/result"); + +/** + * Globus-specific configuration + * @param {object} config - Globus configuration object + * @param {string} config.endpoint - Globus endpoint identifier + * @param {string} config.path - Repository path on filesystem + * @param {string} config.pub_key - Public key for ZeroMQ CURVE authentication + * @param {string} config.address - Network address + * @param {string} [config.exp_path] - Export path + * @returns {{endpoint: string, path: string, pub_key: string, address: string, exp_path: string }} Globus configuration object + */ +const createGlobusConfig = ({ endpoint, path, pub_key, address, exp_path }) => ({ + endpoint, + path, + pub_key, + address, + exp_path, +}); + +/** + * @module globus + * Globus repository implementation + * Implements repository operations specific to Globus-backed repositories + **/ + +const validatePartialGlobusAllocationParams = (params) => { + if (params.data_limit <= 0) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: + "Allocation data_limit must be a positive number data_limit: " + params.data_limit, + }); + } + return Result.ok(true); +}; + +// Create allocation in Globus repository (async via task) +// +// Expectation +// +// params = { +// "client": { +// "_id": "u/bob", +// "is_admin": false +// }, +// "subject": "u/tim", +// "data_limit": 100000, +// "rec_limit": 20000, +// +// } +// +class GlobusRepo extends BaseRepository { + constructor(config) { + const config_result = GlobusRepo.validate(config); + if (config_result.ok == false) { + return config_result; + } + + const globusConfig = createGlobusConfig({ + endpoint: config.endpoint, + path: config.path, + pub_key: config.pub_key, + address: config.address, + exp_path: config.exp_path, + }); + + const result = super(config, globusConfig); + if (result.ok == false) { + return result; + } + this.repoData = result.value.repoData; + + return Result.ok(this.value); + } + + type() { + return RepositoryType.GLOBUS; + } + + createAllocation(params) { + // Validate allocation parameters + const validationResult = validateAllocationParams(params); + if (!validationResult.ok) { + return validationResult; + } + + const validationGlobusResult = validatePartialGlobusAllocationParams(params); + if (!validationGlobusResult.ok) { + return validationGlobusResult; + } + + try { + // Create task for async Globus allocation + // Note: taskInitAllocCreate expects (client, repo_id, subject_id, data_limit, rec_limit) + + // params.client must contain _id, and is_admin members + const taskResult = g_tasks.taskInitAllocCreate( + params.client, + this.repoData.id, + params.subject, + params.size || params.data_limit, // Handle both parameter names + params.rec_limit || 1000000, // Default to 1M records if not specified + ); + + // The taskResult contains { task: taskObject } + // We need to return the task properties that the web service expects + const task = taskResult.task; + + // Return a structure that matches what the original API expects + // The web service needs properties like state, task_id, status, etc. + return Result.ok({ + id: `alloc/${Date.now()}`, // Temporary allocation ID format + repo_id: this.repoData.id, + subject: params.subject, + task_id: task._id, + status: task.status, + state: task.state, // Important: include the state property + queue_time: task.ct || Date.now(), + }); + } catch (e) { + // Handle both Error objects and array-style errors + const errorMessage = e.message || (Array.isArray(e) && e[1]) || String(e); + return Result.err({ + code: error.ERR_INTERNAL_FAULT, + message: `Failed to create allocation task: ${errorMessage}`, + }); + } + } + + // Delete allocation from Globus repository (async via task) + deleteAllocation(client, subject) { + if (!subject || typeof subject !== "string") { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: "Subject ID is required for allocation deletion", + }); + } + + try { + // Create task for async Globus allocation deletion + const task_result = g_tasks.taskInitAllocDelete(client, this.repoData.id, subject); + + return Result.ok(createAllocationResult(ExecutionMethod.DEFERRED, task_result.task)); + } catch (e) { + const errorMessage = e.message || (Array.isArray(e) && e[1]) || String(e); + return Result.err({ + code: error.ERR_INTERNAL_FAULT, + message: `Failed to create allocation task: ${errorMessage}`, + }); + } + } + + static validate(config) { + if (config == null) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: "Unable to validate globus repo config 'null' config provided.", + }); + } + // For partial updates, we don't require all fields + // Only validate the fields that are provided + const errors = []; + + const commonResult = validateCommonFields(config); + if (!commonResult.ok) { + return commonResult; + } + + // Define Joi schema using old-style .error() message customization + const schema = Joi.object() + .keys({ + pub_key: Joi.string() + .min(1) + .error((errors) => { + errors.forEach((err) => { + switch (err.type) { + case "string.base": + err.message = "Public key must be a string"; + break; + case "string.min": + case "any.empty": + err.message = "Public key cannot be empty"; + break; + } + }); + return errors; + }), + + address: Joi.string() + .min(1) + .error((errors) => { + errors.forEach((err) => { + switch (err.type) { + case "string.base": + err.message = "Address must be a string"; + break; + case "string.min": + case "any.empty": + err.message = "Address cannot be empty"; + break; + } + }); + return errors; + }), + + endpoint: Joi.string() + .min(1) + .error((errors) => { + errors.forEach((err) => { + switch (err.type) { + case "string.base": + err.message = "Endpoint must be a string"; + break; + case "string.min": + case "any.empty": + err.message = "Endpoint cannot be empty"; + break; + } + }); + return errors; + }), + + path: Joi.string().optional(), + exp_path: Joi.string().optional(), + }) + .unknown(true); // allow extra fields not explicitly validated + + // Validate + const { error: joiError, value } = Joi.validate(config, schema, { + abortEarly: false, // collect all errors + }); + + if (joiError) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: joiError.details.map((d) => d.message).join("; "), + }); + } + + // Perform additional custom validations (that require multiple fields) + if (config.path !== undefined && config.key) { + const pathResult = validateRepositoryPath(config.path, config.key); + if (!pathResult.ok) { + return pathResult; + } + } + + return Result.ok(true); + } + + // Globus repositories support data operations + supportsDataOperations() { + return Result.ok(true); + } +} + +module.exports = { + GlobusRepo, +}; diff --git a/core/database/foxx/api/models/repositories/repository/metadata.js b/core/database/foxx/api/models/repositories/repository/metadata.js new file mode 100644 index 000000000..3dc280b06 --- /dev/null +++ b/core/database/foxx/api/models/repositories/repository/metadata.js @@ -0,0 +1,297 @@ +"use strict"; + +const { createAllocationResult, RepositoryType } = require("../types"); +const { ExecutionMethod } = require("../../../lib/execution_types"); +const { BaseRepository } = require("../base_repository.js"); +const { + validateAllocationParams, + validateRepoData, + validateCommonFields, +} = require("../validation"); +const error = require("../../../lib/error_codes"); +const { Result } = require("../../../lib/result"); +const permissions = require("../../../lib/permissions"); +const g_db = require("@arangodb").db; + +/** + * @module metadata + * @description Metadata-only repository implementation + * Implements repository operations for repositories that only store metadata without actual data storage backend + **/ + +// Validate metadata repository (already validated in factory) +class MetadataRepo extends BaseRepository { + constructor(config) { + const config_result = MetadataRepo.validate(config); + if (config_result.ok == false) { + return config_result; + } + + const result = super(config); + if (result.ok == false) { + return result; + } + this.repoData = result.value.repoData; + return Result.ok(this.value); + } + + type() { + return RepositoryType.METADATA; + } + + // Create allocation in metadata repository (direct/synchronous) + // NOTE: We do not need a transaction here, we are assuming the transaction + // declared in the router covers all arango documents and collections used here + createAllocation(params) { + // Validate allocation parameters + const validationResult = validateAllocationParams(params); + if (!validationResult.ok) { + return validationResult; + } + const validationResultRepo = validateRepoData(this.repoData); + if (!validationResultRepo.ok) { + return validationResultRepo; + } + + try { + // For metadata-only repos, allocations are just database records + // No actual storage allocation happens + // + // Unlike the Globus Allocation creation process, we do not need to + // touch the block collection because, we have not created a task. + // blocks documents are needed to track what tasks are blocked + // + // The transaction needs to include the subect document and the repo document + // to avoid the case where the nodes no longer exist. + if (!g_db._exists(this.repoData.id)) { + return Result.err({ + code: error.ERR_NOT_FOUND, + message: + "Failed to create metadata allocation: Repo, '" + + this.repoData.id + + "', does not exist.", + }); + } + if (!g_db._exists(params.subject)) { + return Result.err({ + code: error.ERR_NOT_FOUND, + message: + "Failed to create metadata allocation: Subject, '" + + params.subject + + "', does not exist.", + }); + } + + // Check for proper permissions + try { + permissions.ensureAdminPermRepo(params.client, this.repoData.id); + } catch (e) { + const errorMessage = e.message || (Array.isArray(e) && e[1]) || String(e); + return Result.err({ + code: error.ERR_PERM_DENIED, + message: "Allocation creation failed - " + errorMessage, + }); + } + // Check if there is already a matching allocation + var alloc = g_db.alloc.firstExample({ + _from: params.subject, + _to: this.repoData.id, + }); + if (alloc) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: + "Failed to create metadata allocation: Subject, '" + + params.subject + + "', already has an allocation on " + + this.repoData.id, + }); + } + + const allocation = g_db.alloc.save({ + _from: params.subject, + _to: this.repoData.id, + data_limit: params.data_limit, + rec_limit: params.rec_limit, + rec_count: 0, + data_size: 0, + path: "/", + type: RepositoryType.METADATA, + }); + + // Save to allocations collection (would need to be created) + // For now, return success with the allocation data + const result = { + id: allocation._id, + repo_id: this.repoData.id, + subject: params.subject, + rec_limit: params.rec_limit, + }; + + return Result.ok(createAllocationResult(ExecutionMethod.DIRECT, result)); + } catch (e) { + return Result.err({ + code: error.ERR_INTERNAL_FAULT, + message: `Failed to create metadata allocation: ${e.message}`, + }); + } + } + + // Delete allocation from metadata repository (direct/synchronous) + deleteAllocation(client, subject) { + if (!subject || typeof subject !== "string") { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: "Subject ID is required for allocation deletion", + }); + } + + try { + if (!g_db._exists(this.repoData.id)) { + return Result.err({ + code: error.ERR_NOT_FOUND, + message: + "Failed to delete metadata allocation: Repo, '" + + this.repoData.id + + "', does not exist ", + }); + } + + if (!g_db._exists(subject)) { + return Result.err({ + code: error.ERR_NOT_FOUND, + message: + "Failed to delete metadata allocation: Subject, '" + + subject + + "', does not exist ", + }); + } + + var repo = g_db.repo.document(this.repoData.id); + + try { + permissions.ensureAdminPermRepo(client, this.repoData.id); + } catch (e) { + if (e == error.ERR_PERM_DENIED) { + return Result.err({ + code: error.ERR_PERM_DENIED, + message: + "Failed to delete metadata allocation: client, '" + + client._id + + "', does not have permissions to delete an allocation of " + + subject + + " on " + + this.repoData.id, + }); + } + } + + let alloc; + try { + alloc = g_db.alloc.firstExample({ + _from: subject, + _to: this.repoData.id, + }); + } catch { + alloc = null; + } + if (!alloc) { + return Result.err({ + code: error.ERR_NOT_FOUND, + message: + "Failed to delete metadata allocation: Subject, '" + + subject + + "', has no allocation on " + + this.repoData.id, + }); + } + + var count = g_db + ._query( + "return length(for v, e in 1..1 inbound @repo loc filter e.uid == @subj return 1)", + { + repo: this.repoData.id, + subj: subject, + }, + ) + .next(); + if (count) { + return Result.err({ + code: error.ERR_IN_USE, + message: + "Failed to delete metadata allocation: " + + count + + " records found on the allocaition ", + }); + } + + g_db.alloc.removeByExample({ + _from: subject, + _to: this.repoData.id, + }); + // For metadata-only repos, just remove the database record + // No actual storage deallocation needed + const result = { + repo_id: this.repoData.id, + subject: subject, + status: "completed", + message: "Metadata allocation removed", + }; + + return Result.ok(createAllocationResult(ExecutionMethod.DIRECT, result)); + } catch (e) { + return Result.err({ + code: error.ERR_INTERNAL_FAULT, + message: `Failed to delete metadata location: ${e.message}`, + }); + } + } + + // Normalize admin/admins field for backward compatibility + static validate(config) { + if (config == null) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: "Unable to validate metadata repo config 'null' config provided.", + }); + } + + const commonResult = validateCommonFields(config); + if (!commonResult.ok) { + return commonResult; + } + + const errors = []; + if (config.capacity != 0) { + errors.push("Metadata repository capacity must be 0: capacity=" + config.capacity); + } + // Metadata repositories don't need Globus-specific fields + // But should not have them either + const invalidFields = ["pub_key", "address", "endpoint", "path", "exp_path"]; + const presentInvalidFields = invalidFields.filter((field) => config[field] !== undefined); + + if (presentInvalidFields.length > 0) { + errors.push( + `Metadata-only repositories should not have: ${presentInvalidFields.join(", ")}`, + ); + } + + if (errors.length > 0) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: errors.join("; "), + }); + } + + return Result.ok(true); + } + + // Metadata repositories do NOT support data operations + supportsDataOperations() { + return Result.ok(false); + } +} + +module.exports = { + MetadataRepo, +}; diff --git a/core/database/foxx/api/models/repositories/types.js b/core/database/foxx/api/models/repositories/types.js new file mode 100644 index 000000000..663863e46 --- /dev/null +++ b/core/database/foxx/api/models/repositories/types.js @@ -0,0 +1,39 @@ +"use strict"; + +const { ExecutionMethod } = require("../../lib/execution_types"); + +const RepositoryType = Object.freeze({ + GLOBUS: "globus", + METADATA: "metadata", +}); + +/** + * Tagged union for repositories (type + data) + * Rust enums can contain data, creating tagged unions (also called algebraic data types) + * This pattern enables type-safe polymorphism without inheritance + * @param {string} type - Repository type (from RepositoryType enum) + * @param {object} data - Repository data object + * @returns {{type: string, data: object}} Tagged union with type and data fields + * @see https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html#enum-values + */ +const createRepository = (type, data) => ({ + type, + data, +}); + +/** + * Allocation result structure + * @param {string} method - Execution method (DEFERRED or DIRECT) + * @param {object} payload - Result payload (task info or direct result) + * @returns {{execution_method: string, task?: object, result?: object}} Allocation result with execution method and appropriate payload + */ +const createAllocationResult = (method, payload) => ({ + execution_method: method, + ...(method === ExecutionMethod.DEFERRED ? { task: payload } : { result: payload }), +}); + +module.exports = { + RepositoryType, + createRepository, + createAllocationResult, +}; diff --git a/core/database/foxx/api/models/repositories/validation.js b/core/database/foxx/api/models/repositories/validation.js new file mode 100644 index 000000000..e0cbde626 --- /dev/null +++ b/core/database/foxx/api/models/repositories/validation.js @@ -0,0 +1,231 @@ +"use strict"; + +const Joi = require("joi"); +const { Result } = require("../../lib/result"); +const error = require("../../lib/error_codes"); + +// Define error code constant if not available from g_lib +const ERR_INVALID_PARAM = error.ERR_INVALID_PARAM !== undefined ? error.ERR_INVALID_PARAM : 2; +const ERR_INVALID_OPERATION = + error.ERR_INVALID_OPERATION !== undefined ? error.ERR_INVALID_OPERATION : 400; + +/** + * Pure functions that return Result types for error handling + */ + +// Validate that a value is a non-empty string +// Reusable helper following DRY principle +const validateNonEmptyString = (value, fieldName) => { + if (!value || typeof value !== "string" || value.trim() === "") { + return Result.err({ + code: ERR_INVALID_PARAM, + message: `${fieldName} is required and must be a non-empty string`, + }); + } + return Result.ok(true); +}; + +// Validate common repository fields +// Pure function - no side effects, deterministic output +const validateCommonFields = (config) => { + const schema = Joi.object() + .keys({ + id: Joi.string() + .min(1) + .error((errors) => { + errors.forEach((err) => { + switch (err.type) { + case "string.base": + err.message = "Repository ID must be a non-empty string"; + break; + } + }); + return errors; + }), + + title: Joi.string() + .min(1) + .error((errors) => { + errors.forEach((err) => { + switch (err.type) { + case "string.base": + err.message = "Repository title must be a string"; + break; + case "string.min": + case "any.empty": + err.message = "Repository title cannot be empty"; + break; + } + }); + return errors; + }), + + key: Joi.string() + .max(40) + .lowercase() + .regex(/^[a-z0-9_.-]+$/) + .error((errors) => { + errors.forEach((err) => { + switch (err.type) { + case "string.base": + err.message = "Repository key must be a string"; + break; + case "string.empty": + err.message = "Repository key is empty"; + break; + case "string.max": + err.message = "Repository key cannot be longer than 40 characters"; + break; + case "string.pattern.base": + err.message = + "Repository key may only contain lowercase letters, numbers, underscores, hyphens and periods."; + break; + } + }); + return errors; + }), + + capacity: Joi.number() + .min(0) + .error((errors) => { + errors.forEach((err) => { + switch (err.type) { + case "number.base": + err.message = "Repository capacity must be a number"; + break; + case "number.min": + err.message = "Repository capacity cannot be negative"; + break; + } + }); + return errors; + }), + + key: Joi.string().optional(), + }) + .unknown(true); // allow extra fields not explicitly validated + + const { error: joiError, value } = Joi.validate(config, schema, { + abortEarly: false, // collect all errors + }); + + if (joiError) { + return Result.err({ + code: error.ERR_INVALID_PARAM, + message: joiError.details.map((d) => d.message).join("; "), + }); + } + + return Result.ok(true); +}; + +// Validate POSIX path format +const validatePOSIXPath = (path, fieldName) => { + if (!path || typeof path !== "string") { + return Result.err({ + code: ERR_INVALID_PARAM, + message: `${fieldName} must be a non-empty string`, + }); + } + + if (!path.startsWith("/")) { + return Result.err({ + code: ERR_INVALID_PARAM, + message: `${fieldName} must be an absolute path (start with '/')`, + }); + } + + // Check for invalid characters in path + if (path.includes("..") || path.includes("//")) { + return Result.err({ + code: ERR_INVALID_PARAM, + message: `${fieldName} contains invalid path sequences`, + }); + } + + return Result.ok(true); +}; + +// Validate repository path ends with ID +const validateRepositoryPath = (path, repoId) => { + const pathResult = validatePOSIXPath(path, "Repository path"); + if (!pathResult.ok) { + return pathResult; + } + + // Ensure path ends with / + const normalizedPath = path.endsWith("/") ? path : path + "/"; + + // Extract last component + const idx = normalizedPath.lastIndexOf("/", normalizedPath.length - 2); + const lastComponent = normalizedPath.slice(idx + 1, normalizedPath.length - 1); + + if (lastComponent !== repoId) { + return Result.err({ + code: ERR_INVALID_PARAM, + message: `Repository path must end with repository ID (${repoId})`, + }); + } + + return Result.ok(true); +}; + +const validateRepoData = (repoData) => { + if (typeof repoData === "undefined") { + return Result.err({ + code: ERR_INVALID_PARAM, + message: "Repo data is undefined.", + }); + } + return Result.ok(true); +}; + +// Validate allocation parameters +const validateAllocationParams = (params) => { + const errors = []; + + const subjectValidation = validateNonEmptyString(params.subject, "Allocation subject"); + if (!subjectValidation.ok) { + errors.push(subjectValidation.error.message); + } + + if (typeof params.data_limit !== "number") { + errors.push( + "Allocation data_limit must be a number, type: " + + typeof params.data_limit + + " data_limit: " + + params.data_limit, + ); + } + + if (typeof params.rec_limit !== "number") { + errors.push( + "Allocation rec_limit must be a number, type: " + + typeof params.rec_limit + + " rec_limit: " + + params.rec_limit, + ); + } + + if (params.path && typeof params.path !== "string") { + errors.push("Allocation path must be a string if provided"); + } + + if (errors.length > 0) { + return Result.err({ + code: ERR_INVALID_PARAM, + message: errors.join("; "), + }); + } + + return Result.ok(true); +}; + +module.exports = { + validateNonEmptyString, + validateCommonFields, + validatePOSIXPath, + validateRepositoryPath, + validateAllocationParams, + validateRepoData, +}; diff --git a/core/database/foxx/api/note_router.js b/core/database/foxx/api/note_router.js index 210bce368..445ed28d1 100644 --- a/core/database/foxx/api/note_router.js +++ b/core/database/foxx/api/note_router.js @@ -5,6 +5,8 @@ const router = createRouter(); const joi = require("joi"); const g_db = require("@arangodb").db; const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); module.exports = router; @@ -24,17 +26,17 @@ router var id = g_lib.resolveDataCollID(req.queryParams.subject, client), doc = g_db._document(id); - if (!g_lib.hasAdminPermObject(client, id)) { + if (!permissions.hasAdminPermObject(client, id)) { if ( - (g_lib.getPermissions(client, doc, g_lib.PERM_RD_REC) & - g_lib.PERM_RD_REC) == + (permissions.getPermissions(client, doc, permissions.PERM_RD_REC) & + permissions.PERM_RD_REC) == 0 ) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } if (req.queryParams.activate) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Only owner or admin may create a new annotaion in active state.", ]; } @@ -118,13 +120,13 @@ router if (!req.queryParams.id.startsWith("n/")) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid annotaion ID '" + req.queryParams.id + "'", ]; if (!g_db._exists(req.queryParams.id)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Annotaion ID '" + req.queryParams.id + "' does not exist.", ]; @@ -144,14 +146,14 @@ router */ if (req.queryParams.new_state === note.state) { - throw [g_lib.ERR_INVALID_PARAM, "Invalid new state for annotaion."]; + throw [error.ERR_INVALID_PARAM, "Invalid new state for annotaion."]; } // Subject admins can do anything // Creators cannot edit if state is active // Others can not update - if (!g_lib.hasAdminPermObject(client, ne._from)) { + if (!permissions.hasAdminPermObject(client, ne._from)) { if (client._id == note.creator) { if ( (note.state == g_lib.NOTE_ACTIVE && @@ -160,10 +162,10 @@ router req.queryParams.title != undefined)) || req.queryParams.new_state == g_lib.NOTE_ACTIVE ) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } else { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } @@ -262,20 +264,20 @@ router if (!req.queryParams.id.startsWith("n/")) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid annotaion ID '" + req.queryParams.id + "'", ]; if (!g_db._exists(req.queryParams.id)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Annotaion ID '" + req.queryParams.id + "' does not exist.", ]; var note = g_db.n.document(req.queryParams.id); if (req.queryParams.comment_idx >= note.comments.length) - throw [g_lib.ERR_INVALID_PARAM, "Comment index out of range."]; + throw [error.ERR_INVALID_PARAM, "Comment index out of range."]; var obj = { ut: Math.floor(Date.now() / 1000), @@ -283,7 +285,7 @@ router comment = note.comments[req.queryParams.comment_idx]; if (client._id != comment.user) { - throw [g_lib.ERR_PERM_DENIED, "Only original commentor may edit comments."]; + throw [error.ERR_PERM_DENIED, "Only original commentor may edit comments."]; } if (req.queryParams.comment != comment.comment) { @@ -318,13 +320,13 @@ router if (!req.queryParams.id.startsWith("n/")) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid annotaion ID '" + req.queryParams.id + "'", ]; if (!g_db._exists(req.queryParams.id)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Annotaion ID '" + req.queryParams.id + "' does not exist.", ]; @@ -334,23 +336,23 @@ router var ne = g_db.note.firstExample({ _to: note._id, }); - if (!client || !g_lib.hasAdminPermObject(client, ne._from)) { + if (!client || !permissions.hasAdminPermObject(client, ne._from)) { if (note.state == g_lib.NOTE_ACTIVE) { // Anyone with read permission to subject doc can comment on active notes var doc = g_db._document(ne._from); if (!client) { if (!g_lib.hasPublicRead(doc._id)) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } else if ( - (g_lib.getPermissions(client, doc, g_lib.PERM_RD_REC) & - g_lib.PERM_RD_REC) == + (permissions.getPermissions(client, doc, permissions.PERM_RD_REC) & + permissions.PERM_RD_REC) == 0 ) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } else { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } } @@ -391,7 +393,7 @@ router results = g_db._query(qry, { subj: id, }); - } else if (g_lib.hasAdminPermObject(client, id)) { + } else if (permissions.hasAdminPermObject(client, id)) { qry = "for v in 1..1 outbound @subj note sort v.ut desc return {_id:v._id,state:v.state,type:v.type,subject_id:v.subject_id,title:v.title,creator:v.creator,parent_id:v.parent_id,ct:v.ct,ut:v.ut}"; results = g_db._query(qry, { diff --git a/core/database/foxx/api/process.js b/core/database/foxx/api/process.js index c989f0a57..9eaa4eff1 100644 --- a/core/database/foxx/api/process.js +++ b/core/database/foxx/api/process.js @@ -2,6 +2,8 @@ const g_db = require("@arangodb").db; const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); module.exports = (function () { var obj = {}; @@ -41,7 +43,7 @@ module.exports = (function () { * - `ext_data`: A list of external data records. * - `visited`: A record of visited items during recursion. * - * @throws {Error} g_lib.ERR_INVALID_MODE - If an invalid mode is passed. + * @throws {Error} error.ERR_INVALID_MODE - If an invalid mode is passed. * * @example * const result = obj.preprocessItems(client, newOwnerId, dataIds, g_lib.TT_DATA_GET); @@ -67,31 +69,31 @@ module.exports = (function () { switch (a_mode) { case g_lib.TT_DATA_GET: - ctxt.data_perm = g_lib.PERM_RD_DATA; - ctxt.coll_perm = g_lib.PERM_LIST; + ctxt.data_perm = permissions.PERM_RD_DATA; + ctxt.coll_perm = permissions.PERM_LIST; break; case g_lib.TT_DATA_PUT: - ctxt.data_perm = g_lib.PERM_WR_DATA; + ctxt.data_perm = permissions.PERM_WR_DATA; // Collections not allowed break; case g_lib.TT_REC_ALLOC_CHG: // Must be data owner OR if owned by a project, the project or // an admin, or the creator. - ctxt.coll_perm = g_lib.PERM_LIST; + ctxt.coll_perm = permissions.PERM_LIST; break; case g_lib.TT_REC_OWNER_CHG: // Must have all read+delete, or be owner or creator OR, if owned by a project, the project or // an admin. - ctxt.data_perm = g_lib.PERM_RD_ALL | g_lib.PERM_DELETE; - ctxt.coll_perm = g_lib.PERM_LIST; + ctxt.data_perm = permissions.PERM_RD_ALL | permissions.PERM_DELETE; + ctxt.coll_perm = permissions.PERM_LIST; break; case g_lib.TT_REC_DEL: - ctxt.data_perm = g_lib.PERM_DELETE; - ctxt.coll_perm = g_lib.PERM_DELETE; + ctxt.data_perm = permissions.PERM_DELETE; + ctxt.coll_perm = permissions.PERM_DELETE; break; case g_lib.TT_DATA_EXPORT: - ctxt.data_perm = g_lib.PERM_RD_REC | g_lib.PERM_RD_META; - ctxt.coll_perm = g_lib.PERM_LIST; + ctxt.data_perm = permissions.PERM_RD_REC | permissions.PERM_RD_META; + ctxt.coll_perm = permissions.PERM_LIST; break; } @@ -170,7 +172,7 @@ module.exports = (function () { if (id.charAt(0) == "c") { if (a_ctxt.mode == g_lib.TT_DATA_PUT) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Collections not supported for PUT operations.", ]; is_coll = true; @@ -195,7 +197,7 @@ module.exports = (function () { if (!g_db._exists(id)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, (is_coll ? "Collection '" : "Data record '") + id + "' does not exist.", ]; @@ -211,7 +213,7 @@ module.exports = (function () { // Make sure user isn't trying to delete root if (doc.is_root && a_ctxt.mode == g_lib.TT_REC_DEL) - throw [g_lib.ERR_PERM_DENIED, "Cannot delete root collection " + id]; + throw [error.ERR_PERM_DENIED, "Cannot delete root collection " + id]; /* If either collection OR data permission are not satisfied, will need to evaluate grant and inherited collection @@ -222,12 +224,12 @@ module.exports = (function () { (coll_perm & a_ctxt.coll_perm) != a_ctxt.coll_perm || (data_perm & a_ctxt.data_perm) != a_ctxt.data_perm ) { - if (!g_lib.hasAdminPermObjectLoaded(a_ctxt.client, doc)) { + if (!permissions.hasAdminPermObjectLoaded(a_ctxt.client, doc)) { if (a_coll_perm != null) // Already have inherited permission, don't ask again - perm = g_lib.getPermissionsLocal(a_ctxt.client._id, doc); + perm = permissions.getPermissionsLocal(a_ctxt.client._id, doc); else - perm = g_lib.getPermissionsLocal( + perm = permissions.getPermissionsLocal( a_ctxt.client._id, doc, true, @@ -244,7 +246,7 @@ module.exports = (function () { ((perm.grant | perm.inherited) & a_ctxt.coll_perm) != a_ctxt.coll_perm ) { - throw [g_lib.ERR_PERM_DENIED, "Permission denied for collection " + id]; + throw [error.ERR_PERM_DENIED, "Permission denied for collection " + id]; } // inherited and inhgrant perms only apply to recursion @@ -271,19 +273,19 @@ module.exports = (function () { if (doc.owner != a_ctxt.client._id) { if (doc.owner.startsWith("p/")) { if (!(doc.owner in a_ctxt.visited)) { - if (g_lib.hasManagerPermProj(a_ctxt.client, doc.owner)) { + if (permissions.hasManagerPermProj(a_ctxt.client, doc.owner)) { // Put project ID in visited to avoid checking permissions again a_ctxt.visited[doc.owner] = 1; } else { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied for data record " + id, ]; } } } else { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied for data record " + id, ]; } @@ -300,7 +302,7 @@ module.exports = (function () { if (doc.owner.startsWith("p/")) { if (!(doc.owner in a_ctxt.visited)) { - if (g_lib.hasManagerPermProj(a_ctxt.client, doc.owner)) { + if (permissions.hasManagerPermProj(a_ctxt.client, doc.owner)) { // Put project ID in visited to avoid checking permissions again a_ctxt.visited[doc.owner] = 1; ok = true; @@ -313,9 +315,9 @@ module.exports = (function () { if (!ok && (a_data_perm & a_ctxt.data_perm) != a_ctxt.data_perm) { if (a_data_perm != null) // Already have inherited permission, don't ask again - perm = g_lib.getPermissionsLocal(a_ctxt.client._id, doc); + perm = permissions.getPermissionsLocal(a_ctxt.client._id, doc); else - perm = g_lib.getPermissionsLocal( + perm = permissions.getPermissionsLocal( a_ctxt.client._id, doc, true, @@ -327,19 +329,19 @@ module.exports = (function () { a_ctxt.data_perm ) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied for data record " + id, ]; } } } else { if ((a_data_perm & a_ctxt.data_perm) != a_ctxt.data_perm) { - if (!g_lib.hasAdminPermObjectLoaded(a_ctxt.client, doc)) { + if (!permissions.hasAdminPermObjectLoaded(a_ctxt.client, doc)) { if (a_data_perm != null) // Already have inherited permission, don't ask again - perm = g_lib.getPermissionsLocal(a_ctxt.client._id, doc); + perm = permissions.getPermissionsLocal(a_ctxt.client._id, doc); else - perm = g_lib.getPermissionsLocal( + perm = permissions.getPermissionsLocal( a_ctxt.client._id, doc, true, @@ -351,7 +353,7 @@ module.exports = (function () { a_ctxt.data_perm ) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied for data record " + id, ]; } @@ -362,7 +364,7 @@ module.exports = (function () { if (doc.external) { if (a_ctxt.mode == g_lib.TT_DATA_PUT) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Cannot upload to external data on record '" + doc.id + "'.", ]; diff --git a/core/database/foxx/api/proj_router.js b/core/database/foxx/api/proj_router.js index 0dfb1674b..a237b561f 100644 --- a/core/database/foxx/api/proj_router.js +++ b/core/database/foxx/api/proj_router.js @@ -6,6 +6,8 @@ const joi = require("joi"); const g_db = require("@arangodb").db; const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); const g_tasks = require("./tasks"); module.exports = router; @@ -47,7 +49,7 @@ router .toArray(); if (repos.length == 0) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Projects can only be created by repository administrators.", ]; @@ -63,7 +65,7 @@ router .next(); if (count >= client.max_proj) throw [ - g_lib.ERR_ALLOCATION_EXCEEDED, + error.ERR_ALLOCATION_EXCEEDED, "Project limit reached (" + client.max_proj + "). Contact system administrator to increase limit.", @@ -149,8 +151,8 @@ router g_db.acl.save({ _from: root._id, _to: mem_grp._id, - grant: g_lib.PERM_MEMBER, - inhgrant: g_lib.PERM_MEMBER, + grant: permissions.PERM_MEMBER, + inhgrant: permissions.PERM_MEMBER, }); proj.new.admins = []; @@ -162,7 +164,7 @@ router uid = req.queryParams.admins[i]; if (uid == client._id) continue; if (!g_db._exists(uid)) - throw [g_lib.ERR_NOT_FOUND, "User, " + uid + ", not found"]; + throw [error.ERR_NOT_FOUND, "User, " + uid + ", not found"]; g_db.admin.save({ _from: proj._id, @@ -177,7 +179,7 @@ router uid = req.queryParams.members[i]; if (uid == client._id || proj.new.admins.indexOf(uid) != -1) continue; if (!g_db._exists(uid)) - throw [g_lib.ERR_NOT_FOUND, "User, " + uid + ", not found"]; + throw [error.ERR_NOT_FOUND, "User, " + uid + ", not found"]; g_db.member.save({ _from: mem_grp._id, @@ -229,13 +231,13 @@ router var proj_id = req.queryParams.id; if (!g_db.p.exists(proj_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such project '" + proj_id + "'"]; + throw [error.ERR_INVALID_PARAM, "No such project '" + proj_id + "'"]; var is_admin = true; - if (!g_lib.hasAdminPermProj(client, proj_id)) { - if (!g_lib.hasManagerPermProj(client, proj_id)) { - throw g_lib.ERR_PERM_DENIED; + if (!permissions.hasAdminPermProj(client, proj_id)) { + if (!permissions.hasManagerPermProj(client, proj_id)) { + throw error.ERR_PERM_DENIED; } is_admin = false; } @@ -258,7 +260,7 @@ router obj.desc != undefined || req.queryParams.admins != undefined ) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } @@ -280,7 +282,7 @@ router uid = req.queryParams.admins[i]; if (uid == owner_id) continue; if (!g_db._exists(uid)) - throw [g_lib.ERR_NOT_FOUND, "User, " + uid + ", not found"]; + throw [error.ERR_NOT_FOUND, "User, " + uid + ", not found"]; g_db.admin.save({ _from: proj_id, @@ -333,7 +335,7 @@ router uid = req.queryParams.members[i]; if (uid == owner_id || proj.new.admins.indexOf(uid) != -1) continue; if (!g_db._exists(uid)) - throw [g_lib.ERR_NOT_FOUND, "User, " + uid + ", not found"]; + throw [error.ERR_NOT_FOUND, "User, " + uid + ", not found"]; g_db.member.save({ _from: mem_grp._id, @@ -390,7 +392,7 @@ router const client = g_lib.getUserFromClientID_noexcept(req.queryParams.client); if (!g_db.p.exists(req.queryParams.id)) - throw [g_lib.ERR_INVALID_PARAM, "No such project '" + req.queryParams.id + "'"]; + throw [error.ERR_INVALID_PARAM, "No such project '" + req.queryParams.id + "'"]; var proj = g_db.p.document({ _id: req.queryParams.id, @@ -525,7 +527,7 @@ router var user_id; if (req.queryParams.subject) { - g_lib.ensureAdminPermUser(client, req.queryParams.subject); + permissions.ensureAdminPermUser(client, req.queryParams.subject); } else user_id = client._id; if (req.queryParams.offset != undefined && req.queryParams.count != undefined) { @@ -646,10 +648,10 @@ router else subj = client._id; if (!req.queryParams.id.startsWith("p/")) - throw [g_lib.ERR_INVALID_PARAM, "Invalid project ID: " + req.queryParams.id]; + throw [error.ERR_INVALID_PARAM, "Invalid project ID: " + req.queryParams.id]; if (!g_db._exists(req.queryParams.id)) - throw [g_lib.ERR_NOT_FOUND, "Project, " + req.queryParams.id + ", not found"]; + throw [error.ERR_NOT_FOUND, "Project, " + req.queryParams.id + ", not found"]; var role = g_lib.getProjectRole(subj, req.queryParams.id); diff --git a/core/database/foxx/api/query_router.js b/core/database/foxx/api/query_router.js index 3a3bedbfa..9e26b2e19 100644 --- a/core/database/foxx/api/query_router.js +++ b/core/database/foxx/api/query_router.js @@ -4,6 +4,7 @@ const createRouter = require("@arangodb/foxx/router"); const router = createRouter(); const joi = require("joi"); +const error = require("./lib/error_codes"); const g_db = require("@arangodb").db; const g_graph = require("@arangodb/general-graph")._graph("sdmsg"); const g_lib = require("./support"); @@ -38,7 +39,7 @@ router if (count >= client.max_sav_qry) throw [ - g_lib.ERR_ALLOCATION_EXCEEDED, + error.ERR_ALLOCATION_EXCEEDED, "Saved query limit reached (" + client.max_sav_qry + "). Contact system administrator to increase limit.", @@ -118,7 +119,7 @@ router var qry = g_db.q.document(req.body.id); if (client._id != qry.owner && !client.is_admin) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } // Update time and title (if set) @@ -190,7 +191,7 @@ router var qry = g_db.q.document(req.queryParams.id); if (client._id != qry.owner && !client.is_admin) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } qry.id = qry._id; @@ -222,7 +223,7 @@ router for (var i in req.queryParams.ids) { if (!req.queryParams.ids[i].startsWith("q/")) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid query ID '" + req.queryParams.ids[i] + "'.", ]; } @@ -232,13 +233,13 @@ router }); if (!owner) { throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Query '" + req.queryParams.ids[i] + "' not found.", ]; } if (client._id != owner._to && !client.is_admin) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } g_graph.q.remove(owner._from); @@ -313,7 +314,7 @@ function execQuery(client, mode, published, orig_query) { if (query.params.owner.startsWith("u/") && query.params.owner != client._id) { // A non-client owner for non-public searches means this is a search over shared data if (!g_db.u.exists(query.params.owner)) - throw [g_lib.ERR_NOT_FOUND, "user " + query.params.owner + " not found"]; + throw [error.ERR_NOT_FOUND, "user " + query.params.owner + " not found"]; ctxt = query.params.owner; @@ -330,7 +331,7 @@ function execQuery(client, mode, published, orig_query) { .toArray(); if (!query.params.cols) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "No access to user '" + query.params.owner + "' data/collections.", ]; } @@ -338,7 +339,7 @@ function execQuery(client, mode, published, orig_query) { } } else if (query.params.owner.startsWith("p/")) { if (!g_db.p.exists(query.params.owner)) - throw [g_lib.ERR_NOT_FOUND, "Project " + query.params.owner + " not found"]; + throw [error.ERR_NOT_FOUND, "Project " + query.params.owner + " not found"]; // Must determine clients access to the project @@ -364,7 +365,7 @@ function execQuery(client, mode, published, orig_query) { .toArray(); if (!query.params.cols) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "No access to project '" + query.params.owner + "'.", ]; } @@ -395,7 +396,7 @@ function execQuery(client, mode, published, orig_query) { })._to != query.params.owner ) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Collection '" + col + "' not in search scope.", ]; } @@ -414,7 +415,7 @@ function execQuery(client, mode, published, orig_query) { // sch_id is id:ver var idx = query.params.sch_id.indexOf(":"); if (idx < 0) { - throw [g_lib.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; + throw [error.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; } var sch_id = query.params.sch_id.substr(0, idx), sch_ver = parseInt(query.params.sch_id.substr(idx + 1)); @@ -424,7 +425,7 @@ function execQuery(client, mode, published, orig_query) { ver: sch_ver, }); if (!query.params.sch) - throw [g_lib.ERR_NOT_FOUND, "Schema '" + sch_id + "-" + sch_ver + "' does not exist."]; + throw [error.ERR_NOT_FOUND, "Schema '" + sch_id + "-" + sch_ver + "' does not exist."]; query.params.sch = query.params.sch._id; delete query.params.sch_id; @@ -508,7 +509,7 @@ router var qry = g_db.q.document(req.queryParams.id); if (client._id != qry.owner && !client.is_admin) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } if (req.queryParams.offset != undefined && req.queryParams.count != undefined) { diff --git a/core/database/foxx/api/record.js b/core/database/foxx/api/record.js index 36c330672..1c3fbbf97 100644 --- a/core/database/foxx/api/record.js +++ b/core/database/foxx/api/record.js @@ -3,6 +3,7 @@ const g_db = require("@arangodb").db; const g_lib = require("./support"); const { errors } = require("@arangodb"); +const error = require("./lib/error_codes"); /** * Represents a record in the database and provides methods to manage it. @@ -50,12 +51,12 @@ class Record { this.#exists = true; } else { this.#exists = false; - this.#error = g_lib.ERR_NOT_FOUND; + this.#error = error.ERR_NOT_FOUND; this.#err_msg = "Invalid key: (" + a_key + "). No record found."; } } catch (e) { this.#exists = false; - this.#error = g_lib.ERR_INTERNAL_FAULT; + this.#error = error.ERR_INTERNAL_FAULT; this.#err_msg = "Unknown error encountered."; console.log(e); } @@ -77,7 +78,7 @@ class Record { } else if (loc.uid.charAt(0) == "p") { return path + "project/" + loc.uid.substr(2) + "/" + this.#key; } else { - this.#error = g_lib.ERR_INTERNAL_FAULT; + this.#error = error.ERR_INTERNAL_FAULT; this.#err_msg = "Provided path does not fit within supported directory "; this.#err_msg += "structure for repository, no user or project folder has"; this.#err_msg += " been determined for the record."; @@ -98,7 +99,7 @@ class Record { return false; } if (storedPath !== inputPath) { - this.#error = g_lib.ERR_PERM_DENIED; + this.#error = error.ERR_PERM_DENIED; this.#err_msg = "Record path is not consistent with repo expected path is: " + storedPath + @@ -159,7 +160,7 @@ class Record { }); if (!this.#loc) { - this.#error = g_lib.ERR_PERM_DENIED; + this.#error = error.ERR_PERM_DENIED; this.#err_msg = "Permission denied data is not managed by DataFed. This can happen if you try to do a transfer directly from Globus."; return false; @@ -202,7 +203,7 @@ class Record { // If no allocation is found for the item throw an error // if the paths do not align also throw an error. if (!new_alloc) { - this.#error = g_lib.ERR_PERM_DENIED; + this.#error = error.ERR_PERM_DENIED; this.#err_msg = "Permission denied, '" + this.#key + "' is not part of an allocation '"; return false; @@ -211,7 +212,7 @@ class Record { this.#repo = g_db._document(this.#loc.new_repo); if (!this.#repo) { - this.#error = g_lib.ERR_INTERNAL_FAULT; + this.#error = error.ERR_INTERNAL_FAULT; this.#err_msg = "Unable to find repo that record is meant to be allocated too, '" + this.#loc.new_repo + diff --git a/core/database/foxx/api/repo.js b/core/database/foxx/api/repo.js index baea100b9..226179e0b 100644 --- a/core/database/foxx/api/repo.js +++ b/core/database/foxx/api/repo.js @@ -3,6 +3,7 @@ const g_db = require("@arangodb").db; const g_lib = require("./support"); const { errors } = require("@arangodb"); +const error = require("./lib/error_codes"); const pathModule = require("./posix_path"); /** @@ -80,12 +81,12 @@ class Repo { this.#exists = true; } else { this.#exists = false; - this.#error = g_lib.ERR_NOT_FOUND; + this.#error = error.ERR_NOT_FOUND; this.#err_msg = "Invalid repo: (" + a_key + "). No record found."; } } catch (e) { this.#exists = false; - this.#error = g_lib.ERR_INTERNAL_FAULT; + this.#error = error.ERR_INTERNAL_FAULT; this.#err_msg = "Unknown error encountered."; console.log(e); } @@ -135,12 +136,12 @@ class Repo { pathType(a_path) { // Ensure the repo exists if (!this.#exists) { - throw [g_lib.ERR_PERM_DENIED, "Repo does not exist " + this.#repo_id]; + throw [error.ERR_PERM_DENIED, "Repo does not exist " + this.#repo_id]; } let repo = g_db._document(this.#repo_id); if (!repo.path) { - throw [g_lib.ERR_INTERNAL_FAULT, "Repo document is missing path: " + this.#repo_id]; + throw [error.ERR_INTERNAL_FAULT, "Repo document is missing path: " + this.#repo_id]; } // Get and sanitize the repo root path by removing the trailing slash if one exists diff --git a/core/database/foxx/api/repo_router.js b/core/database/foxx/api/repo_router.js index d0c828e8a..6f79c53fb 100644 --- a/core/database/foxx/api/repo_router.js +++ b/core/database/foxx/api/repo_router.js @@ -3,13 +3,47 @@ const createRouter = require("@arangodb/foxx/router"); const router = createRouter(); const joi = require("joi"); - +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); +const { RepositoryType } = require("./models/repositories/types"); +const { Repositories } = require("./models/repositories/repositories"); +const { Result } = require("./lib/result"); const g_db = require("@arangodb").db; const g_lib = require("./support"); const g_tasks = require("./tasks"); module.exports = router; +function validateAndNormalizeRepoPath(obj) { + if (!obj.path || typeof obj.path !== "string") { + throw [error.ERR_INVALID_PARAM, "Repository path must be a valid string."]; + } + + // Must start with a slash + if (!obj.path.startsWith("/")) { + throw [error.ERR_INVALID_PARAM, "Repository path must be an absolute file system path."]; + } + + // Ensure trailing slash + if (!obj.path.endsWith("/")) { + obj.path += "/"; + } + + // Extract last folder name before trailing slash + const idx = obj.path.lastIndexOf("/", obj.path.length - 2); + const lastPart = obj.path.substring(idx + 1, obj.path.length - 1); + + // Ensure last part matches repository key + if (lastPart !== obj.key) { + throw [ + error.ERR_INVALID_PARAM, + `Last part of repository path must match repository ID suffix (${obj.key})`, + ]; + } + + return obj.path; // return the normalized path if needed +} + router .get("/list", function (req, res) { var client; @@ -17,7 +51,7 @@ router client = g_lib.getUserFromClientID(req.queryParams.client); if (req.queryParams.all && !client.is_admin) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } @@ -106,65 +140,49 @@ router }, action: function () { var client = g_lib.getUserFromClientID(req.queryParams.client); - if (!client.is_admin) throw g_lib.ERR_PERM_DENIED; + if (!client.is_admin) throw error.ERR_PERM_DENIED; var obj = { + key: req.body.id, capacity: req.body.capacity, pub_key: req.body.pub_key, address: req.body.address, endpoint: req.body.endpoint, path: req.body.path, + type: req.body?.type, }; - - g_lib.procInputParam(req.body, "id", false, obj); g_lib.procInputParam(req.body, "title", false, obj); g_lib.procInputParam(req.body, "summary", false, obj); - g_lib.procInputParam(req.body, "domain", false, obj); - if (!obj.path.startsWith("/")) - throw [ - g_lib.ERR_INVALID_PARAM, - "Repository path must be an absolute path file system path.", - ]; - - if (!obj.path.endsWith("/")) obj.path += "/"; + if (req.body?.type == undefined || req.body?.type == RepositoryType.GLOBUS) { + obj["type"] = RepositoryType.GLOBUS; + g_lib.procInputParam(req.body, "domain", false, obj); + validateAndNormalizeRepoPath(obj); - var idx = obj.path.lastIndexOf("/", obj.path.length - 2); - if (obj.path.substr(idx + 1, obj.path.length - idx - 2) != obj._key) - throw [ - g_lib.ERR_INVALID_PARAM, - "Last part of repository path must be repository ID suffix (" + - obj._key + - ")", - ]; - - if (req.body.exp_path) { - obj.exp_path = req.body.exp_path; - if (!obj.exp_path.endsWith("/")) obj.path += "/"; + if (req.body.exp_path) { + obj.exp_path = req.body.exp_path; + if (!obj.exp_path.endsWith("/")) obj.path += "/"; + } } - var repo = g_db.repo.save(obj, { - returnNew: true, - }); + const repo = Repositories.createRepositoryByType(obj).raiseIfError(); + const repo_doc = repo.save().raiseIfError(); - for (var i in req.body.admins) { - if (!g_db._exists(req.body.admins[i])) - throw [ - g_lib.ERR_NOT_FOUND, - "User, " + req.body.admins[i] + ", not found", - ]; + for (const adminId of req.body.admins) { + if (!g_db._exists(adminId)) + throw [error.ERR_NOT_FOUND, "User, " + adminId + ", not found"]; g_db.admin.save({ - _from: repo._id, - _to: req.body.admins[i], + _from: repo.id(), + _to: adminId, }); } - repo.new.id = repo.new._id; - delete repo.new._id; - delete repo.new._key; - delete repo.new._rev; - res.send([repo.new]); + repo_doc.id = repo_doc._id; + delete repo_doc._id; + delete repo_doc._key; + delete repo_doc._rev; + res.send([repo_doc]); }, }); } catch (e) { @@ -180,12 +198,13 @@ router desc: joi.string().optional(), domain: joi.string().optional(), capacity: joi.number().integer().min(0).required(), - pub_key: joi.string().required(), - address: joi.string().required(), - endpoint: joi.string().required(), - path: joi.string().required(), + pub_key: joi.string().optional(), + address: joi.string().optional(), + endpoint: joi.string().optional(), + path: joi.string().optional(), exp_path: joi.string().optional(), admins: joi.array().items(joi.string()).required(), + type: joi.string().valid(RepositoryType.GLOBUS, RepositoryType.METADATA).optional(), }) .required(), "Repo fields", @@ -204,7 +223,7 @@ router }, action: function () { var client = g_lib.getUserFromClientID(req.queryParams.client); - g_lib.ensureAdminPermRepo(client, req.body.id); + permissions.ensureAdminPermRepo(client, req.body.id); var obj = {}; g_lib.procInputParam(req.body, "title", true, obj); @@ -214,7 +233,7 @@ router if (req.body.path) { if (!req.body.path.startsWith("/")) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Repository path must be an absolute path file system path.", ]; @@ -226,7 +245,7 @@ router var key = req.body.id.substr(5); if (obj.path.substr(idx + 1, obj.path.length - idx - 2) != key) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Last part of repository path must be repository ID suffix (" + key + ")", @@ -257,7 +276,7 @@ router for (var i in req.body.admins) { if (!g_db._exists(req.body.admins[i])) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "User, " + req.body.admins[i] + ", not found", ]; g_db.admin.save({ @@ -324,7 +343,7 @@ router .toArray(); if (items_connected_to_repo.length > 0) { throw [ - g_lib.ERR_IN_USE, + error.ERR_IN_USE, "Cannot delete repo. The repository is in use: " + items_connected_to_repo.join(", "), ]; @@ -333,9 +352,9 @@ router var client = g_lib.getUserFromClientID(req.queryParams.client); if (!g_db._exists(req.queryParams.id)) - throw [g_lib.ERR_NOT_FOUND, "Repo, " + req.queryParams.id + ", not found"]; + throw [error.ERR_NOT_FOUND, "Repo, " + req.queryParams.id + ", not found"]; - g_lib.ensureAdminPermRepo(client, req.queryParams.id); + permissions.ensureAdminPermRepo(client, req.queryParams.id); const graph = require("@arangodb/general-graph")._graph("sdmsg"); // Make sure there are no allocations present on repo @@ -345,7 +364,7 @@ router console.log(alloc); if (alloc.hasNext()) throw [ - g_lib.ERR_IN_USE, + error.ERR_IN_USE, "Cannot delete repo with associated allocations. Allocations still exist on the repository.", ]; // Remove the repo vertex from the graph and all edges, this includes all @@ -438,7 +457,7 @@ function calcSize(a_item, a_recurse, a_depth, a_visited, a_result) { calcSize(items.next(), a_recurse, a_depth + 1, a_visited, a_result); } } - } else throw [g_lib.ERR_INVALID_PARAM, "Invalid item type for size calculation: " + a_item]; + } else throw [error.ERR_INVALID_PARAM, "Invalid item type for size calculation: " + a_item]; } router @@ -446,7 +465,7 @@ router var client = g_lib.getUserFromClientID(req.queryParams.client); var repo = g_db.repo.document(req.queryParams.repo); - g_lib.ensureAdminPermRepo(client, repo._id); + permissions.ensureAdminPermRepo(client, repo._id); var result = g_db ._query( @@ -546,7 +565,7 @@ router owner_id != client._id && g_lib.getProjectRole(client._id, owner_id) == g_lib.PROJ_NO_ROLE ) { - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; } } else { owner_id = client._id; @@ -593,7 +612,7 @@ function getAllocStats(a_repo, a_subject) { }); if (!alloc) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Subject " + a_subject + " has no allocation on repo " + a_repo, ]; @@ -642,7 +661,7 @@ router .get("/alloc/stats", function (req, res) { try { var client = g_lib.getUserFromClientID(req.queryParams.client); - g_lib.ensureAdminPermRepo(client, req.queryParams.repo); + permissions.ensureAdminPermRepo(client, req.queryParams.repo); var result = getAllocStats(req.queryParams.repo, req.queryParams.subject); res.send(result); } catch (e) { @@ -760,16 +779,16 @@ router if (!g_db._exists(req.queryParams.repo)) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Repo, '" + req.queryParams.repo + "', does not exist", ]; if (!g_db._exists(subject_id)) - throw [g_lib.ERR_NOT_FOUND, "Subject, " + subject_id + ", not found"]; + throw [error.ERR_NOT_FOUND, "Subject, " + subject_id + ", not found"]; var repo = g_db.repo.document(req.queryParams.repo); - g_lib.ensureAdminPermRepo(client, repo._id); + permissions.ensureAdminPermRepo(client, repo._id); var alloc = g_db.alloc.firstExample({ _from: subject_id, @@ -777,7 +796,7 @@ router }); if (!alloc) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Subject, '" + subject_id + "', has no allocation on " + repo._id, ]; @@ -823,14 +842,14 @@ router if (req.queryParams.subject.startsWith("p/")) { if (!g_db._exists(subject_id)) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Project, " + req.queryParams.subject + ", not found", ]; var role = g_lib.getProjectRole(client._id, req.queryParams.subject); if (role != g_lib.PROJ_MANAGER && role != g_lib.PROJ_ADMIN) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Setting default allocation on project requires admin/manager rights.", ]; @@ -840,7 +859,7 @@ router if (subject_id != client._id && !client.is_admin) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Setting default allocation on user requires admin rights.", ]; } @@ -848,7 +867,7 @@ router if (!g_db._exists(req.queryParams.repo)) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Repo, '" + req.queryParams.repo + "', does not exist", ]; diff --git a/core/database/foxx/api/schema_router.js b/core/database/foxx/api/schema_router.js index 62d058fc7..51734b678 100644 --- a/core/database/foxx/api/schema_router.js +++ b/core/database/foxx/api/schema_router.js @@ -4,6 +4,7 @@ const createRouter = require("@arangodb/foxx/router"); const router = createRouter(); const joi = require("joi"); +const error = require("./lib/error_codes"); const g_db = require("@arangodb").db; const g_lib = require("./support"); const g_graph = require("@arangodb/general-graph")._graph("sdmsg"); @@ -101,11 +102,11 @@ router if (req.body.sys) { if (!client.is_admin) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Creating a system schema requires admin privileges.", ]; if (!req.body.pub) - throw [g_lib.ERR_INVALID_PARAM, "System schemas cannot be private."]; + throw [error.ERR_INVALID_PARAM, "System schemas cannot be private."]; } else { obj.own_id = client._id; obj.own_nm = client.name; @@ -161,7 +162,7 @@ router const client = g_lib.getUserFromClientID(req.queryParams.client); var idx = req.queryParams.id.indexOf(":"); if (idx < 0) { - throw [g_lib.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; + throw [error.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; } var sch_id = req.queryParams.id.substr(0, idx), sch_ver = parseInt(req.queryParams.id.substr(idx + 1)), @@ -172,7 +173,7 @@ router if (!sch_old) { throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Schema '" + req.queryParams.id + "' not found.", ]; } @@ -180,7 +181,7 @@ router // Cannot modify schemas that are in use if (sch_old.cnt) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Schema is associated with data records - cannot update.", ]; } @@ -192,13 +193,13 @@ router }) ) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Schema is referenced by another schema - cannot update.", ]; } if (sch_old.own_id != client._id && !client.is_admin) - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; var obj = {}; @@ -209,12 +210,12 @@ router if (req.body.sys) { if (!client.is_admin) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Changing to a system schema requires admin privileges.", ]; if (!sch_old.pub && !req.body.pub) - throw [g_lib.ERR_INVALID_PARAM, "System schemas cannot be private."]; + throw [error.ERR_INVALID_PARAM, "System schemas cannot be private."]; obj.own_id = null; obj.own_nm = null; @@ -230,7 +231,7 @@ router })) ) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Cannot change schema ID once revisions exist.", ]; } @@ -292,7 +293,7 @@ router const client = g_lib.getUserFromClientID(req.queryParams.client); var idx = req.queryParams.id.indexOf(":"); if (idx < 0) { - throw [g_lib.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; + throw [error.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; } var sch_id = req.queryParams.id.substr(0, idx), sch_ver = parseInt(req.queryParams.id.substr(idx + 1)), @@ -303,11 +304,11 @@ router if (!sch) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Schema '" + req.queryParams.id + "' not found.", ]; - if (sch.own_id != client._id && !client.is_admin) throw g_lib.ERR_PERM_DENIED; + if (sch.own_id != client._id && !client.is_admin) throw error.ERR_PERM_DENIED; if ( g_db.sch_ver.firstExample({ @@ -315,13 +316,13 @@ router }) ) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "A revision of schema '" + req.queryParams.id + "' already exists.", ]; if (!sch.own_id && !client.is_admin) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Revising a system schema requires admin privileges.", ]; @@ -340,7 +341,7 @@ router if (req.body.sys) { if (!client.is_admin) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Creating a system schema requires admin privileges.", ]; @@ -349,7 +350,7 @@ router } if (!sch.pub && !sch.own_id) - throw [g_lib.ERR_INVALID_PARAM, "System schemas cannot be private."]; + throw [error.ERR_INVALID_PARAM, "System schemas cannot be private."]; g_lib.procInputParam(req.body, "desc", true, sch); @@ -409,7 +410,7 @@ router const client = g_lib.getUserFromClientID(req.queryParams.client); var idx = req.queryParams.id.indexOf(":"); if (idx < 0) { - throw [g_lib.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; + throw [error.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; } var sch_id = req.queryParams.id.substr(0, idx), sch_ver = parseInt(req.queryParams.id.substr(idx + 1)), @@ -419,14 +420,14 @@ router }); if (!sch_old) - throw [g_lib.ERR_NOT_FOUND, "Schema '" + req.queryParams.id + "' not found."]; + throw [error.ERR_NOT_FOUND, "Schema '" + req.queryParams.id + "' not found."]; - if (sch_old.own_id != client._id && !client.is_admin) throw g_lib.ERR_PERM_DENIED; + if (sch_old.own_id != client._id && !client.is_admin) throw error.ERR_PERM_DENIED; // Cannot delete schemas that are in use if (sch_old.cnt) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Schema is associated with data records - cannot update.", ]; } @@ -438,7 +439,7 @@ router }) ) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Schema is referenced by another schema - cannot update.", ]; } @@ -452,7 +453,7 @@ router _to: sch_old._id, }) ) { - throw [g_lib.ERR_PERM_DENIED, "Cannot delete intermediate schema revisions."]; + throw [error.ERR_PERM_DENIED, "Cannot delete intermediate schema revisions."]; } g_graph.sch.remove(sch_old._id); @@ -471,7 +472,7 @@ router const client = g_lib.getUserFromClientID(req.queryParams.client); var idx = req.queryParams.id.indexOf(":"); if (idx < 0) { - throw [g_lib.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; + throw [error.ERR_INVALID_PARAM, "Schema ID missing version number suffix."]; } var sch_id = req.queryParams.id.substr(0, idx), sch_ver = parseInt(req.queryParams.id.substr(idx + 1)), @@ -480,10 +481,10 @@ router ver: sch_ver, }); - if (!sch) throw [g_lib.ERR_NOT_FOUND, "Schema '" + req.queryParams.id + "' not found."]; + if (!sch) throw [error.ERR_NOT_FOUND, "Schema '" + req.queryParams.id + "' not found."]; if (!(sch.pub || sch.own_id == client._id || client.is_admin)) - throw g_lib.ERR_PERM_DENIED; + throw error.ERR_PERM_DENIED; if (req.queryParams.resolve) { var refs = {}; @@ -660,7 +661,7 @@ function validateKey(val) { } if (i == len) { - throw [g_lib.ERR_INVALID_CHAR, "Malformed property '" + val + "'."]; + throw [error.ERR_INVALID_CHAR, "Malformed property '" + val + "'."]; } code = val.charCodeAt(i); @@ -673,7 +674,7 @@ function validateKey(val) { // upper alpha (A-Z) i++; } else { - throw [g_lib.ERR_INVALID_CHAR, "Malformed property '" + val + "'."]; + throw [error.ERR_INVALID_CHAR, "Malformed property '" + val + "'."]; } // Check remaining chars @@ -687,7 +688,7 @@ function validateKey(val) { code != 95 ) { // _ - throw [g_lib.ERR_INVALID_CHAR, "Illegal character(s) in property '" + val + "'."]; + throw [error.ERR_INVALID_CHAR, "Illegal character(s) in property '" + val + "'."]; } } } @@ -734,7 +735,7 @@ function updateSchemaRefs(a_sch) { if (idx < 0) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid reference ID '" + v + "' in schema (expected id:ver).", ]; @@ -748,9 +749,9 @@ function updateSchemaRefs(a_sch) { ver: ver, }); - if (!r) throw [g_lib.ERR_INVALID_PARAM, "Referenced schema '" + v + "' does not exist."]; + if (!r) throw [error.ERR_INVALID_PARAM, "Referenced schema '" + v + "' does not exist."]; - if (r._id == a_sch._id) throw [g_lib.ERR_INVALID_PARAM, "Schema references self."]; + if (r._id == a_sch._id) throw [error.ERR_INVALID_PARAM, "Schema references self."]; g_graph.sch_dep.save({ _from: a_sch._id, @@ -769,7 +770,7 @@ function gatherRefs(a_doc, a_refs) { gatherRefs(v, a_refs); } else if (k == "$ref") { if (typeof v !== "string") - throw [g_lib.ERR_INVALID_PARAM, "Invalid reference type in schema."]; + throw [error.ERR_INVALID_PARAM, "Invalid reference type in schema."]; // Add dependencies to external schemas, only once i = v.indexOf("#"); diff --git a/core/database/foxx/api/support.js b/core/database/foxx/api/support.js index 6133ed7c7..8f7ec612e 100644 --- a/core/database/foxx/api/support.js +++ b/core/database/foxx/api/support.js @@ -1,6 +1,8 @@ "use strict"; const joi = require("joi"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); module.exports = (function () { var obj = {}; @@ -8,30 +10,6 @@ module.exports = (function () { obj.db = require("@arangodb").db; obj.graph = require("@arangodb/general-graph")._graph("sdmsg"); - obj.PERM_RD_REC = 0x0001; // Read record info (description, keywords, details) - obj.PERM_RD_META = 0x0002; // Read structured metadata - obj.PERM_RD_DATA = 0x0004; // Read raw data - obj.PERM_WR_REC = 0x0008; // Write record info (description, keywords, details) - obj.PERM_WR_META = 0x0010; // Write structured metadata - obj.PERM_WR_DATA = 0x0020; // Write raw data - obj.PERM_LIST = 0x0040; // Find record and view ID, alias, title, and owner - obj.PERM_LINK = 0x0080; // Link/unlink child records (collections only) - obj.PERM_CREATE = 0x0100; // Create new child records (collections only) - obj.PERM_DELETE = 0x0200; // Delete record - obj.PERM_SHARE = 0x0400; // View/set ACLs - obj.PERM_LOCK = 0x0800; // Lock record - obj.PERM_LABEL = 0x1000; // Label record - obj.PERM_TAG = 0x2000; // Tag record - obj.PERM_ANNOTATE = 0x4000; // Annotate record - - obj.PERM_NONE = 0x0000; - obj.PERM_RD_ALL = 0x0007; // Read all - obj.PERM_WR_ALL = 0x0038; // Write all - obj.PERM_ALL = 0x7fff; - obj.PERM_MEMBER = 0x0047; // Project record perms - obj.PERM_MANAGER = 0x0407; // Project record perms - obj.PERM_PUBLIC = 0x0047; - obj.MAX_COLL_ITEMS = 10000; obj.MAX_QRY_ITEMS = 10000; obj.MAX_PAGE_SIZE = 1000; @@ -131,40 +109,6 @@ module.exports = (function () { inhgrant: joi.number().optional(), }); - obj.ERR_INFO = []; - obj.ERR_COUNT = 0; - - obj.ERR_AUTHN_FAILED = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Authentication Failed"]); - obj.ERR_PERM_DENIED = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Permission Denied"]); - obj.ERR_INVALID_PARAM = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Invalid Parameter"]); - obj.ERR_INPUT_TOO_LONG = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Input value too long"]); - obj.ERR_INVALID_CHAR = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Invalid character"]); - obj.ERR_NOT_FOUND = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Record Not Found"]); - obj.ERR_IN_USE = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Value In Use"]); - obj.ERR_LINK = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Collection Link Error"]); - obj.ERR_UNLINK = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Collection Unlink Error"]); - obj.ERR_MISSING_REQ_PARAM = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Missing one or more required parameters"]); - obj.ERR_NO_RAW_DATA = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Record has no raw data"]); - obj.ERR_XFR_CONFLICT = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Data transfer conflict"]); - obj.ERR_INTERNAL_FAULT = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Internal server fault"]); - obj.ERR_NO_ALLOCATION = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "No allocation available"]); - obj.ERR_ALLOCATION_EXCEEDED = obj.ERR_COUNT++; - obj.ERR_INFO.push([400, "Storage allocation exceeded"]); - obj.CHARSET_ID = 0; obj.CHARSET_ALIAS = 1; obj.CHARSET_TOPIC = 2; @@ -320,7 +264,7 @@ module.exports = (function () { if (!spec) { throw [ - obj.ERR_INTERNAL_FAULT, + error.ERR_INTERNAL_FAULT, "Input specification for '" + a_field + "' not found. Please contact system administrator.", @@ -345,7 +289,7 @@ module.exports = (function () { // Check length if specified if (spec.max_len && val.length > spec.max_len) throw [ - obj.ERR_INPUT_TOO_LONG, + error.ERR_INPUT_TOO_LONG, "'" + spec.label + "' field is too long. Maximum length is " + @@ -369,8 +313,13 @@ module.exports = (function () { // lower alpha (a-z) if (extra.indexOf(val.charAt(i)) == -1) throw [ - obj.ERR_INVALID_CHAR, - "Invalid character(s) in '" + spec.label + "' field.", + error.ERR_INVALID_CHAR, + "Invalid character(s) in '" + + spec.label + + "' field '" + + val + + "' detected char '" + + val.charAt(i), ]; } } @@ -385,7 +334,7 @@ module.exports = (function () { if (val === "") { if (spec.required) throw [ - obj.ERR_MISSING_REQ_PARAM, + error.ERR_MISSING_REQ_PARAM, "Required field '" + spec.label + "' cannot be deleted.", ]; @@ -393,7 +342,7 @@ module.exports = (function () { else a_out[a_field] = null; } } else if (spec.required) - throw [obj.ERR_MISSING_REQ_PARAM, "Missing required field '" + spec.label + "'."]; + throw [error.ERR_MISSING_REQ_PARAM, "Missing required field '" + spec.label + "'."]; } }; @@ -404,7 +353,7 @@ module.exports = (function () { obj.validatePassword = function (pw) { if (pw.length < obj.PASSWORD_MIN_LEN) { throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "ERROR: password must be at least " + obj.PASSWORD_MIN_LEN + " characters in length.", @@ -428,7 +377,7 @@ module.exports = (function () { if (j != 3) { throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "ERROR: password must contain at least one number (0-9) and one special character (" + obj.pw_chars + ").", @@ -454,10 +403,10 @@ module.exports = (function () { obj.handleException = function (e, res) { console.log("Service exception:", e); - if (obj.isInteger(e) && e >= 0 && e < obj.ERR_COUNT) { - res.throw(obj.ERR_INFO[e][0], obj.ERR_INFO[e][1]); + if (obj.isInteger(e) && e >= 0 && e < error.ERR_COUNT) { + res.throw(error.ERR_INFO[e][0], error.ERR_INFO[e][1]); } else if (Array.isArray(e)) { - res.throw(obj.ERR_INFO[e[0]][0], e[1]); + res.throw(error.ERR_INFO[e[0]][0], e[1]); //} else if ( e.hasOwnProperty( "errorNum" )) { } else if (Object.prototype.hasOwnProperty.call(e, "errorNum")) { switch (e.errorNum) { @@ -588,7 +537,7 @@ module.exports = (function () { .toArray(); if (result.length !== 1) { - throw [obj.ERR_NOT_FOUND, "No user matching Globus IDs found"]; + throw [error.ERR_NOT_FOUND, "No user matching Globus IDs found"]; } var first_uuid = result[0]._id; @@ -596,7 +545,7 @@ module.exports = (function () { for (var i = 1; i < result.length; i++) { if (first_uuid != result[i]._id) { throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "uuid_list does not resolve to a single user, unable to unambiguously resolve user, it is possible that you have multiple accounts when you should have only a single one problematic ids are: " + first_uuid + " and " + @@ -623,7 +572,7 @@ module.exports = (function () { }) .toArray(); if (result.length != 1) { - throw [obj.ERR_NOT_FOUND, "No user matching Globus IDs found"]; + throw [error.ERR_NOT_FOUND, "No user matching Globus IDs found"]; } var first_uuid = result[0]._id; @@ -679,7 +628,7 @@ module.exports = (function () { if (a_client_id.startsWith("u/")) { if (!obj.db.u.exists(a_client_id)) { - throw [obj.ERR_INVALID_PARAM, "No such user '" + a_client_id + "'"]; + throw [error.ERR_INVALID_PARAM, "No such user '" + a_client_id + "'"]; } return obj.db._document({ @@ -709,7 +658,7 @@ module.exports = (function () { }); } else { if (!obj.db.u.exists("u/" + a_client_id)) { - throw [obj.ERR_INVALID_PARAM, "No such user 'u/" + a_client_id + "'"]; + throw [error.ERR_INVALID_PARAM, "No such user 'u/" + a_client_id + "'"]; } return obj.db._document({ _id: "u/" + a_client_id, @@ -724,7 +673,7 @@ module.exports = (function () { if (result.length != 1) { //console.log("Client", a_client_id, "not found, params:", params ); - throw [obj.ERR_NOT_FOUND, "Account/Identity '" + a_client_id + "' not found"]; + throw [error.ERR_NOT_FOUND, "Account/Identity '" + a_client_id + "' not found"]; } return result[0]; @@ -795,10 +744,10 @@ module.exports = (function () { .toArray(); if (result.length === 0) { - throw [obj.ERR_NOT_FOUND, "No user matching Globus IDs found"]; + throw [error.ERR_NOT_FOUND, "No user matching Globus IDs found"]; } else if (result.length > 1) { throw [ - obj.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Multiple DataFed accounts associated with the provided Globus identities" + result.toString(), ]; @@ -815,7 +764,7 @@ module.exports = (function () { }) .toArray(); if (result.length !== 1) - throw [obj.ERR_NOT_FOUND, "No user matching authentication key found"]; + throw [error.ERR_NOT_FOUND, "No user matching authentication key found"]; return result[0]; }; @@ -832,7 +781,7 @@ module.exports = (function () { //console.log( "key res:", result ); if (result.length != 1) - throw [obj.ERR_NOT_FOUND, "No user matching authentication key found"]; + throw [error.ERR_NOT_FOUND, "No user matching authentication key found"]; return result[0]; }; @@ -922,17 +871,17 @@ module.exports = (function () { _from: a_user_id, _to: a_repo_id, }); - if (!alloc) throw [obj.ERR_NO_ALLOCATION, "No allocation on repo " + a_repo_id]; + if (!alloc) throw [error.ERR_NO_ALLOCATION, "No allocation on repo " + a_repo_id]; if (alloc.data_size >= alloc.data_limit) throw [ - obj.ERR_ALLOCATION_EXCEEDED, + error.ERR_ALLOCATION_EXCEEDED, "Allocation data size exceeded (max: " + alloc.data_limit + ")", ]; if (alloc.rec_count >= alloc.rec_limit) throw [ - obj.ERR_ALLOCATION_EXCEEDED, + error.ERR_ALLOCATION_EXCEEDED, "Allocation record count exceeded (max: " + alloc.rec_limit + ")", ]; @@ -968,7 +917,7 @@ module.exports = (function () { var id = obj.resolveID(a_obj_id, a_client); if (!obj.db._exists(id)) - throw [obj.ERR_INVALID_PARAM, "Record '" + id + "' does not exist."]; + throw [error.ERR_INVALID_PARAM, "Record '" + id + "' does not exist."]; var doc = obj.db._document(id); @@ -983,178 +932,6 @@ module.exports = (function () { .count(); }; - obj.hasAdminPermUser = function (a_client, a_user_id) { - //if ( a_client._id != a_user_id && !a_client.is_admin && !obj.db.owner.firstExample({ _from: a_user_id, _to: a_client._id }) && !obj.db.admin.firstExample({ _from: a_user_id, _to: a_client._id })){ - if (a_client._id != a_user_id && !a_client.is_admin) { - return false; - } else { - return true; - } - }; - - obj.hasAdminPermProj = function (a_client, a_proj_id) { - if ( - !a_client.is_admin && - !obj.db.owner.firstExample({ - _from: a_proj_id, - _to: a_client._id, - }) - ) { - return false; - } else { - return true; - } - }; - - obj.hasManagerPermProj = function (a_client, a_proj_id) { - if ( - !a_client.is_admin && - !obj.db.owner.firstExample({ - _from: a_proj_id, - _to: a_client._id, - }) && - !obj.db.admin.firstExample({ - _from: a_proj_id, - _to: a_client._id, - }) - ) { - return false; - } else { - return true; - } - }; - - obj.hasAdminPermObjectLoaded = function (a_client, a_object) { - // TODO Should collection creator have admin rights? - if (a_object.owner == a_client._id || a_object.creator == a_client._id || a_client.is_admin) - return true; - - if (a_object.owner.charAt(0) == "p") { - if ( - obj.db.owner.firstExample({ - _from: a_object.owner, - _to: a_client._id, - }) - ) - return true; - - if ( - obj.db.admin.firstExample({ - _from: a_object.owner, - _to: a_client._id, - }) - ) - return true; - } - - return false; - }; - - /** - * checks to make sure the client has admin permissions on an object - * - * @param {object} a_client - this is a user document i.e. - * - * - * "_key" : "bob", - * "_id" : "u/bob", - * "name" : "bob junior ", - * "name_first" : "bob", - * "name_last" : "jones", - * "is_admin" : true, - * "max_coll" : 50, - * "max_proj" : 10, - * "max_sav_qry" : 20, - * : - * "email" : "bobjones@gmail.com" - * - * @param {string} a_object_id - the identity of a record or collection or project - * - * "d/fdakjfla" - * "p/big_thing" - * "c/my_collection" - * - * @returns {boolean} - if client has admin rights on the object. - **/ - obj.hasAdminPermObject = function (a_client, a_object_id) { - if (a_client.is_admin) return true; - - var first_owner = obj.db.owner.firstExample({ - _from: a_object_id, - }); - if (first_owner !== null) { - var owner_id = first_owner._to; // obj.db.owner.firstExample({ _from: a_object_id })._to; - } else { - throw [obj.ERR_NOT_FOUND, "Data record for owner not found " + a_object_id + "."]; - } - if (owner_id == a_client._id) return true; - - if (owner_id[0] == "p") { - // Object owned by a project - if ( - obj.db.admin.firstExample({ - _from: owner_id, - _to: a_client._id, - }) - ) - return true; - - if ( - obj.db.owner.firstExample({ - _from: owner_id, - _to: a_client._id, - }) - ) - return true; - } - - if (a_object_id[0] == "d") { - var data = obj.db._query("for i in d filter i._id == @id return i.creator", { - id: a_object_id, - }); - if (!data.hasNext()) { - throw [obj.ERR_NOT_FOUND, "Data record " + a_object_id + " not found."]; - } - data = data.next(); - if (a_client._id == data) return true; - } - return false; - }; - - obj.hasAdminPermRepo = function (a_client, a_repo_id) { - if ( - !a_client.is_admin && - !obj.db.admin.firstExample({ - _from: a_repo_id, - _to: a_client._id, - }) - ) { - return false; - } else { - return true; - } - }; - - obj.ensureAdminPermUser = function (a_client, a_user_id) { - if (!obj.hasAdminPermUser(a_client, a_user_id)) throw obj.ERR_PERM_DENIED; - }; - - obj.ensureAdminPermProj = function (a_client, a_user_id) { - if (!obj.hasAdminPermProj(a_client, a_user_id)) throw obj.ERR_PERM_DENIED; - }; - - obj.ensureManagerPermProj = function (a_client, a_user_id) { - if (!obj.hasManagerPermProj(a_client, a_user_id)) throw obj.ERR_PERM_DENIED; - }; - - obj.ensureAdminPermObject = function (a_client, a_object_id) { - if (!obj.hasAdminPermObject(a_client, a_object_id)) throw obj.ERR_PERM_DENIED; - }; - - obj.ensureAdminPermRepo = function (a_client, a_repo_id) { - if (!obj.hasAdminPermRepo(a_client, a_repo_id)) throw obj.ERR_PERM_DENIED; - }; - obj.isSrcParentOfDest = function (a_src_id, a_dest_id) { var parent; var child_id = a_dest_id; @@ -1175,7 +952,7 @@ module.exports = (function () { if (i != -1) { if (!a_id.startsWith("d/") && !a_id.startsWith("c/") && !a_id.startsWith("p/")) - throw [obj.ERR_INVALID_PARAM, "Invalid ID '" + a_id + "'"]; + throw [error.ERR_INVALID_PARAM, "Invalid ID '" + a_id + "'"]; id = a_id; } else { var alias_id = "a/"; @@ -1185,13 +962,13 @@ module.exports = (function () { var alias = obj.db.alias.firstExample({ _to: alias_id, }); - if (!alias) throw [obj.ERR_NOT_FOUND, "Alias '" + a_id + "' does not exist"]; + if (!alias) throw [error.ERR_NOT_FOUND, "Alias '" + a_id + "' does not exist"]; id = alias._from; } if (!obj.db._exists(id)) { - throw [obj.ERR_INVALID_PARAM, "Record '" + id + "' does not exist."]; + throw [error.ERR_INVALID_PARAM, "Record '" + id + "' does not exist."]; } return id; @@ -1204,7 +981,7 @@ module.exports = (function () { if (i != -1) { if (!a_id.startsWith("d/")) - throw [obj.ERR_INVALID_PARAM, "Invalid data record ID '" + a_id + "'"]; + throw [error.ERR_INVALID_PARAM, "Invalid data record ID '" + a_id + "'"]; id = a_id; } else { var alias_id = "a/"; @@ -1214,19 +991,19 @@ module.exports = (function () { alias = obj.db.alias.firstExample({ _to: alias_id, }); - if (!alias) throw [obj.ERR_NOT_FOUND, "Alias '" + a_id + "' does not exist"]; + if (!alias) throw [error.ERR_NOT_FOUND, "Alias '" + a_id + "' does not exist"]; id = alias._from; if (!id.startsWith("d/")) throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Alias '" + a_id + "' does not identify a data record", ]; } if (!obj.db.d.exists(id)) { - throw [obj.ERR_INVALID_PARAM, "Data record '" + id + "' does not exist."]; + throw [error.ERR_INVALID_PARAM, "Data record '" + id + "' does not exist."]; } return id; @@ -1238,7 +1015,7 @@ module.exports = (function () { if (i != -1) { if (!a_id.startsWith("c/")) - throw [obj.ERR_INVALID_PARAM, "Invalid collection ID '" + a_id + "'"]; + throw [error.ERR_INVALID_PARAM, "Invalid collection ID '" + a_id + "'"]; id = a_id; } else { var alias_id = "a/"; @@ -1248,19 +1025,19 @@ module.exports = (function () { var alias = obj.db.alias.firstExample({ _to: alias_id, }); - if (!alias) throw [obj.ERR_NOT_FOUND, "Alias '" + a_id + "' does not exist"]; + if (!alias) throw [error.ERR_NOT_FOUND, "Alias '" + a_id + "' does not exist"]; id = alias._from; if (!id.startsWith("c/")) throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Alias '" + a_id + "' does not identify a collection", ]; } if (!obj.db.c.exists(id)) { - throw [obj.ERR_INVALID_PARAM, "Collection '" + id + "' does not exist."]; + throw [error.ERR_INVALID_PARAM, "Collection '" + id + "' does not exist."]; } return id; @@ -1272,7 +1049,7 @@ module.exports = (function () { if (i != -1) { if (!a_id.startsWith("c/")) - throw [obj.ERR_INVALID_PARAM, "Invalid collection ID '" + a_id + "'"]; + throw [error.ERR_INVALID_PARAM, "Invalid collection ID '" + a_id + "'"]; id = a_id; } else { var alias_id = "a/"; @@ -1283,19 +1060,19 @@ module.exports = (function () { var alias = obj.db.alias.firstExample({ _to: alias_id, }); - if (!alias) throw [obj.ERR_NOT_FOUND, "Alias '" + alias_id + "' does not exist"]; + if (!alias) throw [error.ERR_NOT_FOUND, "Alias '" + alias_id + "' does not exist"]; id = alias._from; if (!id.startsWith("c/")) throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Alias '" + alias_id + "' does not identify a collection", ]; } if (!obj.db.c.exists(id)) { - throw [obj.ERR_INVALID_PARAM, "Collection '" + id + "' does not exist."]; + throw [error.ERR_INVALID_PARAM, "Collection '" + id + "' does not exist."]; } return id; @@ -1307,7 +1084,7 @@ module.exports = (function () { if (i != -1) { if (!a_id.startsWith("d/") && !a_id.startsWith("c/")) - throw [obj.ERR_INVALID_PARAM, "Invalid ID '" + a_id + "'"]; + throw [error.ERR_INVALID_PARAM, "Invalid ID '" + a_id + "'"]; id = a_id; } else { var alias_id = "a/"; @@ -1317,14 +1094,14 @@ module.exports = (function () { var alias = obj.db.alias.firstExample({ _to: alias_id, }); - if (!alias) throw [obj.ERR_NOT_FOUND, "Alias '" + a_id + "' does not exist"]; + if (!alias) throw [error.ERR_NOT_FOUND, "Alias '" + a_id + "' does not exist"]; id = alias._from; } if (!obj.db._exists(id)) { throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, (id.charAt(0) == "d" ? "Data record '" : "Collection '") + id + "' does not exist.", ]; } @@ -1579,7 +1356,7 @@ module.exports = (function () { // Detect misplaced topic delimiters for (i in topics) { - if (topics[i].length === 0) throw [obj.ERR_INVALID_PARAM, "Invalid category"]; + if (topics[i].length === 0) throw [error.ERR_INVALID_PARAM, "Invalid category"]; } var topic, parent; //,tag; @@ -1926,470 +1703,6 @@ module.exports = (function () { } }; - /* Test if client has requested permission(s) for specified object. Note: this call does NOT check for - * ownership or admin privilege - the hasAdminPermObject function performs these checks and should be - * called first if needed. This function is typically used when filtering a list of objects that are - * known not to be owned by the client (and that the client is not an admin). In this case, those checks - * would add performance cost for no benefit. - */ - obj.hasPermissions = function ( - a_client, - a_object, - a_req_perm, - a_inherited = false, - any = false, - ) { - //console.log("check perm:", a_req_perm, "client:", a_client._id, "object:", a_object._id, "any:", any ); - //console.log("grant:", a_object.grant ); - - var perm_found = 0, - acl, - acls, - result, - i; - - // If object is marked "public", everyone is granted VIEW, and READ permissions - // The current implementation allows users to be denied access to public data (maybe wrong?) - - if (a_object.topic) { - perm_found = obj.PERM_PUBLIC; - - result = obj.evalPermissions(a_req_perm, perm_found, any); - if (result != null) return result; - } - - // Evaluate user permissions set directly on object - if (a_object.acls & 1) { - acls = obj.db - ._query("for v, e in 1..1 outbound @object acl filter v._id == @client return e", { - object: a_object._id, - client: a_client._id, - }) - .toArray(); - - if (acls.length) { - for (i in acls) { - acl = acls[i]; - //console.log("user_perm:",acl); - perm_found |= acl.grant; - if (a_inherited && acl.inhgrant) perm_found |= acl.inhgrant; - } - - result = obj.evalPermissions(a_req_perm, perm_found, any); - if (result != null) return result; - } - } - - // Evaluate group permissions on object - if (a_object.acls & 2) { - acls = obj.db - ._query( - "for v, e, p in 2..2 outbound @object acl, outbound member filter p.vertices[2]._id == @client return p.edges[0]", - { - object: a_object._id, - client: a_client._id, - }, - ) - .toArray(); - if (acls.length) { - for (i in acls) { - acl = acls[i]; - //console.log("group_perm:",acl); - perm_found |= acl.grant; - if (a_inherited && acl.inhgrant) perm_found |= acl.inhgrant; - } - - result = obj.evalPermissions(a_req_perm, perm_found, any); - if (result != null) return result; - } - } - - // If not all requested permissions have been found, evaluate permissions inherited from parent collections - // Note that items can only be linked to containers that share the same owner - // This evaluation is implemented as a manually guided breadth-first search - - var children = [a_object]; - var parents, parent; - - for (;;) { - // Find all parent collections owned by object owner - - parents = obj.db - ._query( - "for i in @children for v in 1..1 inbound i item return {_id:v._id,topic:v.topic,acls:v.acls}", - { - children: children, - }, - ) - .toArray(); - - if (parents.length == 0) break; - - for (i in parents) { - parent = parents[i]; - - if (parent.topic) { - perm_found |= obj.PERM_PUBLIC; - - result = obj.evalPermissions(a_req_perm, perm_found, any); - if (result != null) return result; - } - - // User ACL first - if (parent.acls && (parent.acls & 1) !== 0) { - acls = obj.db - ._query( - "for v, e in 1..1 outbound @object acl filter v._id == @client return e", - { - object: parent._id, - client: a_client._id, - }, - ) - .toArray(); - if (acls.length) { - for (i in acls) { - acl = acls[i]; - perm_found |= acl.inhgrant; - } - - result = obj.evalPermissions(a_req_perm, perm_found, any); - if (result != null) return result; - } - } - - // Group ACL next - if (parent.acls && (parent.acls & 2) !== 0) { - acls = obj.db - ._query( - "for v, e, p in 2..2 outbound @object acl, outbound member filter is_same_collection('g',p.vertices[1]) and p.vertices[2]._id == @client return p.edges[0]", - { - object: parent._id, - client: a_client._id, - }, - ) - .toArray(); - if (acls.length) { - for (i in acls) { - acl = acls[i]; - perm_found |= acl.inhgrant; - } - - result = obj.evalPermissions(a_req_perm, perm_found, any); - if (result != null) return result; - } - } - } - - // If there are still missing require permissions... - // Determine which parents are candidates for further evaluation (have req bits not set in inherited permissions) - children = parents; - } - - //console.log("perm (last): false" ); - return false; - }; - - obj.evalPermissions = function (a_req_perm, a_perm_found, any) { - if (any) { - // If any requested permission have been found, return true (granted) - if (a_perm_found & a_req_perm) return true; - else return null; // Else, keep looking - } else { - // If not all requested permissions have been found return NULL (keep looking) - if ((a_perm_found & a_req_perm) != a_req_perm) return null; - else return true; // Else, permission granted - } - }; - - obj.getPermissions = function (a_client, a_object, a_req_perm, a_inherited = false) { - //console.log("get perm:", a_req_perm, "client:", a_client._id, "object:", a_object._id, "any:", any ); - //console.log("grant:", a_object.grant ); - - var perm_found = 0, - acl, - acls, - i; - - // If object has a topic (collections only), everyone is granted VIEW, and READ permissions - // The current implementation allows users to be denied access to public data (maybe wrong?) - - if (a_object.topic) { - perm_found = obj.PERM_PUBLIC; - - if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; - } - - // Evaluate permissions set directly on object - - if (a_object.acls && (a_object.acls & 1) !== 0) { - acls = obj.db - ._query("for v, e in 1..1 outbound @object acl filter v._id == @client return e", { - object: a_object._id, - client: a_client._id, - }) - .toArray(); - - if (acls.length) { - for (i in acls) { - acl = acls[i]; - //console.log("user_perm:",acl); - perm_found |= acl.grant; - if (a_inherited && acl.inhgrant) perm_found |= acl.inhgrant; - } - - if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; - } - } - - // Evaluate group permissions on object - - if (a_object.acls && (a_object.acls & 2) !== 0) { - acls = obj.db - ._query( - "for v, e, p in 2..2 outbound @object acl, outbound member filter p.vertices[2]._id == @client return p.edges[0]", - { - object: a_object._id, - client: a_client._id, - }, - ) - .toArray(); - - if (acls.length) { - for (i in acls) { - acl = acls[i]; - //console.log("group_perm:",acl); - perm_found |= acl.grant; - if (a_inherited && acl.inhgrant) perm_found |= acl.inhgrant; - } - - if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; - } - } - - // If not all requested permissions have been found, evaluate permissions inherited from parent collections - // Note that items can only be linked to containers that share the same owner - - var children = [a_object]; - var parents, parent; - - for (;;) { - // Find all parent collections owned by object owner - - parents = obj.db - ._query( - "for i in @children for v in 1..1 inbound i item return {_id:v._id,topic:v.topic,acls:v.acls}", - { - children: children, - }, - ) - .toArray(); - - if (parents.length == 0) break; - - for (i in parents) { - parent = parents[i]; - - if (parent.topic) { - perm_found |= obj.PERM_PUBLIC; - - if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; - } - - // User ACL - if (parent.acls && (parent.acls & 1) != 0) { - acls = obj.db - ._query( - "for v, e in 1..1 outbound @object acl filter v._id == @client return e", - { - object: parent._id, - client: a_client._id, - }, - ) - .toArray(); - if (acls.length) { - for (i in acls) { - acl = acls[i]; - perm_found |= acl.inhgrant; - } - - if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; - } - } - - // Group ACL - if (parent.acls && (parent.acls & 2) != 0) { - acls = obj.db - ._query( - "for v, e, p in 2..2 outbound @object acl, outbound member filter is_same_collection('g',p.vertices[1]) and p.vertices[2]._id == @client return p.edges[0]", - { - object: parent._id, - client: a_client._id, - }, - ) - .toArray(); - if (acls.length) { - for (i in acls) { - acl = acls[i]; - perm_found |= acl.inhgrant; - } - - if ((a_req_perm & perm_found) == a_req_perm) return a_req_perm; - } - } - } - - // If there are still missing require permissions... - // Determine which parents are candidates for further evaluation (have req bits not set in inherited permissions) - children = parents; - } - - return perm_found & a_req_perm; - }; - - obj.getPermissionsLocal = function (a_client_id, a_object, a_get_inherited, a_req_perm) { - var perm = { - grant: 0, - inhgrant: 0, - inherited: 0, - }, - acl, - acls, - i; - - //console.log("getPermissionsLocal",a_object._id); - - if (a_object.topic) { - //console.log("has topic 1"); - perm.grant |= obj.PERM_PUBLIC; - perm.inhgrant |= obj.PERM_PUBLIC; - } - - if (a_object.acls & 1) { - //console.log("chk local user acls"); - - acls = obj.db - ._query("for v, e in 1..1 outbound @object acl filter v._id == @client return e", { - object: a_object._id, - client: a_client_id, - }) - .toArray(); - - for (i in acls) { - acl = acls[i]; - perm.grant |= acl.grant; - perm.inhgrant |= acl.inhgrant; - } - } - - // Evaluate group permissions on object - if (a_object.acls & 2) { - //console.log("chk local group acls"); - - acls = obj.db - ._query( - "for v, e, p in 2..2 outbound @object acl, outbound member filter p.vertices[2]._id == @client return p.edges[0]", - { - object: a_object._id, - client: a_client_id, - }, - ) - .toArray(); - for (i in acls) { - acl = acls[i]; - perm.grant |= acl.grant; - perm.inhgrant |= acl.inhgrant; - } - } - - if (a_get_inherited) { - //console.log("chk inherited"); - - var children = [a_object]; - var parents, parent; - - for (;;) { - // Find all parent collections owned by object owner - - parents = obj.db - ._query( - "for i in @children for v in 1..1 inbound i item return {_id:v._id,topic:v.topic,acls:v.acls}", - { - children: children, - }, - ) - .toArray(); - - //console.log("parents",parents); - - if (parents.length == 0) break; - - for (i in parents) { - parent = parents[i]; - - if (parent.topic) { - //console.log("has topic 2"); - - perm.inherited |= obj.PERM_PUBLIC; - - if ((a_req_perm & perm.inherited) == a_req_perm) break; - } - - // User ACL - if (parent.acls && (parent.acls & 1) != 0) { - //console.log("chk par user acls"); - - acls = obj.db - ._query( - "for v, e in 1..1 outbound @object acl filter v._id == @client return e", - { - object: parent._id, - client: a_client_id, - }, - ) - .toArray(); - if (acls.length) { - for (i in acls) { - acl = acls[i]; - perm.inherited |= acl.inhgrant; - } - - if ((a_req_perm & perm.inherited) == a_req_perm) break; - } - } - - // Group ACL - if (parent.acls && (parent.acls & 2) != 0) { - //console.log("chk par group acls"); - - acls = obj.db - ._query( - "for v, e, p in 2..2 outbound @object acl, outbound member filter is_same_collection('g',p.vertices[1]) and p.vertices[2]._id == @client return p.edges[0]", - { - object: parent._id, - client: a_client_id, - }, - ) - .toArray(); - if (acls.length) { - for (i in acls) { - acl = acls[i]; - perm.inherited |= acl.inhgrant; - } - - if ((a_req_perm & perm.inherited) == a_req_perm) break; - } - } - } - - // If there are still missing require permissions... - // Determine which parents are candidates for further evaluation (have req bits not set in inherited permissions) - children = parents; - } - } - - return perm; - }; - obj.getACLOwnersBySubject = function (subject, inc_users, inc_projects) { var results = []; @@ -2547,7 +1860,7 @@ module.exports = (function () { dep = deps.next(); if (dep == src) throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Circular dependency detected in references, from " + id, ]; obj.checkDependencies(dep, src ? src : id, depth + 1); @@ -2566,7 +1879,10 @@ module.exports = (function () { id = a_subj.id || a_subj._id; if (a_client) { - if (a_admin || (a_admin === undefined && obj.hasAdminPermObject(a_client, id))) { + if ( + a_admin || + (a_admin === undefined && permissions.hasAdminPermObject(a_client, id)) + ) { // Owner/admin - return notes that are open or active res = obj.db._query( "for n in 1..1 outbound @id note return {type:n.type,state:n.state,parent_id:n.parent_id}", @@ -2933,7 +2249,7 @@ module.exports = (function () { } else { //console.log( "save", id ); if (tag.length > 40) - throw [obj.ERR_INVALID_PARAM, "Tag too long (max 40 characters)."]; + throw [error.ERR_INVALID_PARAM, "Tag too long (max 40 characters)."]; for (j = 0; j < tag.length; j++) { code = tag.charCodeAt(j); @@ -2943,7 +2259,7 @@ module.exports = (function () { code !== 45 ) // "-" - throw [obj.ERR_INVALID_CHAR, "Invalid character(s) in tag."]; + throw [error.ERR_INVALID_CHAR, "Invalid character(s) in tag."]; } obj.db.tag.save({ @@ -3025,7 +2341,7 @@ module.exports = (function () { for (c in cur) { col = obj.db.c.document(cur[c]); - if (obj.hasAdminPermObject(a_client, col._id)) { + if (permissions.hasAdminPermObject(a_client, col._id)) { child = obj.db._query( "for i in 1..10 outbound @col item filter is_same_collection('c',i) return i._id", { @@ -3044,19 +2360,20 @@ module.exports = (function () { } } } else { - perm = obj.getPermissionsLocal( + perm = permissions.getPermissionsLocal( a_client._id, col, true, - obj.PERM_RD_REC | obj.PERM_LIST, + permissions.PERM_RD_REC | permissions.PERM_LIST, ); if ( perm.grant & - ((obj.PERM_RD_REC | obj.PERM_LIST) != (obj.PERM_RD_REC | obj.PERM_LIST)) + ((permissions.PERM_RD_REC | permissions.PERM_LIST) != + (permissions.PERM_RD_REC | permissions.PERM_LIST)) ) { throw [ - obj.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied for collection '" + col._id + "'", ]; } @@ -3067,7 +2384,8 @@ module.exports = (function () { if ( perm.inhgrant & - ((obj.PERM_RD_REC | obj.PERM_LIST) == (obj.PERM_RD_REC | obj.PERM_LIST)) + ((permissions.PERM_RD_REC | permissions.PERM_LIST) == + (permissions.PERM_RD_REC | permissions.PERM_LIST)) ) { child = obj.db._query( "for i in 1..10 outbound @col item filter is_same_collection('c',i) return i._id", @@ -3111,7 +2429,7 @@ module.exports = (function () { if (!a_cols.has(a_col_id)) { //console.log("expColl",a_col_id,"inh:",a_inh_perm); var col, res; - if (obj.hasAdminPermObject(a_client, a_col_id)) { + if (permissions.hasAdminPermObject(a_client, a_col_id)) { a_cols.add(a_col_id); //console.log("has admin"); res = obj.db._query( @@ -3129,23 +2447,23 @@ module.exports = (function () { } else { col = obj.db.c.document(a_col_id); - var perm = obj.getPermissionsLocal( + var perm = permissions.getPermissionsLocal( a_client._id, col, a_inh_perm == undefined ? true : false, - obj.PERM_RD_REC | obj.PERM_LIST, + permissions.PERM_RD_REC | permissions.PERM_LIST, ); //console.log("perm",perm); if ( ((perm.grant | perm.inherited | a_inh_perm) & - (obj.PERM_RD_REC | obj.PERM_LIST)) != - (obj.PERM_RD_REC | obj.PERM_LIST) + (permissions.PERM_RD_REC | permissions.PERM_LIST)) != + (permissions.PERM_RD_REC | permissions.PERM_LIST) ) { if (a_inh_perm == undefined) { // Only throw a PERM_DENIED error if this is one of the user-specified collections (not a child) throw [ - obj.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Permission denied for collection '" + col._id + "'", ]; } else { @@ -3160,8 +2478,8 @@ module.exports = (function () { if ( ((perm.inhgrant | perm.inherited | a_inh_perm) & - (obj.PERM_RD_REC | obj.PERM_LIST)) == - (obj.PERM_RD_REC | obj.PERM_LIST) + (permissions.PERM_RD_REC | permissions.PERM_LIST)) == + (permissions.PERM_RD_REC | permissions.PERM_LIST) ) { //console.log("have all inh perms"); @@ -3208,7 +2526,7 @@ module.exports = (function () { * * GLOBUS_TRANSFER: "|" * @returns {{}} Object containing the parsed key/values of the input other_token_data string. - * @throws obj.ERR_INVALAD_PARAM + * @throws error.ERR_INVALAD_PARAM * * @example * // returns { uuid: "1cbaaee5-b938-4a4e-87a8-f1ec4d5d92f9", scopes: "urn:globus:auth:scope:transfer.api.globus.org:all+email" } @@ -3223,13 +2541,16 @@ module.exports = (function () { // GLOBUS_TRANSFER parse currently assumes uuid and scopes exist, but this may change const parsed_data = other_token_data.split("|"); if (parsed_data.length !== 2) { - throw [obj.ERR_INVALID_PARAM, "Unexpected count of additional token data provided"]; + throw [ + error.ERR_INVALID_PARAM, + "Unexpected count of additional token data provided", + ]; } const parsed_uuid = parsed_data[0]; if (!obj.isUUID(parsed_uuid)) { throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Provided other_token_data does not follow format of '|'", ]; } @@ -3237,7 +2558,7 @@ module.exports = (function () { if (!parsed_scopes.includes("transfer.api.globus.org")) { // TODO: does this need validation, and is this validation sufficient? throw [ - obj.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Scopes included in other_token_data do not refer to transfer resource, but transfer resource was specified", ]; } diff --git a/core/database/foxx/api/tag_router.js b/core/database/foxx/api/tag_router.js index 3dfb28d41..3bbd4fd4b 100644 --- a/core/database/foxx/api/tag_router.js +++ b/core/database/foxx/api/tag_router.js @@ -2,6 +2,7 @@ const createRouter = require("@arangodb/foxx/router"); const router = createRouter(); +const error = require("./lib/error_codes"); const joi = require("joi"); const g_db = require("@arangodb").db; @@ -16,7 +17,7 @@ router try { var name = req.queryParams.name.trim(); if (name.length < 3) - throw [g_lib.ERR_INVALID_PARAM, "Input is too short for tag search."]; + throw [error.ERR_INVALID_PARAM, "Input is too short for tag search."]; var off = req.queryParams.offset ? req.queryParams.offset : 0, cnt = req.queryParams.count ? req.queryParams.count : 50, diff --git a/core/database/foxx/api/task_router.js b/core/database/foxx/api/task_router.js index e4f96922b..a83d229a6 100644 --- a/core/database/foxx/api/task_router.js +++ b/core/database/foxx/api/task_router.js @@ -5,6 +5,7 @@ const router = createRouter(); const joi = require("joi"); const g_db = require("@arangodb").db; const g_lib = require("./support"); +const error = require("./lib/error_codes"); const g_tasks = require("./tasks"); module.exports = router; @@ -17,7 +18,7 @@ router if (!g_db._exists(req.queryParams.task_id)) { // WARNING - do not change this error message it is acted on by the task worker throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Task " + req.queryParams.task_id + " does not exist.", ]; } @@ -68,7 +69,7 @@ router action: function () { if (!g_db.task.exists(req.queryParams.task_id)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Task " + req.queryParams.task_id + " does not exist.", ]; @@ -112,7 +113,7 @@ router req.queryParams.step >= task.steps ) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Called run on task " + task._id + " with invalid step: " + @@ -121,7 +122,7 @@ router } } else { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Called run on task " + task._id + " with incorrect status: " + @@ -232,7 +233,7 @@ router action: function () { if (!g_db._exists(req.queryParams.task_id)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Task " + req.queryParams.task_id + " does not exist.", ]; @@ -255,13 +256,13 @@ router try { if (!g_db._exists(req.queryParams.task_id)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Task " + req.queryParams.task_id + " does not exist.", ]; var task = g_db.task.document(req.queryParams.task_id); if (task.status < g_lib.TS_SUCCEEDED) - throw [g_lib.ERR_IN_USE, "Cannot delete task that is still scheduled."]; + throw [error.ERR_IN_USE, "Cannot delete task that is still scheduled."]; g_lib.graph.task.remove(req.queryParams.task_id); } catch (e) { diff --git a/core/database/foxx/api/tasks.js b/core/database/foxx/api/tasks.js index 0e163b89b..8e7ac603d 100644 --- a/core/database/foxx/api/tasks.js +++ b/core/database/foxx/api/tasks.js @@ -2,11 +2,14 @@ // local imports const g_lib = require("./support"); +const error = require("./lib/error_codes"); const { UserToken } = require("./lib/user_token"); const g_db = require("@arangodb").db; const g_graph = require("@arangodb/general-graph")._graph("sdmsg"); const g_proc = require("./process"); +const permissions = require("./lib/permissions"); + var g_internal = require("internal"); var tasks_func = (function () { @@ -25,13 +28,13 @@ var tasks_func = (function () { // Check if repo and subject exist if (!g_db._exists(a_repo_id)) - throw [g_lib.ERR_NOT_FOUND, "Repo, '" + a_repo_id + "', does not exist"]; + throw [error.ERR_NOT_FOUND, "Repo, '" + a_repo_id + "', does not exist"]; if (!g_db._exists(a_subject_id)) - throw [g_lib.ERR_NOT_FOUND, "Subject, '" + a_subject_id + "', does not exist"]; + throw [error.ERR_NOT_FOUND, "Subject, '" + a_subject_id + "', does not exist"]; // Check for proper permissions - g_lib.ensureAdminPermRepo(a_client, a_repo_id); + permissions.ensureAdminPermRepo(a_client, a_repo_id); // Check if there is already a matching allocation var alloc = g_db.alloc.firstExample({ @@ -40,7 +43,7 @@ var tasks_func = (function () { }); if (alloc) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Subject, '" + a_subject_id + "', already has as allocation on " + a_repo_id, ]; @@ -55,7 +58,7 @@ var tasks_func = (function () { ); if (res.hasNext()) { - throw [g_lib.ERR_IN_USE, "A duplicate allocation create task was found."]; + throw [error.ERR_IN_USE, "A duplicate allocation create task was found: " + res.next()]; } var repo = g_db.repo.document(a_repo_id); @@ -72,7 +75,6 @@ var tasks_func = (function () { repo_path: path, }; var task = obj._createTask(a_client._id, g_lib.TT_ALLOC_CREATE, 2, state); - if ( g_proc._lockDepsGeneral(task._id, [ { @@ -98,7 +100,6 @@ var tasks_func = (function () { }, ).new; } - return { task: task, }; @@ -158,14 +159,14 @@ var tasks_func = (function () { console.log("taskInitAllocDelete"); if (!g_db._exists(a_repo_id)) - throw [g_lib.ERR_NOT_FOUND, "Repo, '" + a_repo_id + "', does not exist"]; + throw [error.ERR_NOT_FOUND, "Repo, '" + a_repo_id + "', does not exist"]; if (!g_db._exists(a_subject_id)) - throw [g_lib.ERR_NOT_FOUND, "Subject, '" + a_subject_id + "', does not exist"]; + throw [error.ERR_NOT_FOUND, "Subject, '" + a_subject_id + "', does not exist"]; var repo = g_db.repo.document(a_repo_id); - g_lib.ensureAdminPermRepo(a_client, a_repo_id); + permissions.ensureAdminPermRepo(a_client, a_repo_id); var alloc = g_db.alloc.firstExample({ _from: a_subject_id, @@ -173,7 +174,7 @@ var tasks_func = (function () { }); if (!alloc) throw [ - g_lib.ERR_NOT_FOUND, + error.ERR_NOT_FOUND, "Subject, '" + a_subject_id + "', has no allocation on " + a_repo_id, ]; @@ -186,7 +187,7 @@ var tasks_func = (function () { }, ) .next(); - if (count) throw [g_lib.ERR_IN_USE, "Cannot delete allocation - records present"]; + if (count) throw [error.ERR_IN_USE, "Cannot delete allocation - records present"]; // Check if there is an existing alloc task to involving the same allocation (repo + subject) var res = g_db._query( @@ -199,7 +200,7 @@ var tasks_func = (function () { ); if (res.hasNext()) { - throw [g_lib.ERR_IN_USE, "A duplicate allocation delete task was found."]; + throw [error.ERR_IN_USE, "A duplicate allocation delete task was found: " + res.next()]; } var path = @@ -311,7 +312,7 @@ var tasks_func = (function () { if (result.glob_data.length + result.ext_data.length > 0 && !a_check) { var idx = a_path.indexOf("/"); if (idx == -1) - throw [g_lib.ERR_INVALID_PARAM, "Invalid destination path (must include endpoint)"]; + throw [error.ERR_INVALID_PARAM, "Invalid destination path (must include endpoint)"]; // Check for duplicate names if (a_orig_fname) { @@ -324,7 +325,7 @@ var tasks_func = (function () { ); if (fnames.has(fname)) { throw [ - g_lib.ERR_XFR_CONFLICT, + error.ERR_XFR_CONFLICT, "Duplicate filename(s) detected in transfer request.", ]; } @@ -338,7 +339,7 @@ var tasks_func = (function () { ); if (fnames.has(fname)) { throw [ - g_lib.ERR_XFR_CONFLICT, + error.ERR_XFR_CONFLICT, "Duplicate filename(s) detected in transfer request.", ]; } @@ -495,7 +496,7 @@ var tasks_func = (function () { if (result.glob_data.length > 0 && !a_check) { var idx = a_path.indexOf("/"); if (idx == -1) - throw [g_lib.ERR_INVALID_PARAM, "Invalid destination path (must include endpoint)"]; + throw [error.ERR_INVALID_PARAM, "Invalid destination path (must include endpoint)"]; var state = { path: a_path, @@ -702,10 +703,10 @@ var tasks_func = (function () { if (a_proj_id) { if (!g_db.p.exists(a_proj_id)) - throw [g_lib.ERR_INVALID_PARAM, "Project '" + a_proj_id + "' does not exist."]; + throw [error.ERR_INVALID_PARAM, "Project '" + a_proj_id + "' does not exist."]; - if (!g_lib.hasManagerPermProj(a_client, a_proj_id)) - throw [g_lib.ERR_PERM_DENIED, "Operation requires admin permissions to project."]; + if (!permissions.hasManagerPermProj(a_client, a_proj_id)) + throw [error.ERR_PERM_DENIED, "Operation requires admin permissions to project."]; owner_id = a_proj_id; } else { @@ -714,14 +715,14 @@ var tasks_func = (function () { // Verify destination repo if (!g_db.repo.exists(a_dst_repo_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such repo '" + a_dst_repo_id + "'"]; + throw [error.ERR_INVALID_PARAM, "No such repo '" + a_dst_repo_id + "'"]; // Verify client/owner has an allocation var alloc = g_db.alloc.firstExample({ _from: owner_id, _to: a_dst_repo_id, }); - if (!alloc) throw [g_lib.ERR_INVALID_PARAM, "No allocation on '" + a_dst_repo_id + "'"]; + if (!alloc) throw [error.ERR_INVALID_PARAM, "No allocation on '" + a_dst_repo_id + "'"]; var result = g_proc.preprocessItems( { @@ -884,13 +885,13 @@ var tasks_func = (function () { }); if (alloc.rec_count + xfr.files.length > alloc.rec_limit) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Allocation record count limit exceeded on " + state.dst_repo_id, ]; if (alloc.data_size + xfr.size > alloc.data_limit) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Allocation data size limit exceeded on " + state.dst_repo_id, ]; @@ -898,7 +899,7 @@ var tasks_func = (function () { obj.recMoveInit(xfr.files, state.dst_repo_id); // TEST ONLY - //throw [g_lib.ERR_INTERNAL_FAULT,"TEST ONLY ERROR"]; + //throw [error.ERR_INTERNAL_FAULT,"TEST ONLY ERROR"]; // Update task step a_task.step += 1; @@ -1006,19 +1007,19 @@ var tasks_func = (function () { // Verify destination collection if (!g_db.c.exists(a_dst_coll_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such collection '" + a_dst_coll_id + "'"]; + throw [error.ERR_INVALID_PARAM, "No such collection '" + a_dst_coll_id + "'"]; var owner_id = g_db.owner.firstExample({ _from: a_dst_coll_id, })._to; if (owner_id != a_client._id) { - if (owner_id.charAt(0) != "p" || !g_lib.hasManagerPermProj(a_client, owner_id)) { + if (owner_id.charAt(0) != "p" || !permissions.hasManagerPermProj(a_client, owner_id)) { var coll = g_db.c.document(a_dst_coll_id); - if (!g_lib.hasPermissions(a_client, coll, g_lib.PERM_CREATE)) + if (!permissions.hasPermissions(a_client, coll, permissions.PERM_CREATE)) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Operation requires CREATE permission on destination collection '" + a_dst_coll_id + "'", @@ -1036,13 +1037,13 @@ var tasks_func = (function () { }) .toArray(); if (!allocs.length) - throw [g_lib.ERR_PERM_DENIED, "No allocations available for '" + owner_id + "'"]; + throw [error.ERR_PERM_DENIED, "No allocations available for '" + owner_id + "'"]; g_lib.sortAllocations(allocs); } else { // Verify destination repo if (!g_db.repo.exists(a_dst_repo_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such repo '" + a_dst_repo_id + "'"]; + throw [error.ERR_INVALID_PARAM, "No such repo '" + a_dst_repo_id + "'"]; // Verify client/owner has an allocation if ( @@ -1051,14 +1052,14 @@ var tasks_func = (function () { _to: a_dst_repo_id, }) ) - throw [g_lib.ERR_INVALID_PARAM, "No allocation on '" + a_dst_repo_id + "'"]; + throw [error.ERR_INVALID_PARAM, "No allocation on '" + a_dst_repo_id + "'"]; } var result = g_proc.preprocessItems(a_client, owner_id, a_res_ids, g_lib.TT_REC_OWNER_CHG); if (result.has_pub) { throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Owner change not allowed - selection contains public data.", ]; } @@ -1269,13 +1270,13 @@ var tasks_func = (function () { }); if (alloc.rec_count + xfr.files.length > alloc.rec_limit) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Allocation record count limit exceeded on " + state.dst_repo_id, ]; if (alloc.data_size + xfr.size > alloc.data_limit) throw [ - g_lib.ERR_PERM_DENIED, + error.ERR_PERM_DENIED, "Allocation data size limit exceeded on " + state.dst_repo_id, ]; @@ -1380,7 +1381,7 @@ var tasks_func = (function () { var result = g_proc.preprocessItems(a_client, null, a_ids, g_lib.TT_REC_DEL); if (result.has_pub) { - throw [g_lib.ERR_PERM_DENIED, "Deletion not allowed - selection contains public data."]; + throw [error.ERR_PERM_DENIED, "Deletion not allowed - selection contains public data."]; } var i, @@ -1570,9 +1571,9 @@ var tasks_func = (function () { for (i in a_proj_ids) { proj_id = a_proj_ids[i]; if (!g_db.p.exists(proj_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such project '" + proj_id + "'"]; + throw [error.ERR_INVALID_PARAM, "No such project '" + proj_id + "'"]; - g_lib.ensureAdminPermProj(a_client, proj_id); + permissions.ensureAdminPermProj(a_client, proj_id); } obj._ensureExclusiveAccess(a_proj_ids); @@ -1728,7 +1729,7 @@ var tasks_func = (function () { case g_lib.TT_PROJ_DEL: return obj.taskRunProjDelete; default: - throw [g_lib.ERR_INVALID_PARAM, "Invalid task type: " + a_task.type]; + throw [error.ERR_INVALID_PARAM, "Invalid task type: " + a_task.type]; } }; @@ -1750,7 +1751,6 @@ var tasks_func = (function () { }; obj.taskComplete = function (a_task_id, a_success, a_msg) { - console.log("taskComplete 1"); var ready_tasks = [], dep, dep_blocks, @@ -1759,8 +1759,6 @@ var tasks_func = (function () { }); var time = Math.floor(Date.now() / 1000); - console.log("taskComplete 2"); - while (blocks.hasNext()) { dep = blocks.next()._from; dep_blocks = g_db.block @@ -1786,7 +1784,6 @@ var tasks_func = (function () { ); } } - console.log("taskComplete 3"); var doc; if (a_success) { @@ -1803,14 +1800,12 @@ var tasks_func = (function () { doc.ut = time; - console.log("taskComplete 4", doc); g_db.block.removeByExample({ _to: a_task_id, }); g_db.lock.removeByExample({ _from: a_task_id, }); - console.log("taskComplete 5"); var delay = 1; for (;;) { try { @@ -1830,7 +1825,6 @@ var tasks_func = (function () { } } } - console.log("taskComplete 6"); return ready_tasks; }; @@ -1915,7 +1909,7 @@ var tasks_func = (function () { if (a_mode == g_lib.TT_DATA_GET || a_mode == g_lib.TT_DATA_PUT) { idx = a_remote.indexOf("/"); if (idx < 1) - throw [g_lib.ERR_INVALID_PARAM, "Invalid remote path (must include endpoint)"]; + throw [error.ERR_INVALID_PARAM, "Invalid remote path (must include endpoint)"]; //console.log("rem idx:",idx); @@ -1979,7 +1973,7 @@ var tasks_func = (function () { file.to = loc.d_src.substr(loc.d_src.lastIndexOf("/") + 1); if (fnames.has(file.to)) { throw [ - g_lib.ERR_XFR_CONFLICT, + error.ERR_XFR_CONFLICT, "Duplicate filename(s) detected in transfer request.", ]; } @@ -2044,7 +2038,7 @@ var tasks_func = (function () { idx = edat.source.indexOf("/"); if (idx < 0) { - throw [g_lib.ERR_INVALID_PARAM, "Invalid external source path: " + edat.source]; + throw [error.ERR_INVALID_PARAM, "Invalid external source path: " + edat.source]; } ep = edat.source.substr(0, idx); src = edat.source.substr(idx); @@ -2053,14 +2047,14 @@ var tasks_func = (function () { idx = src.lastIndexOf("/"); if (idx < 0) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid external source path: " + edat.source, ]; } file.to = src.substr(idx + 1); if (fnames.has(file.to)) { throw [ - g_lib.ERR_XFR_CONFLICT, + error.ERR_XFR_CONFLICT, "Duplicate filename(s) detected in transfer request.", ]; } @@ -2558,13 +2552,13 @@ var tasks_func = (function () { // DEV-ONLY SANITY CHECKS: if (!loc.new_coll) throw [ - g_lib.ERR_INTERNAL_FAULT, + error.ERR_INTERNAL_FAULT, "Record '" + data.id + "' missing destination collection!", ]; if (!g_db.c.exists(loc.new_coll)) throw [ - g_lib.ERR_INTERNAL_FAULT, + error.ERR_INTERNAL_FAULT, "Record '" + data.id + "' destination collection '" + @@ -2576,7 +2570,7 @@ var tasks_func = (function () { if (coll.owner != loc.new_owner) throw [ - g_lib.ERR_INTERNAL_FAULT, + error.ERR_INTERNAL_FAULT, "Record '" + data.id + "' destination collection '" + @@ -2663,7 +2657,7 @@ var tasks_func = (function () { }); if (!alloc) throw [ - g_lib.ERR_INTERNAL_FAULT, + error.ERR_INTERNAL_FAULT, "Record '" + data.id + "' has mismatched allocation/location (cur)!", ]; @@ -2684,7 +2678,7 @@ var tasks_func = (function () { }); if (!alloc) throw [ - g_lib.ERR_INTERNAL_FAULT, + error.ERR_INTERNAL_FAULT, "Record '" + data.id + "' has mismatched allocation/location (new)!", ]; @@ -2709,7 +2703,7 @@ var tasks_func = (function () { obj.recMoveExt = function (a_data, a_dst_owner_id, a_dst_coll_id) { if (!g_db.c.exists(a_dst_coll_id)) { throw [ - g_lib.ERR_INTERNAL_FAULT, + error.ERR_INTERNAL_FAULT, "Destination collection '" + a_dst_coll_id + "' does not exist!", ]; } @@ -2723,7 +2717,7 @@ var tasks_func = (function () { if (coll.owner != a_dst_owner_id) throw [ - g_lib.ERR_INTERNAL_FAULT, + error.ERR_INTERNAL_FAULT, "Destination collection '" + a_dst_coll_id + "' not owned by new owner!", ]; @@ -2811,7 +2805,7 @@ var tasks_func = (function () { _to: id, }); if (lock) - throw [g_lib.ERR_PERM_DENIED, "Operation not permitted - '" + id + "' in use."]; + throw [error.ERR_PERM_DENIED, "Operation not permitted - '" + id + "' in use."]; } //console.log("_ensureExclusiveAccess done", Date.now()); }; diff --git a/core/database/foxx/api/topic_router.js b/core/database/foxx/api/topic_router.js index ceca18a07..38bc07866 100644 --- a/core/database/foxx/api/topic_router.js +++ b/core/database/foxx/api/topic_router.js @@ -3,6 +3,7 @@ const createRouter = require("@arangodb/foxx/router"); const router = createRouter(); const joi = require("joi"); +const error = require("./lib/error_codes"); const g_db = require("@arangodb").db; const g_lib = require("./support"); @@ -26,8 +27,8 @@ router cnt = req.queryParams.count; if (req.queryParams.id) { - (qry = "for i in 1..1 inbound @par top filter is_same_collection('t',i)"), - (par.par = req.queryParams.id); + ((qry = "for i in 1..1 inbound @par top filter is_same_collection('t',i)"), + (par.par = req.queryParams.id)); } else { qry = "for i in t filter i.top == true"; } @@ -72,7 +73,7 @@ router .get("/view", function (req, res) { try { if (!g_db.t.exists(req.queryParams.id)) - throw [g_lib.ERR_NOT_FOUND, "Topic, " + req.queryParams.id + ", not found"]; + throw [error.ERR_NOT_FOUND, "Topic, " + req.queryParams.id + ", not found"]; var topic = g_db.t.document(req.queryParams.id); @@ -102,7 +103,7 @@ router path, op = false; - if (tokens.length == 0) throw [g_lib.ERR_INVALID_PARAM, "Invalid topic search phrase."]; + if (tokens.length == 0) throw [error.ERR_INVALID_PARAM, "Invalid topic search phrase."]; it = 0; for (i in tokens) { diff --git a/core/database/foxx/api/user_router.js b/core/database/foxx/api/user_router.js index 041e13dfd..95cd4d368 100644 --- a/core/database/foxx/api/user_router.js +++ b/core/database/foxx/api/user_router.js @@ -8,8 +8,12 @@ const auth = createAuth("pbkdf2"); const g_db = require("@arangodb").db; const g_graph = require("@arangodb/general-graph")._graph("sdmsg"); const g_lib = require("./support"); +const error = require("./lib/error_codes"); +const permissions = require("./lib/permissions"); const { UserToken } = require("./lib/user_token"); const { UserModel } = require("./models/user"); +const logger = require("./lib/logger"); +const basePath = "usr"; module.exports = router; @@ -17,22 +21,47 @@ module.exports = router; router .get("/authn/password", function (req, res) { - console.log("Running /authn/password"); + let client = null; try { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); const is_verified = auth.verify(client.password, req.queryParams.pw); if (is_verified === false) { - throw g_lib.ERR_AUTHN_FAILED; + throw error.ERR_AUTHN_FAILED; } - //if ( client.password != req.queryParams.pw ) - // throw g_lib.ERR_AUTHN_FAILED; + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/authn/password", + status: "Started", + description: "Authenticating user via password", + }); res.send({ uid: client._id, authorized: true, }); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/authn/password", + status: "Success", + description: "Authenticating user via password", + extra: "undefined", + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/authn/password", + status: "Failure", + description: "Authenticating user via password", + extra: "undefined", + error: e, + }); g_lib.handleException(e, res); } }) @@ -43,17 +72,48 @@ router router .get("/authn/token", function (req, res) { + let user = null; try { - var user = g_db._query("for i in u filter i.access == @tok return i", { + user = g_db._query("for i in u filter i.access == @tok return i", { tok: req.queryParams.token, }); - if (!user.hasNext()) throw g_lib.ERR_AUTHN_FAILED; + logger.logRequestStarted({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/authn/token", + status: "Started", + description: "Authenticating user via access token", + }); + + if (!user.hasNext()) throw error.ERR_AUTHN_FAILED; res.send({ uid: user.next()._id, authorized: true, }); + + logger.logRequestSuccess({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/authn/token", + status: "Success", + description: "Authenticating user via access token", + extra: "undefined", + }); } catch (e) { + logger.logRequestFailure({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/authn/token", + status: "Failure", + description: "Authenticating user via access token", + extra: "undefined", + error: e, + }); + g_lib.handleException(e, res); } }) @@ -63,26 +123,15 @@ router router .get("/create", function (req, res) { + let user = null; + let result = null; try { - var result; - g_db._executeTransaction({ collections: { read: ["u"], write: ["u", "c", "a", "g", "acl", "owner", "ident", "uuid", "alias", "admin"], }, action: function () { - var cfg = g_db.config.document("config/system"); - if (req.queryParams.secret != cfg.secret) { - console.log( - "ERROR: user create called with incorrect system secret. uid:", - req.queryParams.uid, - ", name:", - req.queryParams.name, - ); - throw [g_lib.ERR_AUTHN_FAILED, "Invalid system credentials"]; - } - var i, time = Math.floor(Date.now() / 1000), name = req.queryParams.name.trim(), @@ -90,7 +139,7 @@ router if (idx < 1) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "ERROR: invalid user name (no first/last name) " + name, ]; @@ -131,9 +180,18 @@ router user_data.options = req.queryParams.options; } - var user = g_db.u.save(user_data, { + user = g_db.u.save(user_data, { returnNew: true, }); + logger.logRequestStarted({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/create", + status: "Started", + description: "Create new user entry", + }); + var root = g_db.c.save( { _key: "u_" + req.queryParams.uid + "_root", @@ -185,7 +243,7 @@ router }) ) throw [ - g_lib.ERR_IN_USE, + error.ERR_IN_USE, "ERROR: linked identity value, " + uuid + ", already in use", ]; @@ -212,17 +270,36 @@ router delete user.new.name; result = [user.new]; + delete user.new.password; }, }); - res.send(result); + logger.logRequestSuccess({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/create", + status: "Success", + description: "Create new user entry", + extra: user.new.uid, + }); } catch (e) { + logger.logRequestFailure({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/create", + status: "Failure", + description: "Create new user entry", + extra: user.new.uid, + error: e, + }); g_lib.handleException(e, res); } }) .queryParam( "secret", - joi.string().required(), + joi.string().optional(), "System secret required to authorize this action", ) .queryParam("uid", joi.string().required(), "SDMS user ID (globus) for new user") @@ -237,23 +314,31 @@ router router .get("/update", function (req, res) { + let client = null; + let result = null; try { - var result; - g_db._executeTransaction({ collections: { read: ["u", "uuid", "accn"], write: ["u", "admin"], }, action: function () { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); var user_id; + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/update", + status: "Started", + description: "Update user information", + }); if (req.queryParams.subject) { user_id = req.queryParams.subject; if (!g_db.u.exists(user_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; - g_lib.ensureAdminPermUser(client, user_id); + throw [error.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; + permissions.ensureAdminPermUser(client, user_id); } else { user_id = client._id; } @@ -271,13 +356,13 @@ router if (idx < 1) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid user name (no first/last name) " + req.queryParams.name, ]; } - (obj.name_first = name.substr(0, idx).trim()), - (obj.name_last = name.substr(idx + 1)); + ((obj.name_first = name.substr(0, idx).trim()), + (obj.name_last = name.substr(idx + 1))); obj.name = name.toLowerCase() + " " + user_id.substr(2); } @@ -308,9 +393,26 @@ router result = [user.new]; }, }); - - res.send(result); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/update", + status: "Success", + description: "Update user information", + extra: result, + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/update", + status: "Failure", + description: "Update user information", + extra: result, + error: e, + }); g_lib.handleException(e, res); } }) @@ -326,6 +428,7 @@ router router .get("/find/by_uuids", function (req, res) { + let user = null; try { // Convert UUIDs to DB _ids var uuids = []; @@ -333,8 +436,15 @@ router uuids.push("uuid/" + req.queryParams.uuids[i]); } - var user = g_lib.findUserFromUUIDs(uuids); - + user = g_lib.findUserFromUUIDs(uuids); + logger.logRequestStarted({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_uuids", + status: "Started", + description: "Find a user from list of UUIDs", + }); var idents = g_db ._query("for v in 1..1 outbound @user ident return v._key", { user: user._id, @@ -352,7 +462,26 @@ router delete user.name; res.send([user]); + logger.logRequestSuccess({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_uuids", + status: "Success", + description: "Find a user from list of UUIDs", + extra: req.queryParams.uuids, + }); } catch (e) { + logger.logRequestFailure({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_uuids", + status: "Failure", + description: "Find a user from list of UUIDs", + extra: req.queryParams.uuids, + error: e, + }); g_lib.handleException(e, res); } }) @@ -362,10 +491,20 @@ router router .get("/find/by_name_uid", function (req, res) { + let name = null; try { - var name = req.queryParams.name_uid.trim(); + name = req.queryParams.name_uid.trim(); + logger.logRequestStarted({ + client: name, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_name_uid", + status: "Started", + description: "Find users matching partial name and/or uid", + }); + if (name.length < 2) - throw [g_lib.ERR_INVALID_PARAM, "Input is too short for name/uid search."]; + throw [error.ERR_INVALID_PARAM, "Input is too short for name/uid search."]; else if (name.length < 3) name = " " + name + " "; // Pad to allow matches for very short first/last names (i.e. Bo, Li, Xi) var off = req.queryParams.offset ? req.queryParams.offset : 0, @@ -395,7 +534,26 @@ router }); res.send(result); + logger.logRequestSuccess({ + client: name, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_name_uid", + status: "Success", + description: "Find users matching partial name and/or uid", + extra: result, + }); } catch (e) { + logger.logRequestFailure({ + client: name, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_name_uid", + status: "Failure", + description: "Find users matching partial name and/or uid", + extra: result, + error: e, + }); g_lib.handleException(e, res); } }) @@ -407,6 +565,7 @@ router router .get("/keys/set", function (req, res) { + let client = null; try { g_db._executeTransaction({ collections: { @@ -414,14 +573,24 @@ router write: ["u"], }, action: function () { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); + + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/set", + status: "Started", + description: "Set user public and private keys", + }); + var user_id; if (req.queryParams.subject) { user_id = req.queryParams.subject; if (!g_db.u.exists(user_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; - g_lib.ensureAdminPermUser(client, user_id); + throw [error.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; + permissions.ensureAdminPermUser(client, user_id); } else { user_id = client._id; } @@ -435,7 +604,27 @@ router }); }, }); + + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/set", + status: "Success", + description: "Set user public and private keys", + extra: "undefined", + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/set", + status: "Failure", + description: "Set user public and private keys", + extra: "undefined", + error: e, + }); g_lib.handleException(e, res); } }) @@ -448,6 +637,7 @@ router router .get("/keys/clear", function (req, res) { + let client = null; try { g_db._executeTransaction({ collections: { @@ -455,14 +645,23 @@ router write: ["u"], }, action: function () { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/clear", + status: "Started", + description: "Clear user public and private keys", + }); + var user_id; if (req.queryParams.subject) { user_id = req.queryParams.subject; if (!g_db.u.exists(user_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; - g_lib.ensureAdminPermUser(client, user_id); + throw [error.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; + permissions.ensureAdminPermUser(client, user_id); } else { user_id = client._id; } @@ -476,7 +675,26 @@ router }); }, }); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/clear", + status: "Success", + description: "Clear user public and private keys", + extra: "undefined", + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/clear", + status: "Failure", + description: "Clear user public and private keys", + extra: "undefined", + error: e, + }); g_lib.handleException(e, res); } }) @@ -487,30 +705,46 @@ router router .get("/keys/get", function (req, res) { + let user = null; try { - var user; - if (req.queryParams.subject) { if (!g_db.u.exists(req.queryParams.subject)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "No such user '" + req.queryParams.subject + "'", ]; user = g_db.u.document({ _id: req.queryParams.subject, }); + logger.logRequestStarted({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/get", + status: "Started", + description: "Get user public and private keys", + }); } else { user = g_lib.getUserFromClientID(req.queryParams.client); } - if (!user.pub_key || !user.priv_key) + if (!user.pub_key || !user.priv_key) { res.send([ { uid: user._id, }, ]); - else + logger.logRequestSuccess({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/get", + status: "Success", + description: "Get user public and private keys", + extra: "undefined", + }); + } else { res.send([ { uid: user._id, @@ -518,7 +752,27 @@ router priv_key: user.priv_key, }, ]); + logger.logRequestSuccess({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/get", + status: "Success", + description: "Get user public and private keys", + extra: "undefined", + }); + } } catch (e) { + logger.logRequestFailure({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/keys/get", + status: "Failure", + description: "Get user public and private keys", + extra: "undefined", + error: e, + }); g_lib.handleException(e, res); } }) @@ -529,10 +783,38 @@ router router .get("/find/by_pub_key", function (req, res) { + let uid = null; try { - var uid = g_lib.uidFromPubKey(req.queryParams.pub_key); + uid = g_lib.uidFromPubKey(req.queryParams.pub_key); + logger.logRequestStarted({ + client: uid, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_pub_key", + status: "Started", + description: "Find a user by public key", + }); res.send(uid); + logger.logRequestSuccess({ + client: uid, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_pub_key", + status: "Success", + description: "Find a user by public key", + extra: uid, + }); } catch (e) { + logger.logRequestFailure({ + client: uid, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/find/by_pub_key", + status: "Failure", + description: "Find a user by public key", + extra: uid, + error: e, + }); g_lib.handleException(e, res); } }) @@ -542,6 +824,7 @@ router router .get("/token/set", function (req, res) { + let client = null; try { g_db._executeTransaction({ collections: { @@ -549,7 +832,17 @@ router write: ["u", "globus_coll", "globus_token"], }, action: function () { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); + + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/set", + status: "Started", + description: "Setting user token", + }); + var user_id; let user_doc; @@ -560,7 +853,7 @@ router token_type === g_lib.AccessTokenType.GLOBUS_DEFAULT ) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid parameters passed, the default action cannot process other_token_data.", ]; } else if ( @@ -568,7 +861,7 @@ router token_type !== g_lib.AccessTokenType.GLOBUS_DEFAULT ) { throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid parameters passed, type and other_token_data depend on one another.", ]; } @@ -576,21 +869,13 @@ router if (req.queryParams.subject) { user_id = req.queryParams.subject; if (!g_db.u.exists(user_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; - g_lib.ensureAdminPermUser(client, user_id); + throw [error.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; + permissions.ensureAdminPermUser(client, user_id); user_doc = g_db.u.document(user_id); } else { user_id = client._id; user_doc = client; } - console.log( - "updating tokens for", - user_id, - "acc:", - req.queryParams.access, - "exp:", - req.queryParams.expires_in, - ); var obj = { access: req.queryParams.access, refresh: req.queryParams.refresh, @@ -650,7 +935,6 @@ router ...obj, }; - console.log("writing to edge ", token_doc); const token_doc_upsert = g_db.globus_token.insert(token_doc, { overwriteMode: "replace", // TODO: perhaps use 'update' and specify values for true upsert. }); @@ -664,9 +948,32 @@ router break; } } + const tokenTypeName = Object.keys(g_lib.AccessTokenType).find( + (key) => g_lib.AccessTokenType[key] === token_type, + ); + + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/set", + status: "Success", + description: "Setting user token", + extra: `${tokenTypeName} (${token_type})`, + }); }, }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/set", + status: "Failure", + description: "Setting user tokens", + extra: "undefined", + error: e, + }); g_lib.handleException(e, res); } }) @@ -698,17 +1005,16 @@ router router .get("/token/get", function (req, res) { + let user = null; try { const collection_token = UserToken.validateRequestParams(req.queryParams); // TODO: collection type determines logic when mapped vs HA const { collection_id, collection_type } = req.queryParams; - var user; - if (req.queryParams.subject) { if (!g_db.u.exists(req.queryParams.subject)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "No such user '" + req.queryParams.subject + "'", ]; @@ -719,6 +1025,15 @@ router user = g_lib.getUserFromClientID(req.queryParams.client); } + logger.logRequestStarted({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get", + status: "Started", + description: "Getting user token", + }); + const user_token = new UserToken({ user_id: user._id, globus_collection_id: collection_id, @@ -736,7 +1051,25 @@ router ); res.send(result); + logger.logRequestSuccess({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get", + status: "Success", + description: "Getting user token", + }); } catch (e) { + logger.logRequestFailure({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get", + status: "Failure", + description: "Getting user tokens", + extra: "undefined", + error: e, + }); g_lib.handleException(e, res); } }) @@ -757,13 +1090,12 @@ router router .get("/token/get/access", function (req, res) { + let user = null; try { - var user; - if (req.queryParams.subject) { if (!g_db.u.exists(req.queryParams.subject)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "No such user '" + req.queryParams.subject + "'", ]; user = g_db.u.document({ @@ -772,11 +1104,39 @@ router } else { user = g_lib.getUserFromClientID(req.queryParams.client); } + logger.logRequestStarted({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get/access", + status: "Started", + description: "Getting User Access Token", + }); - if (!user.access) throw [g_lib.ERR_NOT_FOUND, "No access token found"]; + if (!user.access) throw [error.ERR_NOT_FOUND, "No access token found"]; res.send(user.access); + logger.logRequestSuccess({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get/access", + status: "Success", + description: "Getting User Access Token", + extra: "undefined", + }); } catch (e) { + logger.logRequestFailure({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get/access", + status: "Failure", + description: "Getting User Access Token", + extra: "undefined", + error: e, + }); + g_lib.handleException(e, res); } }) @@ -787,17 +1147,45 @@ router router .get("/token/get/expiring", function (req, res) { + let user = null; + let result = null; try { - //console.log("exp:",(Date.now()/1000) + req.queryParams.expires_in); + logger.logRequestStarted({ + client: user?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get/expiring", + status: "Started", + description: "Getting expiring user access token", + }); - var results = g_db._query( + results = g_db._query( "for i in u filter i.expiration != Null && i.expiration < @exp return {id:i._id,access:i.access,refresh:i.refresh,expiration:i.expiration}", { exp: Math.floor(Date.now() / 1000) + req.queryParams.expires_in, }, ); res.send(results); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get/expiring", + status: "Success", + description: "Getting expiring user access token", + extra: results, + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/token/get/expiring", + status: "Failure", + description: "Getting expiring user access token", + extra: result, + error: e, + }); g_lib.handleException(e, res); } }) @@ -808,8 +1196,17 @@ router router .get("/view", function (req, res) { + let client = null; try { - var client = g_lib.getUserFromClientID_noexcept(req.queryParams.client); + client = g_lib.getUserFromClientID_noexcept(req.queryParams.client); + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/view", + status: "Started", + description: "View User Information", + }); var user, det_ok = false; @@ -817,7 +1214,7 @@ router if (req.queryParams.subject) { if (!g_db.u.exists(req.queryParams.subject)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "No such user '" + req.queryParams.subject + "'", ]; user = g_db.u.document({ @@ -890,8 +1287,27 @@ router delete user.refresh; res.send([user]); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/view", + status: "Success", + description: "View User Information", + extra: `uid=${user.uid}, is_admin=${!!client?.is_admin}`, + }); //req.queryParams.details ? } catch (e) { g_lib.handleException(e, res); + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/view", + status: "Failure", + description: "View User Information", + extra: `uid=${user.uid}, is_admin=${!!client?.is_admin}`, + error: e, + }); } }) .queryParam("client", joi.string().required(), "Client ID") @@ -902,8 +1318,17 @@ router router .get("/list/all", function (req, res) { + let client = null; var qry = "for i in u sort i.name_last, i.name_first"; var result; + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/list/all", + status: "Started", + description: "List all users", + }); if (req.queryParams.offset != undefined && req.queryParams.count != undefined) { qry += @@ -935,6 +1360,15 @@ router } res.send(result); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/list/all", + status: "Success", + description: "List all users", + extra: result, + }); }) .queryParam("offset", joi.number().optional(), "Offset") .queryParam("count", joi.number().optional(), "Count") @@ -945,6 +1379,15 @@ router .get("/list/collab", function (req, res) { var result, client = g_lib.getUserFromClientID(req.queryParams.client); + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/list/collab", + status: "Started", + description: "List collaborators of client", + }); + var qry = "for x in union_distinct((for v in 2..2 any @user owner, member, acl filter is_same_collection('u',v) return" + " distinct { uid: v._id, name_last: v.name_last, name_first: v.name_first }),(for v in 3..3 inbound @user member, outbound owner, outbound admin" + @@ -985,6 +1428,16 @@ router } res.send(result); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/list/collab", + status: "Success", + description: "List collaborators of client", + extra: result, + }); + //res.send( g_db._query( "for x in union_distinct((for v in 2..2 any @user owner, member, acl filter is_same_collection('u',v) return distinct { uid: v._id, name: v.name }),(for v in 3..3 inbound @user member, outbound owner, outbound admin filter is_same_collection('u',v) return distinct { uid: v._id, name: v.name }),(for v in 2..2 inbound @user owner, outbound admin filter is_same_collection('u',v) return distinct { uid: v._id, name: v.name })) return x", { user: client._id })); }) .queryParam("client", joi.string().required(), "Client ID") @@ -999,6 +1452,8 @@ Note: must delete ALL data records and projects owned by the user being deleted */ router .get("/delete", function (req, res) { + let client = null; + let user_id = null; try { g_db._executeTransaction({ collections: { @@ -1024,18 +1479,24 @@ router ], }, action: function () { - const client = g_lib.getUserFromClientID(req.queryParams.client); - var user_id; + client = g_lib.getUserFromClientID(req.queryParams.client); + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/delete", + status: "Started", + description: "Remove existing user entry", + }); if (req.queryParams.subject) { user_id = req.queryParams.subject; if (!g_db.u.exists(user_id)) - throw [g_lib.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; - g_lib.ensureAdminPermUser(client, user_id); + throw [error.ERR_INVALID_PARAM, "No such user '" + user_id + "'"]; + permissions.ensureAdminPermUser(client, user_id); } else { user_id = client._id; } - //console.log( "delete user", user_id ); var objects, subobjects, obj, subobj, i, j; @@ -1047,7 +1508,6 @@ router .toArray(); for (i in objects) { obj = objects[i]; - //console.log( "del ident", obj ); g_graph[obj.substr(0, obj.indexOf("/"))].remove(obj); } @@ -1062,7 +1522,6 @@ router .toArray(); for (i in objects) { obj = objects[i]; - //console.log( "del proj", obj ); subobjects = g_db ._query("for v in 1..1 inbound @proj owner return v._id", { proj: obj, @@ -1070,7 +1529,6 @@ router .toArray(); for (j in subobjects) { subobj = subobjects[j]; - //console.log("del subobj",subobj); g_graph[subobj.substr(0, subobj.indexOf("/"))].remove(subobj); } @@ -1085,14 +1543,32 @@ router .toArray(); for (i in objects) { obj = objects[i]; - //console.log( "del owned", obj ); g_graph[obj.substr(0, obj.indexOf("/"))].remove(obj); } g_graph.u.remove(user_id); }, }); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/delete", + status: "Success", + description: "Remove existing user entry", + extra: user_id, + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/delete", + status: "Failure", + description: "Remove existing user entry", + extra: user_id, + error: e, + }); g_lib.handleException(e, res); } }) @@ -1103,30 +1579,64 @@ router router .get("/ident/list", function (req, res) { + let client = null; try { - var client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/list", + status: "Started", + description: "List user linked IDs", + }); if (req.queryParams.subject) { if (!g_db.u.exists(req.queryParams.subject)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "No such user '" + req.queryParams.subject + "'", ]; const subject = g_db.u.document(req.queryParams.subject); - g_lib.ensureAdminPermUser(client, subject._id); + permissions.ensureAdminPermUser(client, subject._id); res.send( g_db._query("for v in 1..1 outbound @client ident return v._key", { client: subject._id, }), ); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/list", + status: "Success", + description: "List user linked IDs", + }); } else { res.send( g_db._query("for v in 1..1 outbound @client ident return v._key", { client: client._id, }), ); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/list", + status: "Success", + description: "List user linked IDs", + }); } } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/list", + status: "Failure", + description: "List user linked IDs", + error: e, + }); g_lib.handleException(e, res); } }) @@ -1136,6 +1646,7 @@ router router .get("/ident/add", function (req, res) { + let client = null; try { g_db._executeTransaction({ collections: { @@ -1143,8 +1654,16 @@ router write: ["uuid", "accn", "ident"], }, action: function () { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); var id; + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/add", + status: "Started", + description: "Add new linked identity", + }); if (g_lib.isUUID(req.queryParams.ident)) { if ( @@ -1152,7 +1671,17 @@ router _id: "uuid/" + req.queryParams.ident, }) ) - return; + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/add", + status: "Success", + description: "Add new linked identity", + extra: req.queryParams.ident, + }); + + return; id = g_db.uuid.save( { _key: req.queryParams.ident, @@ -1179,6 +1708,15 @@ router }, ); } + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/add", + status: "Success", + description: "Add new linked identity", + extra: req.queryParams.ident, + }); return; } else { var accn = { @@ -1194,19 +1732,19 @@ router } } else throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid identity value: " + req.queryParams.ident, ]; if (req.queryParams.subject) { if (!g_db.u.exists(req.queryParams.subject)) throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "No such user '" + req.queryParams.subject + "'", ]; const user = g_db.u.document(req.queryParams.subject); - g_lib.ensureAdminPermUser(client, user._id); + permissions.ensureAdminPermUser(client, user._id); g_db.ident.save({ _from: user._id, @@ -1220,7 +1758,26 @@ router } }, }); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/add", + status: "Success", + description: "Add new linked identity", + extra: req.queryParams.ident, + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/add", + status: "Failure", + description: "Add new linked identity", + extra: req.queryParams.ident, + error: e, + }); g_lib.handleException(e, res); } }) @@ -1236,6 +1793,7 @@ router router .get("/ident/remove", function (req, res) { + let client = null; try { g_db._executeTransaction({ collections: { @@ -1243,10 +1801,17 @@ router write: ["uuid", "accn", "ident"], }, action: function () { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); const owner = g_lib.getUserFromClientID(req.queryParams.ident); - - g_lib.ensureAdminPermUser(client, owner._id); + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/remove", + status: "Started", + description: "Remove linked identity from user account", + }); + permissions.ensureAdminPermUser(client, owner._id); if (g_lib.isUUID(req.queryParams.ident)) { g_graph.uuid.remove("uuid/" + req.queryParams.ident); @@ -1254,12 +1819,31 @@ router g_graph.accn.remove("accn/" + req.queryParams.ident); } else throw [ - g_lib.ERR_INVALID_PARAM, + error.ERR_INVALID_PARAM, "Invalid identity value: " + req.queryParams.ident, ]; }, }); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/remove", + status: "Success", + description: "Remove linked identity from user account", + extra: req.queryParams.ident, + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ident/remove", + status: "Failure", + description: "Remove linked identity from user account", + extra: req.queryParams.ident, + error: e, + }); g_lib.handleException(e, res); } }) @@ -1270,10 +1854,39 @@ router router .get("/ep/get", function (req, res) { + let client = null; try { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ep/get", + status: "Started", + description: "Get recent end-points", + }); + res.send(client.eps ? client.eps : []); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ep/get", + status: "Success", + description: "Get recent end-points", + extra: client.eps, + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ep/get", + status: "Failure", + description: "Get recent end-points", + extra: client.eps, + error: e, + }); g_lib.handleException(e, res); } }) @@ -1283,8 +1896,17 @@ router router .get("/ep/set", function (req, res) { + let client = null; try { - const client = g_lib.getUserFromClientID(req.queryParams.client); + client = g_lib.getUserFromClientID(req.queryParams.client); + logger.logRequestStarted({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ep/set", + status: "Started", + description: "Set recent end-points", + }); g_db._update( client._id, { @@ -1294,7 +1916,26 @@ router keepNull: false, }, ); + logger.logRequestSuccess({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ep/set", + status: "Started", + description: "Set recent end-points", + extra: client.eps, + }); } catch (e) { + logger.logRequestFailure({ + client: client?._id, + correlationId: req.headers["x-correlation-id"], + httpVerb: "GET", + routePath: basePath + "/ep/set", + status: "Failure", + description: "Set recent end-points", + extra: client.eps, + error: e, + }); g_lib.handleException(e, res); } }) diff --git a/core/database/foxx/tests/authz.test.js b/core/database/foxx/tests/authz.test.js index d9976a2c9..7b6ff062c 100644 --- a/core/database/foxx/tests/authz.test.js +++ b/core/database/foxx/tests/authz.test.js @@ -3,7 +3,7 @@ const chai = require("chai"); const expect = chai.expect; const authzModule = require("../api/authz"); const g_db = require("@arangodb").db; -const g_lib = require("../api/support"); +const permissions = require("../api/lib/permissions"); const arangodb = require("@arangodb"); describe("Authz functions", () => { @@ -49,7 +49,7 @@ describe("Authz functions", () => { _to: owner_id, }); - let req_perm = g_lib.PERM_CREATE; + let req_perm = permissions.PERM_CREATE; expect(authzModule.isRecordActionAuthorized(client, data_key, req_perm)).to.be.true; }); @@ -74,7 +74,7 @@ describe("Authz functions", () => { g_db.u.save(client); - let req_perm = g_lib.PERM_CREATE; + let req_perm = permissions.PERM_CREATE; expect(() => authzModule.isRecordActionAuthorized(client, data_key, req_perm), @@ -106,7 +106,7 @@ describe("Authz functions", () => { _to: "u/george", }); - let req_perm = g_lib.PERM_CREATE; + let req_perm = permissions.PERM_CREATE; expect(authzModule.isRecordActionAuthorized(client, data_key, req_perm)).to.be.true; }); @@ -156,7 +156,7 @@ describe("Authz functions", () => { _from: project_id, _to: bob_id, }); - let req_perm = g_lib.PERM_CREATE; + let req_perm = permissions.PERM_CREATE; expect(authzModule.isRecordActionAuthorized(bob, data_key, req_perm)).to.be.true; }); @@ -198,7 +198,7 @@ describe("Authz functions", () => { }, { waitForSync: true }, ); - let req_perm = g_lib.PERM_CREATE; + let req_perm = permissions.PERM_CREATE; expect(authzModule.isRecordActionAuthorized(bob, data_key, req_perm)).to.be.false; }); @@ -287,7 +287,7 @@ describe("Authz functions", () => { }, { waitForSync: true }, ); - let req_perm = g_lib.PERM_CREATE; + let req_perm = permissions.PERM_CREATE; // Non-project admin should not have permission expect(authzModule.isRecordActionAuthorized(mandy, data_key, req_perm)).to.be.false; @@ -353,7 +353,7 @@ describe("Authz functions", () => { g_db.u.save(tim, { waitForSync: true }); - let req_perm = g_lib.PERM_READ; + let req_perm = permissions.PERM_READ; expect(authzModule.isRecordActionAuthorized(tim, data_key, req_perm)).to.be.false; }); diff --git a/core/database/foxx/tests/authz_router.test.js b/core/database/foxx/tests/authz_router.test.js index 53ec97d26..134abfaef 100644 --- a/core/database/foxx/tests/authz_router.test.js +++ b/core/database/foxx/tests/authz_router.test.js @@ -6,7 +6,7 @@ const request = require("@arangodb/request"); const { baseUrl } = module.context; const g_db = require("@arangodb").db; const g_lib = require("../api/support"); - +const permissions = require("../api/lib/permissions"); // Constants used throughout test file // The base URL for the authz foxx route const authz_base_url = `${baseUrl}/authz`; @@ -167,8 +167,8 @@ function defaultWorkingSetupProject() { g_db.acl.save({ _from: root._id, _to: mem_grp._id, - grant: g_lib.PERM_MEMBER, - inhgrant: g_lib.PERM_MEMBER, + grant: permissions.PERM_MEMBER, + inhgrant: permissions.PERM_MEMBER, }); g_db.loc.save({ diff --git a/core/database/foxx/tests/base_repository.test.js b/core/database/foxx/tests/base_repository.test.js new file mode 100644 index 000000000..64532889f --- /dev/null +++ b/core/database/foxx/tests/base_repository.test.js @@ -0,0 +1,101 @@ +"use strict"; + +const { expect } = require("chai"); +const { BaseRepository } = require("../api/models/repositories/base_repository"); +const g_db = require("@arangodb").db; +const error = require("../api/lib/error_codes"); +const permissions = require("../api/lib/permissions"); + +class TestRepo extends BaseRepository { + constructor(config) { + return super(config, {}); + } +} + +describe("unit_base_repository: Base Repository tests", function () { + beforeEach(() => { + const collections = ["repo", "admin", "u"]; + collections.forEach((name) => { + let col = g_db._collection(name); + if (col) { + col.truncate(); // truncate after ensuring collection exists + } else { + g_db._create(name); // create if it doesn’t exist + } + }); + }); + + // The pub key is a test key + function getValidRepoData() { + return { + id: "repo/123", + key: "123", + title: "THE Repository", + capacity: 0, + desc: "A large description about the repository.", + }; + } + function getValidRawRepoData() { + return { + _id: "repo/123", + _key: "123", + title: "THE Repository", + capacity: 0, + desc: "A large description about the repository.", + }; + } + function getValidRepoDataNoIdKey() { + return { + title: "THE Repository", + capacity: 0, + desc: "A large description about the repository.", + }; + } + + it("should save a repository successfully", function () { + const repoConfig = getValidRepoDataNoIdKey(); + const result = new TestRepo(repoConfig); + const repo = result.value; + const save_result = repo.save(); + + expect(save_result.ok).to.equal(true); + const savedRepo = save_result.value; + console.log("Saved repo"); + console.log(savedRepo); + expect(savedRepo).to.have.property("_key"); + + // verify it exists in DB + expect(savedRepo.title).to.equal("THE Repository"); + }); + + it("should update a repository successfully", function () { + const repoConfig = getValidRepoDataNoIdKey(); + const result = new TestRepo(repoConfig); + const repo = result.value; + repo.save(); + + const update_result = result.value.update({ title: "Updated Repo" }); + expect(update_result.ok).to.equal(true); + const updated = update_result.value; + + expect(updated.title).to.equal("Updated Repo"); + }); + + it("should return Result.err when updating non-existent repo", function () { + const result = new TestRepo(getValidRepoDataNoIdKey()); + + const update_result = result.value.update({ title: "Should Fail" }); + console.log("Update result is"); + console.log(update_result); + expect(update_result.ok).to.be.false; + expect(update_result.error.message).to.match( + /Failed to update repository, repository document was not found \(repo\/undefined\)/, + ); + }); + + it("should return error for unimplemented validate()", function () { + const validate_result = TestRepo.validate({}); + expect(validate_result.ok).to.be.false; + expect(validate_result.error.code).to.equal(error.ERR_INVALID_OPERATION); + }); +}); diff --git a/core/database/foxx/tests/record.test.js b/core/database/foxx/tests/record.test.js index ef88ee9c8..ed0c4fbcb 100644 --- a/core/database/foxx/tests/record.test.js +++ b/core/database/foxx/tests/record.test.js @@ -5,6 +5,7 @@ const expect = chai.expect; const Record = require("../api/record"); const g_db = require("@arangodb").db; const g_lib = require("../api/support"); +const error = require("../api/lib/error_codes"); const arangodb = require("@arangodb"); function recordRepoAndUserSetup(record_key, user_id, repo_data) { @@ -36,7 +37,7 @@ describe("Record Class", () => { const record = new Record("invalidKey"); expect(record.exists()).to.be.false; expect(record.key()).to.equal("invalidKey"); - expect(record.error()).to.equal(g_lib.ERR_NOT_FOUND); + expect(record.error()).to.equal(error.ERR_NOT_FOUND); expect(record.errorMessage()).to.equal("Invalid key: (invalidKey). No record found."); }); @@ -83,7 +84,7 @@ describe("Record Class", () => { expect(record.isManaged()).to.be.false; expect(record.exists()).to.be.true; expect(record.key()).to.equal(valid_key); - expect(record.error()).to.equal(g_lib.ERR_PERM_DENIED); + expect(record.error()).to.equal(error.ERR_PERM_DENIED); const pattern = /^Permission denied data is not managed by DataFed/; expect(record.errorMessage()).to.match(pattern); }); @@ -195,7 +196,7 @@ describe("Record Class", () => { const record = new Record(valid_key); expect(record.isPathConsistent("/incorrect/file/path/" + valid_key)).to.be.false; - expect(record.error()).to.equal(g_lib.ERR_PERM_DENIED); + expect(record.error()).to.equal(error.ERR_PERM_DENIED); const pattern = /^Record path is not consistent/; expect(record.errorMessage()).to.match(pattern); }); @@ -311,7 +312,7 @@ describe("Record Class", () => { const record = new Record(valid_key); expect(record.isPathConsistent("/incorrect/file/path/user/sherry/" + valid_key)).to.be .false; - expect(record.error()).to.equal(g_lib.ERR_PERM_DENIED); + expect(record.error()).to.equal(error.ERR_PERM_DENIED); const pattern = /^Record path is not consistent/; expect(record.errorMessage()).to.match(pattern); }); diff --git a/core/database/foxx/tests/repo.test.js b/core/database/foxx/tests/repo.test.js index 017f3aaa3..60057efa8 100644 --- a/core/database/foxx/tests/repo.test.js +++ b/core/database/foxx/tests/repo.test.js @@ -5,9 +5,10 @@ const { expect } = chai; const { Repo, PathType } = require("../api/repo"); const g_db = require("@arangodb").db; const g_lib = require("../api/support"); +const error = require("../api/lib/error_codes"); const arangodb = require("@arangodb"); -describe("Testing Repo class", () => { +describe("unit_repo: Testing Repo class", () => { beforeEach(() => { g_db.d.truncate(); g_db.alloc.truncate(); @@ -19,7 +20,7 @@ describe("Testing Repo class", () => { const repo = new Repo("invalidKey"); expect(repo.exists()).to.be.false; expect(repo.key()).to.equal("invalidKey"); - expect(repo.error()).to.equal(g_lib.ERR_NOT_FOUND); + expect(repo.error()).to.equal(error.ERR_NOT_FOUND); }); it("unit_repo: should return REPO_ROOT_PATH for exact match with repo root", () => { diff --git a/core/database/foxx/tests/repo_globus.test.js b/core/database/foxx/tests/repo_globus.test.js new file mode 100644 index 000000000..7487dcea2 --- /dev/null +++ b/core/database/foxx/tests/repo_globus.test.js @@ -0,0 +1,498 @@ +"use strict"; + +const { expect } = require("chai"); +const { Result } = require("../api/models/repositories/types"); +const { ExecutionMethod } = require("../api/lib/execution_types"); +const { GlobusRepo } = require("../api/models/repositories/repository/globus"); +const g_tasks = require("../api/tasks"); +const error = require("../api/lib/error_codes"); +const g_lib = require("../api/support"); +const g_db = require("@arangodb").db; + +describe("unit_repository_globus: Globus Repository Operations", function () { + beforeEach(function () { + const collections = [ + "d", + "block", + "alloc", + "loc", + "lock", + "repo", + "admin", + "task", + "g", + "p", + "u", + ]; + collections.forEach((name) => { + let col = g_db._collection(name); + if (col) { + col.truncate(); // truncate after ensuring collection exists + } else { + g_db._create(name); // create if it doesn’t exist + } + }); + }); + + // The pub key is a test key + function getValidRawRepoData() { + return { + _id: "repo/123", + _key: "123", + title: "Test Globus Repository", + capacity: 5000000000, + pub_key: "{Yys%Fr7VBct5AilOs$SnW%k$Qm[DBwvGeS0MQ46", + address: "burning-fast-repo.org", + endpoint: "8b7f1c4e-3d4a-4d6a-9a76-9e4b3e95b7b8", + domain: "fire", + path: "/one/repo/to/rule/them/all/123", + }; + } + + function getValidRepoData() { + return { + id: "repo/123", + key: "123", + title: "Test Globus Repository", + capacity: 5000000000, + pub_key: "{Yys%Fr7VBct5AilOs$SnW%k$Qm[DBwvGeS0MQ46", + address: "burning-fast-repo.org", + endpoint: "8b7f1c4e-3d4a-4d6a-9a76-9e4b3e95b7b8", + domain: "fire", + path: "/one/repo/to/rule/them/all/123", + }; + } + + function getRawAllocationCreateTask() { + return { + _id: "task/43", + _key: "43", + status: 0, + msg: "Running", + client: "u456", + type: g_lib.TT_ALLOC_CREATE, + }; + } + + function getRawDataPutTask() { + return { + _id: "task/43", + _key: "43", + status: 0, + msg: "Running", + client: "u456", + type: g_lib.TT_DATA_PUT, + }; + } + + function getRawBlockingAllocationLock() { + return { + _id: "lock/31", + _key: "31", + _from: "task/43", + _to: "repo/123", + level: 1, + context: "u/456", + }; + } + + function getValidRepoData() { + return { + id: "repo/123", + key: "123", + title: "Test Globus Repository", + capacity: 5000000000, + pub_key: "{Yys%Fr7VBct5AilOs$SnW%k$Qm[DBwvGeS0MQ46", + address: "burning-fast-repo.org", + endpoint: "8b7f1c4e-3d4a-4d6a-9a76-9e4b3e95b7b8", + domain: "fire", + path: "/one/repo/to/rule/them/all/123", + }; + } + + function getValidRawUserData() { + return { + _id: "u/456", + _key: "456", + name: "Bobby", + }; + } + + function getValidRawAllocationData() { + return { + _id: "alloc/989", + _key: "989", + _from: "u/456", + _to: "repo/123", + subject: "u/456", + data_limit: 1000000000, + rec_limit: 1000000, + }; + } + + function getValidAllocationParams() { + return { + client: { + _id: "u/456", + is_admin: false, + }, + subject: "u/456", + data_limit: 1000000000, + rec_limit: 1000000, + }; + } + + describe("unit_repository_globus: validate", function () { + it("unit_repository_globus: should always return ok for valid repository data", function () { + const result = GlobusRepo.validate(getValidRepoData()); + expect(result.ok).to.be.true; + expect(result.value).to.be.true; + }); + + it("unit_repository_globus: should return ok even for incomplete repository data", function () { + const repoData = { _id: "repo/123" }; + const result = GlobusRepo.validate(repoData); + expect(result.ok).to.be.true; + }); + + it("unit_repository_globus: should return ok for null repository data", function () { + const result = GlobusRepo.validate(null); + expect(result.ok).to.be.false; + }); + }); + + describe("unit_repository_globus: createAllocation", function () { + it("unit_repository_globus: should fail to create allocation without admin role", function () { + const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + const repoRawData = getValidRawRepoData(); + g_db.repo.save(repoRawData); + g_db.u.save(getValidRawUserData()); + + const globus_repo = new GlobusRepo(repoData).value; + const result = globus_repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.message).to.include( + "Client, 'u/456', does not have administrative repository permissions on repo/123", + ); + }); + + it("unit_repository_globus: should fail to create allocation if a duplicate task is found", function () { + const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + const repoRawData = getValidRawRepoData(); + g_db.repo.save(repoRawData); + g_db.u.save(getValidRawUserData()); + g_db.admin.save({ + _from: repoRawData._id, + _to: params.client._id, + }); + g_db.task.save(getRawAllocationCreateTask()); + g_db.lock.save(getRawBlockingAllocationLock()); + const globus_repo = new GlobusRepo(repoData).value; + const result = globus_repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.message).to.include( + "A duplicate allocation create task was found: task/43", + ); + }); + + it("unit_repository_globus: should be blocked by previous Data put task", function () { + const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + const repoRawData = getValidRawRepoData(); + g_db.repo.save(repoRawData); + g_db.u.save(getValidRawUserData()); + g_db.admin.save({ + _from: repoRawData._id, + _to: params.client._id, + }); + g_db.task.save(getRawDataPutTask()); + g_db.lock.save(getRawBlockingAllocationLock()); + const globus_repo = new GlobusRepo(repoData).value; + const result = globus_repo.createAllocation(params); + + expect(result.ok).to.be.true; + expect(result.value).to.have.property("id"); + expect(result.value).to.have.property("repo_id", repoData.id); + expect(result.value).to.have.property("subject", params.subject); + expect(result.value).to.have.property("task_id"); + expect(result.value).to.have.property("status", g_lib.TS_BLOCKED); + expect(result.value).to.have.property("state"); + expect(result.value).to.have.property("queue_time"); + }); + + it("unit_repository_globus: should create allocation with valid parameters", function () { + const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + const repoRawData = getValidRawRepoData(); + g_db.repo.save(repoRawData); + g_db.u.save(getValidRawUserData()); + + g_db.admin.save({ + _from: repoRawData._id, + _to: params.client._id, + }); + + const globus_repo = new GlobusRepo(repoData).value; + const result = globus_repo.createAllocation(params); + + expect(result.ok).to.be.true; + expect(result.value).to.have.property("id"); + expect(result.value).to.have.property("repo_id", repoData.id); + expect(result.value).to.have.property("subject", params.subject); + expect(result.value).to.have.property("task_id"); + expect(result.value).to.have.property("status", g_lib.TS_READY); + expect(result.value).to.have.property("state"); + expect(result.value).to.have.property("queue_time"); + }); + + it("unit_repository_globus: missing rec_limit should throw.", function () { + const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + delete params.rec_limit; + const repoRawData = getValidRawRepoData(); + g_db.repo.save(repoRawData); + g_db.u.save(getValidRawUserData()); + + g_db.admin.save({ + _from: repoRawData._id, + _to: params.client._id, + }); + + const globus_repo = new GlobusRepo(repoData).value; + const result = globus_repo.createAllocation(params); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("Allocation rec_limit must be a number"); + }); + + it("unit_repository_globus: should reject allocation with missing subject", function () { + const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + delete params.subject; + const repoRawData = getValidRawRepoData(); + g_db.repo.save(repoRawData); + g_db.u.save(getValidRawUserData()); + + g_db.admin.save({ + _from: repoRawData._id, + _to: params.client._id, + }); + + const globus_repo = new GlobusRepo(repoData).value; + const result = globus_repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.message).to.include("Allocation subject is required"); + }); + }); + + describe("unit_repository_globus: deleteAllocation", function () { + it("unit_repository_globus: should delete allocation with valid subject ID", function () { + const repoData = getValidRepoData(); + const repoRawData = getValidRawRepoData(); + const userRawData = getValidRawUserData(); + g_db.repo.save(repoRawData); + g_db.u.save(userRawData); + + g_db.admin.save({ + _from: repoRawData._id, + _to: userRawData._id, + }); + g_db.alloc.save(getValidRawAllocationData()); + + const globus_repo = new GlobusRepo(repoData).value; + + const result = globus_repo.deleteAllocation( + { _id: userRawData._id, is_admin: false }, + userRawData._id, + ); + + expect(result.ok).to.be.true; + expect(result.value).to.have.property("execution_method", ExecutionMethod.DEFERRED); + expect(result.value.task).to.have.property("_id"); + expect(result.value.task).to.have.property("msg", "Pending"); + expect(result.value.task).to.have.property("type", g_lib.TT_ALLOC_DEL); + expect(result.value.task).to.have.property("ct"); + expect(result.value.task).to.have.property("ut"); + expect(result.value.task).to.have.property("status", g_lib.TS_READY); + expect(result.value.task).to.have.property("step", 0); + expect(result.value.task).to.have.property("steps", 2); + }); + + it("unit_repository_globus: should delete allocation with valid system level admin permissions.", function () { + const repoData = getValidRepoData(); + const repoRawData = getValidRawRepoData(); + const userRawData = getValidRawUserData(); + g_db.repo.save(repoRawData); + g_db.u.save(userRawData); + + g_db.alloc.save(getValidRawAllocationData()); + + const globus_repo = new GlobusRepo(repoData).value; + + const result = globus_repo.deleteAllocation( + { _id: userRawData._id, is_admin: true }, + userRawData._id, + ); + + expect(result.ok).to.be.true; + expect(result.value).to.have.property("execution_method", ExecutionMethod.DEFERRED); + expect(result.value.task).to.have.property("_id"); + expect(result.value.task).to.have.property("msg", "Pending"); + expect(result.value.task).to.have.property("type", g_lib.TT_ALLOC_DEL); + expect(result.value.task).to.have.property("ct"); + expect(result.value.task).to.have.property("ut"); + expect(result.value.task).to.have.property("status", g_lib.TS_READY); + expect(result.value.task).to.have.property("step", 0); + expect(result.value.task).to.have.property("steps", 2); + }); + + it("unit_repository_globus: should reject deletion with null subject ID", function () { + const repoData = getValidRepoData(); + const repoRawData = getValidRawRepoData(); + const userRawData = getValidRawUserData(); + g_db.repo.save(repoRawData); + g_db.u.save(userRawData); + + g_db.admin.save({ + _from: repoRawData._id, + _to: userRawData._id, + }); + g_db.alloc.save(getValidRawAllocationData()); + + const globus_repo = new GlobusRepo(repoData).value; + + const result = globus_repo.deleteAllocation( + { _id: userRawData._id, is_admin: false }, + null, + ); + + expect(result.ok).to.be.false; + + expect(result.error.message).to.include( + "Subject ID is required for allocation deletion", + ); + }); + + it("unit_repository_globus: should reject deletion if client does not have permissions", function () { + const repoData = getValidRepoData(); + const repoRawData = getValidRawRepoData(); + const userRawData = getValidRawUserData(); + g_db.repo.save(repoRawData); + g_db.u.save(userRawData); + + g_db.alloc.save(getValidRawAllocationData()); + + const globus_repo = new GlobusRepo(repoData).value; + + const result = globus_repo.deleteAllocation( + { _id: userRawData._id, is_admin: false }, + userRawData._id, + ); + + expect(result.ok).to.be.false; + expect(result.error.message).to.include( + "Failed to create allocation task: Client, 'u/456', does not have administrative repository permissions on repo/123", + ); + }); + + it("unit_repository_globus: should reject allocation deletion when allocation does not exist", function () { + const repoData = getValidRepoData(); + const repoRawData = getValidRawRepoData(); + const userRawData = getValidRawUserData(); + g_db.repo.save(repoRawData); + g_db.u.save(userRawData); + + g_db.admin.save({ + _from: repoRawData._id, + _to: userRawData._id, + }); + + const globus_repo = new GlobusRepo(repoData).value; + + const result = globus_repo.deleteAllocation( + { _id: userRawData._id, is_admin: false }, + userRawData._id, + ); + + expect(result.ok).to.be.false; + expect(result.error.message).to.include( + "Failed to create allocation task: Subject, \'u/456\', has no allocation on repo/123", + ); + }); + + it("unit_repository_globus: should reject duplicate allocation deletion.", function () { + const repoData = getValidRepoData(); + const repoRawData = getValidRawRepoData(); + const userRawData = getValidRawUserData(); + g_db.repo.save(repoRawData); + g_db.u.save(userRawData); + + g_db.alloc.save(getValidRawAllocationData()); + g_db.admin.save({ + _from: repoRawData._id, + _to: userRawData._id, + }); + + const globus_repo = new GlobusRepo(repoData).value; + + globus_repo.deleteAllocation( + { _id: userRawData._id, is_admin: false }, + userRawData._id, + ); + const result = globus_repo.deleteAllocation( + { _id: userRawData._id, is_admin: false }, + userRawData._id, + ); + + expect(result.ok).to.be.false; + expect(result.error.message).to.include( + "Failed to create allocation task: A duplicate allocation delete task was found: task/", + ); + }); + }); + + describe("unit_repository_globus: supportsDataOperations", function () { + it("unit_repository_globus: should always return true for Globus repositories", function () { + const repoData = getValidRepoData(); + const { id, key, ...repo_without_key } = repoData; + const globus_repo_result = new GlobusRepo(repo_without_key); + expect(globus_repo_result.ok).to.be.true; + const globus_repo = globus_repo_result.value; + const result = globus_repo.supportsDataOperations(); + expect(result.ok).to.be.true; + expect(result.value).to.be.true; + }); + + it("unit_repository_globus: should return true even for incomplete repository data", function () { + const repoData = {}; + + const globus_repo = new GlobusRepo(repoData).value; + const result = globus_repo.supportsDataOperations(); + expect(result.ok).to.be.true; + expect(result.value).to.be.true; + }); + }); + + describe("unit_repository_globus: getCapacityInfo", function () { + it("unit_repository_globus: should return capacity information for repository", function () { + const repoData = getValidRepoData(); + const globus_repo = new GlobusRepo(repoData).value; + const capacity = globus_repo.capacity(); + expect(capacity).to.equal(5000000000); + }); + + it("unit_repository_globus: should handle repository without capacity field", function () { + const repoData = { + _id: "repo/123", + title: "Test Repository", + }; + const globus_repo = new GlobusRepo(repoData).value; + const capacity = globus_repo.capacity(); + expect(capacity).to.equal(undefined); + }); + }); +}); diff --git a/core/database/foxx/tests/repo_metadata.test.js b/core/database/foxx/tests/repo_metadata.test.js new file mode 100644 index 000000000..dc6393a55 --- /dev/null +++ b/core/database/foxx/tests/repo_metadata.test.js @@ -0,0 +1,651 @@ +"use strict"; + +const { expect } = require("chai"); +const { Result } = require("../api/models/repositories/types"); +const { ExecutionMethod } = require("../api/lib/execution_types"); +const { MetadataRepo } = require("../api/models/repositories/repository/metadata"); +const g_tasks = require("../api/tasks"); +const g_db = require("@arangodb").db; +const error = require("../api/lib/error_codes"); +const permissions = require("../api/lib/permissions"); + +describe("unit_repository_metadata: Metadata Only Repository Operations", function () { + beforeEach(() => { + const collections = ["repo", "d", "alloc", "loc", "repo", "admin", "g", "p", "u"]; + collections.forEach((name) => { + let col = g_db._collection(name); + if (col) { + col.truncate(); // truncate after ensuring collection exists + } else { + g_db._create(name); // create if it doesn’t exist + } + }); + }); + + // The pub key is a test key + function getValidRepoData() { + return { + id: "repo/123", + key: "123", + title: "Test Metadata Repository", + capacity: 0, + }; + } + + function getValidRepoDataNoIDKEY() { + return { + title: "Test Metadata Repository", + capacity: 0, + }; + } + + function getValidRawRepoData() { + return { + _id: "repo/123", + _key: "123", + title: "Test Metadata Repository", + capacity: 0, + }; + } + + function getValidUserData() { + return { + _id: "u/456", + _key: "456", + name: "Bobby", + }; + } + + function getValidGroupData() { + return { + _id: "g/789", + _key: "789", + name: "Biker Bandits", + }; + } + + function getValidProjectData() { + return { + _id: "p/999", + _key: "999", + title: "The Golden Peach", + }; + } + + function getValidAllocationParams() { + return { + client: { + _id: "u/456", + is_admin: false, + }, + subject: "u/456", + rec_limit: 10000, + data_limit: 0, + }; + } + + describe("constructor and validation", function () { + it("should create MetadataRepo successfully with valid config", function () { + g_db.u.save(getValidUserData()); + const repoRawConfig = getValidRawRepoData(); + g_db.repo.save(repoRawConfig); + + const repoConfig = getValidRepoData(); + const result = new MetadataRepo(repoConfig); + expect(result.ok).to.be.true; + expect(result.value.type()).to.equal("metadata"); + }); + + it("should fail if capacity is not 0", function () { + const config = { ...getValidRepoData(), capacity: 10 }; + const repo = new MetadataRepo(config); + expect(repo.ok).to.be.false; + expect(repo.error.code).to.equal(error.ERR_INVALID_PARAM); + }); + + it("should fail if invalid fields exist", function () { + const config = { ...getValidRepoData(), pub_key: "something" }; + const repo = new MetadataRepo(config); + expect(repo.ok).to.be.false; + expect(repo.error.message).to.include("Metadata-only repositories should not have"); + }); + }); + + describe("unit_repository_metadata: Validation failures", function () { + it("unit_repository_metadata: should fail when subject is missing", function () { + const params = getValidAllocationParams(); + delete params.subject; + + const rawRepoData = getValidRawRepoData(); + // Repo exists but subject doesn't + g_db.repo.save(rawRepoData); + + const repo = new MetadataRepo(getValidRepoData()).value; + const result = repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(result.error.message).to.include("Allocation subject"); + }); + + it("unit_repository_metadata: should fail when subject is empty string", function () { + const params = getValidAllocationParams(); + params.subject = ""; + + const rawRepoData = getValidRawRepoData(); + // Repo exists but subject doesn't + g_db.repo.save(rawRepoData); + const repo = new MetadataRepo(getValidRepoData()).value; + const result = repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(result.error.message).to.include("Allocation subject"); + }); + + it("unit_repository_metadata: should fail when data_limit is not a number", function () { + const params = getValidAllocationParams(); + params.data_limit = "not-a-number"; + + const rawRepoData = getValidRawRepoData(); + // Repo exists but subject doesn't + g_db.repo.save(rawRepoData); + const repo = new MetadataRepo(getValidRepoData()).value; + const result = repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(result.error.message).to.include("data_limit must be a number"); + }); + + it("unit_repository_metadata: should fail when rec_limit is not a number", function () { + const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + params.rec_limit = "invalid"; + + const rawRepoData = getValidRawRepoData(); + // Repo exists but subject doesn't + g_db.repo.save(rawRepoData); + const repo = new MetadataRepo(getValidRepoData()).value; + const result = repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.code).to.equal(error.ERR_INVALID_PARAM); + }); + + it("unit_repository_metadata: should fail when path is provided but not a string", function () { + const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + params.path = 123; + + const rawRepoData = getValidRawRepoData(); + // Repo exists but subject doesn't + g_db.repo.save(rawRepoData); + const repo = new MetadataRepo(getValidRepoData()).value; + const result = repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(result.error.message).to.include("path must be a string"); + }); + }); + + describe("unit_repository_metadata: validate", function () { + it("unit_repository_metadata: should always return ok for valid repository data", function () { + const repoData = getValidRepoData(); + + const result = MetadataRepo.validate(repoData); + expect(result.ok).to.be.true; + expect(result.value).to.be.true; + }); + + it("unit_repository_metadata: should return false because of all of the incomplete repository data.", function () { + const repoData = { id: "repo/123" }; + const result = MetadataRepo.validate(repoData); + expect(result.ok).to.be.false; + expect(result.error.message).to.include( + "Metadata repository capacity must be 0: capacity=undefined", + ); + }); + + it("unit_repository_metadata: should return false for null repository data", function () { + const result = MetadataRepo.validate(null); + expect(result.ok).to.be.false; + }); + }); + + describe("unit_repository_metadata: createAllocation", function () { + it("unit_repository_metadata: should fail to create allocation with non existent repo.", function () { + const params = getValidAllocationParams(); + + const repo = new MetadataRepo(getValidRepoDataNoIDKEY()).value; + const result = repo.createAllocation(params); + + expect(result.ok).to.be.false; + expect(result.error.message).to.include( + "Failed to create metadata allocation: Repo, \'repo/undefined\', does not exist", + ); + }); + + it("unit_repository_metadata: should create allocation with valid parameters", function () { + const repoRawData = getValidRawRepoData(); + const userData = getValidUserData(); + const params = getValidAllocationParams(); + + g_db.repo.save(repoRawData); + g_db.u.save(userData); + g_db.admin.save({ + _from: repoRawData._id, + _to: params.client._id, + }); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.true; + expect(rv.value.result).to.have.property("id"); + expect(rv.value.result).to.have.property("repo_id", repoRawData._id); + expect(rv.value.result).to.have.property("subject", params.subject); + expect(rv.value.result).to.have.property("rec_limit", params.rec_limit); + }); + }); + describe("unit_repository_metadata: Repository and subject existence checks", function () { + it("should fail when repository does not exist", function () { + //const repoData = getValidRepoData(); + const params = getValidAllocationParams(); + + // Subject exists but repo doesn't + g_db.u.save(getValidUserData()); + + const repo = new MetadataRepo(getValidRepoDataNoIDKEY()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_NOT_FOUND); + expect(rv.error.message).to.equal( + "Failed to create metadata allocation: Repo, \'repo/undefined\', does not exist.", + ); + }); + + it("should fail when subject does not exist", function () { + const repoData = getValidRawRepoData(); + const params = getValidAllocationParams(); + + // Repo exists but subject doesn't + g_db.repo.save(repoData); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_NOT_FOUND); + expect(rv.error.message).to.equal( + "Failed to create metadata allocation: Subject, 'u/456', does not exist.", + ); + }); + + it("should work with different subject types (user, group, project)", function () { + const repoData = getValidRawRepoData(); + g_db.repo.save(repoData); + + // Test with group subject + const groupData = getValidGroupData(); + g_db.g.save(groupData); + + const paramsWithGroup = { + client: { + _id: "u/456", + is_admin: true, + }, + subject: groupData._id, + rec_limit: 5000, + data_limit: 0, + }; + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(paramsWithGroup); + + expect(rv.ok).to.be.true; + expect(rv.value.result.subject).to.equal(groupData._id); + }); + }); + + describe("unit_repository_metadata: Permission checks", function () { + it("should fail when client lacks admin permissions", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + const params = getValidAllocationParams(); + + g_db.repo.save(repoData); + g_db.u.save(userData); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + console.log("RV is"); + console.log(rv); + expect(rv.error.code).to.equal(error.ERR_PERM_DENIED); + expect(rv.error.message).to.include( + "Allocation creation failed - Client, \'u/456\', does not have administrative repository permissions on repo/123", + ); + }); + + it("should succeed when client has admin permissions", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + const params = getValidAllocationParams(); + + g_db.repo.save(repoData); + g_db.u.save(userData); + g_db.admin.save({ + _from: repoData._id, + _to: params.client._id, + }); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.true; + }); + }); + + describe("unit_repository_metadata: Duplicate allocation checks", function () { + it("should fail when allocation already exists for subject-repo pair", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + const params = getValidAllocationParams(); + + g_db.repo.save(repoData); + g_db.u.save(userData); + g_db.admin.save({ + _from: repoData._id, + _to: params.client._id, + }); + + // Create existing allocation + g_db.alloc.save({ + _from: params.subject, + _to: repoData._id, + data_limit: 1000, + rec_limit: 500, + }); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(rv.error.message).to.include("already has an allocation"); + }); + + it("should allow allocation for same subject on different repo", function () { + const repoData1 = getValidRawRepoData(); + const repoData2 = { + _id: "repo/999", + _key: "999", + title: "Another Repository", + capacity: 0, + }; + + const userData = getValidUserData(); + const params = getValidAllocationParams(); + + // Setup both repos and user + g_db.repo.save(repoData1); + g_db.repo.save(repoData2); + g_db.u.save(userData); + + // Admin permissions for both repos + g_db.admin.save({ + _from: repoData1._id, + _to: params.client._id, + }); + g_db.admin.save({ + _from: repoData2._id, + _to: params.client._id, + }); + + // Create allocation on second repo + g_db.alloc.save({ + _from: params.subject, + _to: repoData2._id, + data_limit: 1000, + rec_limit: 500, + }); + + // Try to create allocation on first repo - should succeed + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.true; + expect(rv.value.result.repo_id).to.equal(repoData1._id); + }); + }); + + describe("unit_repository_metadata: Successful allocation creation", function () { + it("should create allocation with all required fields", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + const params = getValidAllocationParams(); + + g_db.repo.save(repoData); + g_db.u.save(userData); + g_db.admin.save({ + _from: repoData._id, + _to: params.client._id, + }); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.true; + expect(rv.value.execution_method).to.equal(ExecutionMethod.DIRECT); + expect(rv.value.result).to.have.all.keys(["id", "repo_id", "subject", "rec_limit"]); + expect(rv.value.result.repo_id).to.equal(repoData._id); + expect(rv.value.result.subject).to.equal(params.subject); + expect(rv.value.result.rec_limit).to.equal(params.rec_limit); + + // Verify allocation was saved in database + const savedAlloc = g_db.alloc.firstExample({ + _from: params.subject, + _to: repoData._id, + }); + + expect(savedAlloc).to.exist; + expect(savedAlloc.data_limit).to.equal(params.data_limit); + expect(savedAlloc.rec_limit).to.equal(params.rec_limit); + expect(savedAlloc.rec_count).to.equal(0); + expect(savedAlloc.data_size).to.equal(0); + expect(savedAlloc.path).to.equal("/"); + expect(savedAlloc.type).to.equal("metadata"); + }); + + it("should handle custom path parameter", function () { + // const repoData = getValidRepoData(); + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + const params = getValidAllocationParams(); + params.path = "/custom/path"; + + g_db.repo.save(repoData); + g_db.u.save(userData); + g_db.admin.save({ + _from: repoData._id, + _to: params.client._id, + }); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.true; + + // Note: The current implementation doesn't use the custom path, + // it always sets path to "/". This test documents current behavior. + const savedAlloc = g_db.alloc.firstExample({ + _from: params.subject, + _to: repoData._id, + }); + expect(savedAlloc.path).to.equal("/"); + }); + + it("should handle different rec_limit values", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + const params = getValidAllocationParams(); + params.rec_limit = 99999; + + g_db.repo.save(repoData); + g_db.u.save(userData); + g_db.admin.save({ + _from: repoData._id, + _to: params.client._id, + }); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.createAllocation(params); + + expect(rv.ok).to.be.true; + expect(rv.value.result.rec_limit).to.equal(99999); + }); + }); + + describe("unit_repository_metadata: Parameter validation", function () { + it("should reject null subject", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.repo.save(repoData); + g_db.u.save(userData); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.deleteAllocation(userData, null); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(rv.error.message).to.equal("Subject ID is required for allocation deletion"); + }); + + it("should reject undefined subject", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.repo.save(repoData); + g_db.u.save(userData); + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.deleteAllocation(userData, undefined); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(rv.error.message).to.equal("Subject ID is required for allocation deletion"); + }); + + it("should reject empty string subject", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.repo.save(repoData); + g_db.u.save(userData); + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.deleteAllocation(userData, ""); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(rv.error.message).to.equal("Subject ID is required for allocation deletion"); + }); + + it("should reject non-string subject", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.repo.save(repoData); + g_db.u.save(userData); + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.deleteAllocation(userData, 123); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(rv.error.message).to.equal("Subject ID is required for allocation deletion"); + }); + + it("should reject object as subject", function () { + const rawRepoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.repo.save(rawRepoData); + g_db.u.save(userData); + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.deleteAllocation(userData, { id: "u/user" }); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(rv.error.message).to.equal("Subject ID is required for allocation deletion"); + }); + }); + + describe("unit_repository_metadata: Repository existence checks", function () { + it("should fail when repository does not exist", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.u.save(userData); + + const repo = new MetadataRepo(getValidRepoDataNoIDKEY()).value; + const rv = repo.deleteAllocation(userData, userData._id); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_NOT_FOUND); + expect(rv.error.message).to.include("Failed to delete metadata allocation: Repo"); + expect(rv.error.message).to.include("does not exist"); + }); + + it("should fail when subject does not exist", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.u.save(userData); + g_db.repo.save(repoData); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.deleteAllocation(userData, "u/ghost"); + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_NOT_FOUND); + expect(rv.error.message).to.include("Failed to delete metadata allocation: Subject"); + expect(rv.error.message).to.include("u/ghost"); + expect(rv.error.message).to.include("does not exist"); + }); + }); + + describe("unit_repository_metadata: Allocation existence checks", function () { + it("should fail when allocation does not exist", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.u.save(userData); + g_db.repo.save(repoData); + g_db.admin.save({ + _from: repoData._id, + _to: userData._id, + }); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.deleteAllocation(userData, userData._id); + + expect(rv.ok).to.be.false; + expect(rv.error.code).to.equal(error.ERR_NOT_FOUND); + expect(rv.error.message).to.include("Failed to delete metadata allocation: Subject"); + expect(rv.error.message).to.include(userData._id); + expect(rv.error.message).to.include("has no allocation on"); + expect(rv.error.message).to.include(repoData._id); + }); + + it("should proceed when allocation exists", function () { + const repoData = getValidRawRepoData(); + const userData = getValidUserData(); + g_db.u.save(userData); + g_db.repo.save(repoData); + const alloc = g_db.alloc.save({ + _from: userData._id, + _to: repoData._id, + }); + g_db.admin.save({ + _from: repoData._id, + _to: userData._id, + }); + + const repo = new MetadataRepo(getValidRepoData()).value; + const rv = repo.deleteAllocation(userData, userData._id); + expect(g_db._exists(alloc._id)).to.be.false; + }); + }); +}); diff --git a/core/database/foxx/tests/repo_router.test.js b/core/database/foxx/tests/repo_router.test.js new file mode 100644 index 000000000..72fecc3a0 --- /dev/null +++ b/core/database/foxx/tests/repo_router.test.js @@ -0,0 +1,256 @@ +"use strict"; + +// Integration test of API +const { expect } = require("chai"); +const request = require("@arangodb/request"); +const { baseUrl } = module.context; +const g_db = require("@arangodb").db; + +const repo_base_url = `${baseUrl}/repo`; + +// NOTE: describe block strings are compared against test specification during test call, not file name +describe("integration_repo_router: the Foxx microservice repo_router create endpoint", () => { + beforeEach(() => { + const collections = ["repo", "d", "alloc", "loc", "repo", "admin", "g", "p", "u"]; + collections.forEach((name) => { + let col = g_db._collection(name); + if (col) { + col.truncate(); // truncate after ensuring collection exists + } else { + g_db._create(name); // create if it doesn’t exist + } + }); + }); + + const user_params = { + id: "u/shredder", + key: "shredder", + is_admin: false, + }; + + const user_params_admin = { + id: "u/splinter", + key: "splinter", + is_admin: false, + }; + + const user_params_raw = { + _key: "shredder", + is_admin: false, + }; + + const user_params_raw_admin = { + _key: "splinter", + is_admin: true, + }; + + const minimal_repo = { + id: "heavymetal", + title: "Rock On!!!!", + capacity: 0, + admins: ["u/shredder"], + type: "metadata", + }; + + const minimal_repo_admin = { + id: "heavymetal", + title: "Rock On!!!!", + capacity: 0, + admins: ["u/splinter"], + type: "metadata", + }; + + // All keys are examples + const minimal_globus_repo_admin = { + id: "heavymetal", + title: "Rock On!!!!", + capacity: 10000000000, + admins: ["u/splinter"], + address: "tcp://music.com", + endpoint: "c9b1b56e-3bde-4f7d-a932-92f6c4f046b", + path: "/mnt/nfs/large/heavymetal", + pub_key: "Zm7W6W5vJjZZqFj7okjBOS8K9wVjHhYyLzX+zA8B", + }; + + it("should deny creating a metadata repo without admin perms", () => { + // arrange + const rv = g_db.u.save(user_params_raw, { returnNew: true }); + const client_id = encodeURIComponent(user_params.id); + const request_string = `${repo_base_url}/create?client=${client_id}`; + + // act + const response = request.post(request_string, { + body: JSON.stringify(minimal_repo), + headers: { "Content-Type": "application/json" }, + }); + + console.log(response); + // assert + expect(response.status).to.equal(400); + const json = JSON.parse(response.body); + expect(json.errorMessage).to.include("Permission Denied"); + }); + + it("should create a metadata repo when user has admin perms", () => { + // arrange + const rv = g_db.u.save(user_params_raw_admin, { returnNew: true }); + const request_string = `${repo_base_url}/create?client=${user_params_admin.id}`; + + // act + const response = request.post(request_string, { + body: JSON.stringify(minimal_repo_admin), + headers: { "Content-Type": "application/json" }, + }); + + console.log(response); + + // assert + expect(response.status).to.equal(200); + const json = JSON.parse(response.body); + + expect(json).to.be.an("array").with.lengthOf(1); + + // Object structure + expect(json[0]).to.have.all.keys("type", "title", "capacity", "id"); + + // Property values + expect(json[0]).to.have.property("type", "metadata"); + expect(json[0]).to.have.property("title", "Rock On!!!!"); + expect(json[0]).to.have.property("capacity", 0); + expect(json[0]).to.have.property("id", "repo/heavymetal"); + }); + + it("should fail when metadata repo is assigned a capacity greater than 0", () => { + // arrange + const rv = g_db.u.save(user_params_raw_admin, { returnNew: true }); + const request_string = `${repo_base_url}/create?client=${user_params_admin.id}`; + + let non_zero_capacity = JSON.parse(JSON.stringify(minimal_repo_admin)); + non_zero_capacity.capacity = 1; + // act + const response = request.post(request_string, { + body: JSON.stringify(non_zero_capacity), + headers: { "Content-Type": "application/json" }, + }); + + console.log(response); + // assert + expect(response.status).to.equal(400); + const json = JSON.parse(response.body); + + expect(json.errorMessage).to.include("Metadata repository capacity must be 0: capacity=1"); + }); + + it("should fail to create a repo when id is missing", () => { + // arrange + const rv = g_db.u.save(user_params_raw_admin, { returnNew: true }); + const request_string = `${repo_base_url}/create?client=${user_params_admin.id}`; + + let missing_id = JSON.parse(JSON.stringify(minimal_repo_admin)); + delete missing_id.id; + // act + const response = request.post(request_string, { + body: JSON.stringify(missing_id), + headers: { "Content-Type": "application/json" }, + }); + + console.log(response); + // assert + expect(response.status).to.equal(400); + const json = JSON.parse(response.body); + console.log(json); + expect(json.errorMessage).to.include('child "id" fails because ["id" is required]'); + }); + + it("should fail to create a repo when title is missing", () => { + // arrange + const rv = g_db.u.save(user_params_raw_admin, { returnNew: true }); + const request_string = `${repo_base_url}/create?client=${user_params_admin.id}`; + + let missing_title = JSON.parse(JSON.stringify(minimal_repo_admin)); + delete missing_title.title; + // act + const response = request.post(request_string, { + body: JSON.stringify(missing_title), + headers: { "Content-Type": "application/json" }, + }); + + console.log(response); + + // assert + expect(response.status).to.equal(400); + + const json = JSON.parse(response.body); + expect(json.errorMessage).to.include('child "title" fails because ["title" is required]'); + }); + + it("should fail to create a repo when capacity is missing", () => { + // arrange + const rv = g_db.u.save(user_params_raw_admin, { returnNew: true }); + console.log(rv); + const request_string = `${repo_base_url}/create?client=${user_params_admin.id}`; + + let missing_capacity = JSON.parse(JSON.stringify(minimal_repo_admin)); + delete missing_capacity.capacity; + // act + const response = request.post(request_string, { + body: JSON.stringify(missing_capacity), + headers: { "Content-Type": "application/json" }, + }); + + console.log(response); + // assert + expect(response.status).to.equal(400); + + const json = JSON.parse(response.body); + console.log(json); + expect(json.errorMessage).to.include( + 'child "capacity" fails because ["capacity" is required]', + ); + }); + + it("should create a globus repo when user has admin perms", () => { + // arrange + const rv = g_db.u.save(user_params_raw_admin, { returnNew: true }); + console.log(rv); + const request_string = `${repo_base_url}/create?client=${user_params_admin.id}`; + + // act + const response = request.post(request_string, { + body: JSON.stringify(minimal_globus_repo_admin), + headers: { "Content-Type": "application/json" }, + }); + + console.log(response); + // assert + expect(response.status).to.equal(200); + const json = JSON.parse(response.body); + + console.log(json); + expect(json).to.be.an("array").with.lengthOf(1); + + // Object structure + expect(json[0]).to.have.all.keys( + "type", + "title", + "capacity", + "id", + "address", + "endpoint", + "path", + "pub_key", + ); + + // Property values + expect(json[0]).to.have.property("type", "globus"); + expect(json[0]).to.have.property("title", "Rock On!!!!"); + expect(json[0]).to.have.property("capacity", 10000000000); + expect(json[0]).to.have.property("id", "repo/heavymetal"); + expect(json[0]).to.have.property("address", "tcp://music.com"); + expect(json[0]).to.have.property("endpoint", "c9b1b56e-3bde-4f7d-a932-92f6c4f046b"); + + // path should end with '/' + expect(json[0]).to.have.property("path", "/mnt/nfs/large/heavymetal/"); + expect(json[0]).to.have.property("pub_key", "Zm7W6W5vJjZZqFj7okjBOS8K9wVjHhYyLzX+zA8B"); + }); +}); diff --git a/core/database/foxx/tests/repositories.test.js b/core/database/foxx/tests/repositories.test.js new file mode 100644 index 000000000..d89040344 --- /dev/null +++ b/core/database/foxx/tests/repositories.test.js @@ -0,0 +1,114 @@ +"use strict"; + +const { expect } = require("chai"); +const { Repositories } = require("../api/models/repositories/repositories"); // adjust path if needed +const { RepositoryType, Result } = require("../api/models/repositories/types"); +const error = require("../api/lib/error_codes"); +const g_db = require("@arangodb").db; + +// Mock imports if needed (adjust to your actual repo) +const { createRepository } = require("../api/models/repositories/types"); +const { GlobusRepo } = require("../api/models/repositories/repository/globus"); +const { MetadataRepo } = require("../api/models/repositories/repository/metadata"); + +describe("integration_repositories: Repository Factory and Operations", function () { + const repositories = new Repositories(); + + beforeEach(() => { + const collections = ["repo", "d", "alloc", "loc", "admin", "g", "p", "u"]; + collections.forEach((name) => { + let col = g_db._collection(name); + if (col) { + col.truncate(); + } else { + g_db._create(name); + } + }); + }); + + function getValidGlobusConfig() { + return { + id: "repo/123", + type: RepositoryType.GLOBUS, + title: "Globus Repo", + desc: "Valid globus repo", + capacity: 1000, + endpoint: "XXXXYYYY-XXXX-YYYY-XXXX-YYYYXXXXYYYY", + path: "/data/123", + pub_key: "ABC123", + address: "tcp://localhost:5555", + exp_path: "/export", + }; + } + + function getValidGlobusConfigNoIdKey() { + return { + type: RepositoryType.GLOBUS, + title: "Globus Repo", + desc: "Valid globus repo", + capacity: 1000, + endpoint: "XXXXYYYY-XXXX-YYYY-XXXX-YYYYXXXXYYYY", + path: "/data/123", + pub_key: "ABC123", + address: "tcp://localhost:5555", + exp_path: "/export", + }; + } + + function getValidMetadataConfig() { + return { + id: "repo/456", + type: RepositoryType.METADATA, + title: "Metadata Repo", + desc: "Valid metadata repo", + capacity: 0, + }; + } + + function getValidMetadataConfigNoIdKey() { + return { + type: RepositoryType.METADATA, + title: "Metadata Repo", + desc: "Valid metadata repo", + capacity: 0, + }; + } + + describe("integration_repositories: createRepositoryByType()", function () { + it("should create a valid GLOBUS repository", function () { + const result = Repositories.createRepositoryByType(getValidGlobusConfigNoIdKey()); + console.log("result is"); + console.log(result); + expect(result.ok).to.be.true; + expect(result.value).to.exist; + expect(result.value.type()).to.equal("globus"); + }); + + it("should create a valid METADATA repository", function () { + const result = Repositories.createRepositoryByType(getValidMetadataConfigNoIdKey()); + expect(result.ok).to.be.true; + expect(result.value).to.exist; + expect(result.value.type()).to.equal("metadata"); + }); + + it("should fail if required fields are missing", function () { + const invalid = { type: RepositoryType.GLOBUS }; + const result = Repositories.createRepositoryByType(invalid); + expect(result.ok).to.be.false; + expect(result.error.code).to.equal(error.ERR_INVALID_PARAM); + expect(result.error.message).to.include("Missing required repository fields"); + }); + + it("should fail for unknown repository type", function () { + const invalid = { + id: "repo/999", + type: "UNKNOWN_TYPE", + title: "Invalid Repo", + capacity: 1000, + }; + const result = Repositories.createRepositoryByType(invalid); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("Unknown repository type"); + }); + }); +}); diff --git a/core/database/foxx/tests/validation.test.js b/core/database/foxx/tests/validation.test.js new file mode 100644 index 000000000..b3d487d40 --- /dev/null +++ b/core/database/foxx/tests/validation.test.js @@ -0,0 +1,111 @@ +"use strict"; + +const { expect } = require("chai"); +const { Result } = require("../api/models/repositories/types"); +const { + validateNonEmptyString, + validateCommonFields, + validatePOSIXPath, + validateRepositoryPath, +} = require("../api/models/repositories/validation"); + +describe("unit_validation_repository: Repository Validation Tests", function () { + describe("unit_validation_repository: validateNonEmptyString", function () { + it("should accept valid non-empty strings", function () { + const result = validateNonEmptyString("valid string", "Test field"); + expect(result.ok).to.be.true; + }); + + it("should reject null values", function () { + const result = validateNonEmptyString(null, "Test field"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("Test field is required"); + }); + + it("should reject empty strings", function () { + const result = validateNonEmptyString("", "Test field"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("Test field is required"); + }); + + it("should reject whitespace-only strings", function () { + const result = validateNonEmptyString(" ", "Test field"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("Test field is required"); + }); + + it("should reject non-string values", function () { + const result = validateNonEmptyString(123, "Test field"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("Test field is required"); + }); + }); + + describe("unit_validation_repository: validateCommonFields", function () { + it("should accept valid common fields", function () { + const config = { + id: "test-repo", + title: "Test Repository", + capacity: 1000000, + admins: ["user1", "user2"], + }; + const result = validateCommonFields(config); + expect(result.ok).to.be.true; + }); + }); + + describe("unit_validation_repository: validatePOSIXPath", function () { + it("should accept valid absolute paths", function () { + const result = validatePOSIXPath("/valid/path", "Test path"); + expect(result.ok).to.be.true; + }); + + it("should reject relative paths", function () { + const result = validatePOSIXPath("relative/path", "Test path"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("must be an absolute path"); + }); + + it("should reject paths with ..", function () { + const result = validatePOSIXPath("/path/../other", "Test path"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("contains invalid path sequences"); + }); + + it("should reject paths with //", function () { + const result = validatePOSIXPath("/path//other", "Test path"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("contains invalid path sequences"); + }); + + it("should reject empty paths", function () { + const result = validatePOSIXPath("", "Test path"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("must be a non-empty string"); + }); + }); + + describe("unit_validation_repository: validateRepositoryPath", function () { + it("should accept path ending with repo ID", function () { + const result = validateRepositoryPath("/data/repos/test-repo", "test-repo"); + expect(result.ok).to.be.true; + }); + + it("should accept path ending with repo ID and trailing slash", function () { + const result = validateRepositoryPath("/data/repos/test-repo/", "test-repo"); + expect(result.ok).to.be.true; + }); + + it("should reject path not ending with repo ID", function () { + const result = validateRepositoryPath("/data/repos/other-name", "test-repo"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("must end with repository ID (test-repo)"); + }); + + it("should inherit POSIX path validation", function () { + const result = validateRepositoryPath("relative/path/test-repo", "test-repo"); + expect(result.ok).to.be.false; + expect(result.error.message).to.include("must be an absolute path"); + }); + }); +}); diff --git a/core/database/tests/test_fixture_setup.sh b/core/database/tests/test_fixture_setup.sh index 4d14656b8..1f54992f2 100755 --- a/core/database/tests/test_fixture_setup.sh +++ b/core/database/tests/test_fixture_setup.sh @@ -1,17 +1,15 @@ #!/bin/bash - set -uef -o pipefail SCRIPT=$(realpath "$BASH_SOURCE[0]") SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath "${SOURCE}/../../../") -source "${PROJECT_ROOT}/config/datafed.sh" -source "${PROJECT_ROOT}/scripts/dependency_versions.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" +DATAFED_PROJECT_ROOT=$(realpath "${SOURCE}/../../../") +source "${DATAFED_PROJECT_ROOT}/config/datafed.sh" +source "${DATAFED_PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_versions.sh" +source "${DATAFED_PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_install_functions.sh" -Help() -{ +Help() { echo "$(basename $0) Will initialize fixtures for Foxx tests" echo echo "Syntax: $(basename $0) [-h|u|p|y]" @@ -31,74 +29,72 @@ Help() local_DATABASE_NAME="sdms" local_DATABASE_USER="root" -if [ -z "${DATAFED_DATABASE_HOST:-}" ] -then +if [ -z "${DATAFED_DATABASE_HOST:-}" ]; then local_DATAFED_DATABASE_HOST="localhost" else local_DATAFED_DATABASE_HOST=$(printenv DATAFED_DATABASE_HOST) fi -if [ -z "${DATAFED_DATABASE_PASSWORD:-}" ] -then +if [ -z "${DATAFED_DATABASE_PASSWORD:-}" ]; then local_DATAFED_DATABASE_PASSWORD="" else local_DATAFED_DATABASE_PASSWORD=$(printenv DATAFED_DATABASE_PASSWORD) fi -if [ -z "${FOXX_MAJOR_API_VERSION:-}" ] -then - local_FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs ) +if [ -z "${FOXX_MAJOR_API_VERSION:-}" ]; then + local_FOXX_MAJOR_API_VERSION=$(cat ${DATAFED_PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs) else local_FOXX_MAJOR_API_VERSION=$(printenv FOXX_MAJOR_API_VERSION) fi VALID_ARGS=$(getopt -o hu:p:f: --long 'help',database-user:,database-password:,foxx-api-major-version: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do echo "$1" case "$1" in - -h | --help) - Help - exit 0 - ;; - -u | --database-user) - echo "Processing 'Database user' option. Input argument is '$2'" - local_DATABASE_USER=$2 - shift 2 - ;; - -p | --database-password) - echo "Processing 'Database password' option. Input argument is '$2'" - local_DATAFED_DATABASE_PASSWORD=$2 - shift 2 - ;; - -f | --foxx-api-major-version) - echo "Processing 'Foxx major api version' option. Input argument is '$2'" - local_FOXX_MAJOR_API_VERSION=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -u | --database-user) + echo "Processing 'Database user' option. Input argument is '$2'" + local_DATABASE_USER=$2 + shift 2 + ;; + -p | --database-password) + echo "Processing 'Database password' option. Input argument is '$2'" + local_DATAFED_DATABASE_PASSWORD=$2 + shift 2 + ;; + -f | --foxx-api-major-version) + echo "Processing 'Foxx major api version' option. Input argument is '$2'" + local_FOXX_MAJOR_API_VERSION=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; + esac done ERROR_DETECTED=0 -if [ -z "$local_DATAFED_DATABASE_PASSWORD" ] -then +if [ -z "$local_DATAFED_DATABASE_PASSWORD" ]; then echo "Error DATAFED_DATABASE_PASSWORD is not defined, this is a required argument" echo " This variable can be set using the command line option -p, --database-password" echo " or with the environment variable DATAFED_DATABASE_PASSWORD." ERROR_DETECTED=1 fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi @@ -116,30 +112,30 @@ install_nvm install_node FOXX_PREFIX="" -if ! command -v foxx > /dev/null 2>&1; then - FOXX_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/" +if ! command -v foxx >/dev/null 2>&1; then + FOXX_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/" fi PATH_TO_PASSWD_FILE=${SOURCE}/database_temp.password # set up test user fixtures, this script should be idempotent, this script is described in the manifest "${FOXX_PREFIX}foxx" script -u "${local_DATABASE_USER}" \ - --server "tcp://${local_DATAFED_DATABASE_HOST}:8529" \ - -p "${PATH_TO_PASSWD_FILE}" \ - --database "${local_DATABASE_NAME}" \ - "/api/${local_FOXX_MAJOR_API_VERSION}" user-fixture + --server "tcp://${local_DATAFED_DATABASE_HOST}:8529" \ + -p "${PATH_TO_PASSWD_FILE}" \ + --database "${local_DATABASE_NAME}" \ + "/api/${local_FOXX_MAJOR_API_VERSION}" user-fixture # set up test globus collection fixtures, this script should be idempotent, this script is described in the manifest "${FOXX_PREFIX}foxx" script -u "${local_DATABASE_USER}" \ - --server "tcp://${local_DATAFED_DATABASE_HOST}:8529" \ - -p "${PATH_TO_PASSWD_FILE}" \ - --database "${local_DATABASE_NAME}" \ - "/api/${local_FOXX_MAJOR_API_VERSION}" collection-fixture + --server "tcp://${local_DATAFED_DATABASE_HOST}:8529" \ + -p "${PATH_TO_PASSWD_FILE}" \ + --database "${local_DATABASE_NAME}" \ + "/api/${local_FOXX_MAJOR_API_VERSION}" collection-fixture # set up test globus token fixtures, this script should be idempotent, this script is described in the manifest # order matters, must follow user and collection fixtures "${FOXX_PREFIX}foxx" script -u "${local_DATABASE_USER}" \ - --server "tcp://${local_DATAFED_DATABASE_HOST}:8529" \ - -p "${PATH_TO_PASSWD_FILE}" \ - --database "${local_DATABASE_NAME}" \ - "/api/${local_FOXX_MAJOR_API_VERSION}" globus-token-fixture \ No newline at end of file + --server "tcp://${local_DATAFED_DATABASE_HOST}:8529" \ + -p "${PATH_TO_PASSWD_FILE}" \ + --database "${local_DATABASE_NAME}" \ + "/api/${local_FOXX_MAJOR_API_VERSION}" globus-token-fixture diff --git a/core/database/tests/test_foxx.sh b/core/database/tests/test_foxx.sh index 35d52b72d..9d91b4318 100755 --- a/core/database/tests/test_foxx.sh +++ b/core/database/tests/test_foxx.sh @@ -12,13 +12,12 @@ set -euf -o pipefail SCRIPT=$(realpath "$BASH_SOURCE[0]") SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/../../../) -source ${PROJECT_ROOT}/config/datafed.sh -source "${PROJECT_ROOT}/scripts/dependency_versions.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" +DATAFED_PROJECT_ROOT=$(realpath ${SOURCE}/../../../) +source "${DATAFED_PROJECT_ROOT}/config/datafed.sh" +source "${DATAFED_PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_versions.sh" +source "${DATAFED_PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_install_functions.sh" -Help() -{ +Help() { echo "$(basename $0) Will run a Foxx unit test" echo echo "Syntax: $(basename $0) [-h|u|p|t]" @@ -40,16 +39,14 @@ Help() local_DATABASE_NAME="sdms" local_DATABASE_USER="root" -if [ -z "${DATAFED_DATABASE_PASSWORD:-}" ] -then +if [ -z "${DATAFED_DATABASE_PASSWORD:-}" ]; then local_DATAFED_DATABASE_PASSWORD="" else local_DATAFED_DATABASE_PASSWORD=$(printenv DATAFED_DATABASE_PASSWORD) fi -if [ -z "${FOXX_MAJOR_API_VERSION:-}" ] -then - local_FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs ) +if [ -z "${FOXX_MAJOR_API_VERSION:-}" ]; then + local_FOXX_MAJOR_API_VERSION=$(cat ${DATAFED_PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs) else local_FOXX_MAJOR_API_VERSION=$(printenv FOXX_MAJOR_API_VERSION) fi @@ -58,64 +55,64 @@ TEST_TO_RUN="all" VALID_ARGS=$(getopt -o hu:p:f:t: --long 'help',database-user:,database-password:,foxx-api-major-version:,test: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -u | --database-user) - echo "Processing 'Database user' option. Input argument is '$2'" - local_DATABASE_USER=$2 - shift 2 - ;; - -p | --database-password) - echo "Processing 'Database password' option. Input argument is '$2'" - local_DATAFED_DATABASE_PASSWORD=$2 - shift 2 - ;; - -f | --foxx-api-major-version) - echo "Processing 'Foxx major api version' option. Input argument is '$2'" - local_FOXX_MAJOR_API_VERSION=$2 - shift 2 - ;; - -t | --test) - echo "Processing 'test' option. Input argument is '$2'" - TEST_TO_RUN=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -u | --database-user) + echo "Processing 'Database user' option. Input argument is '$2'" + local_DATABASE_USER=$2 + shift 2 + ;; + -p | --database-password) + echo "Processing 'Database password' option. Input argument is '$2'" + local_DATAFED_DATABASE_PASSWORD=$2 + shift 2 + ;; + -f | --foxx-api-major-version) + echo "Processing 'Foxx major api version' option. Input argument is '$2'" + local_FOXX_MAJOR_API_VERSION=$2 + shift 2 + ;; + -t | --test) + echo "Processing 'test' option. Input argument is '$2'" + TEST_TO_RUN=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done ERROR_DETECTED=0 -if [ -z "$local_DATAFED_DATABASE_PASSWORD" ] -then +if [ -z "$local_DATAFED_DATABASE_PASSWORD" ]; then echo "Error DATAFED_DATABASE_PASSWORD is not defined, this is a required argument" echo " This variable can be set using the command line option -p, --database-password" echo " or with the environment variable DATAFED_DATABASE_PASSWORD." ERROR_DETECTED=1 fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi # There are apparently 3 different ways to deploy Foxx microservices, # Using curl with http requests -# Using the Arango web ui +# Using the Arango web ui # Using node module # -# The web deployment requires manual interaction, and I could not figure out the +# The web deployment requires manual interaction, and I could not figure out the # syntax for the REST http endpoints with curl so we are going to try the node module # Will only install if not already present @@ -123,24 +120,23 @@ install_nvm install_node FOXX_PREFIX="" -if ! command -v foxx > /dev/null 2>&1; then - FOXX_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/" +if ! command -v foxx >/dev/null 2>&1; then + FOXX_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/" fi PATH_TO_PASSWD_FILE=${SOURCE}/database_temp.password -if [ "$TEST_TO_RUN" == "all" ] -then - # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint +if [ "$TEST_TO_RUN" == "all" ]; then + # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint "${FOXX_PREFIX}foxx" test -u "${local_DATABASE_USER}" \ - --server "tcp://${DATAFED_DATABASE_HOST}:8529" \ + --server "tcp://${DATAFED_DATABASE_HOST}:8529" \ -p "${PATH_TO_PASSWD_FILE}" \ --database "${local_DATABASE_NAME}" \ "/api/${local_FOXX_MAJOR_API_VERSION}" --reporter spec else echo "Test: $TEST_TO_RUN" - # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint + # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint "${FOXX_PREFIX}foxx" test -u "${local_DATABASE_USER}" \ - --server "tcp://${DATAFED_DATABASE_HOST}:8529" \ + --server "tcp://${DATAFED_DATABASE_HOST}:8529" \ -p "${PATH_TO_PASSWD_FILE}" \ --database "${local_DATABASE_NAME}" \ "/api/${local_FOXX_MAJOR_API_VERSION}" "$TEST_TO_RUN" --reporter spec --verbose diff --git a/core/database/tests/test_setup.sh b/core/database/tests/test_setup.sh index 023edcfb4..93195eb04 100755 --- a/core/database/tests/test_setup.sh +++ b/core/database/tests/test_setup.sh @@ -13,13 +13,12 @@ set -uef -o pipefail SCRIPT=$(realpath "$BASH_SOURCE[0]") SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath "${SOURCE}/../../../") -source "${PROJECT_ROOT}/config/datafed.sh" -source "${PROJECT_ROOT}/scripts/dependency_versions.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" +DATAFED_PROJECT_ROOT=$(realpath "${SOURCE}/../../../") +source "${DATAFED_PROJECT_ROOT}/config/datafed.sh" +source "${DATAFED_PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_versions.sh" +source "${DATAFED_PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_install_functions.sh" -Help() -{ +Help() { echo "$(basename $0) Will set up a configuration file for the core server" echo echo "Syntax: $(basename $0) [-h|u|p|y]" @@ -40,94 +39,71 @@ Help() local_DATABASE_NAME="sdms" local_DATABASE_USER="root" -if [ -z "${DATAFED_DATABASE_HOST:-}" ] -then +if [ -z "${DATAFED_DATABASE_HOST:-}" ]; then local_DATAFED_DATABASE_HOST="localhost" else local_DATAFED_DATABASE_HOST=$(printenv DATAFED_DATABASE_HOST) fi -if [ -z "${DATAFED_DATABASE_PASSWORD:-}" ] -then +if [ -z "${DATAFED_DATABASE_PASSWORD:-}" ]; then local_DATAFED_DATABASE_PASSWORD="" else local_DATAFED_DATABASE_PASSWORD=$(printenv DATAFED_DATABASE_PASSWORD) fi -if [ -z "${DATAFED_ZEROMQ_SYSTEM_SECRET:-}" ] -then - local_DATAFED_ZEROMQ_SYSTEM_SECRET="" -else - local_DATAFED_ZEROMQ_SYSTEM_SECRET=$(printenv DATAFED_ZEROMQ_SYSTEM_SECRET) -fi - -if [ -z "${FOXX_MAJOR_API_VERSION:-}" ] -then - local_FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs ) +if [ -z "${FOXX_MAJOR_API_VERSION:-}" ]; then + local_FOXX_MAJOR_API_VERSION=$(cat ${DATAFED_PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs) else local_FOXX_MAJOR_API_VERSION=$(printenv FOXX_MAJOR_API_VERSION) fi VALID_ARGS=$(getopt -o hu:p:f: --long 'help',database-user:,database-password:,foxx-api-major-version: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do echo "$1" case "$1" in - -h | --help) - Help - exit 0 - ;; - -u | --database-user) - echo "Processing 'Database user' option. Input argument is '$2'" - local_DATABASE_USER=$2 - shift 2 - ;; - -p | --database-password) - echo "Processing 'Database password' option. Input argument is '$2'" - local_DATAFED_DATABASE_PASSWORD=$2 - shift 2 - ;; - -f | --foxx-api-major-version) - echo "Processing 'Foxx major api version' option. Input argument is '$2'" - local_FOXX_MAJOR_API_VERSION=$2 - shift 2 - ;; - -y | --zeromq-system-secret) - echo "Processing 'DataFed ZeroMQ system secret' option. Input argument is '$2'" - local_DATAFED_ZEROMQ_SYSTEM_SECRET=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -u | --database-user) + echo "Processing 'Database user' option. Input argument is '$2'" + local_DATABASE_USER=$2 + shift 2 + ;; + -p | --database-password) + echo "Processing 'Database password' option. Input argument is '$2'" + local_DATAFED_DATABASE_PASSWORD=$2 + shift 2 + ;; + -f | --foxx-api-major-version) + echo "Processing 'Foxx major api version' option. Input argument is '$2'" + local_FOXX_MAJOR_API_VERSION=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done ERROR_DETECTED=0 -if [ -z "$local_DATAFED_DATABASE_PASSWORD" ] -then +if [ -z "$local_DATAFED_DATABASE_PASSWORD" ]; then echo "Error DATAFED_DATABASE_PASSWORD is not defined, this is a required argument" echo " This variable can be set using the command line option -p, --database-password" echo " or with the environment variable DATAFED_DATABASE_PASSWORD." ERROR_DETECTED=1 fi -if [ -z "$local_DATAFED_ZEROMQ_SYSTEM_SECRET" ] -then - echo "Error DATAFED_ZEROMQ_SYSTEM_SECRET is not defined, this is a required argument" - echo " This variable can be set using the command line option -y, --zeromq-session-secret" - echo " or with the environment variable DATAFED_ZEROMQ_SYSTEM_SECRET." - ERROR_DETECTED=1 -fi - -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi @@ -136,19 +112,19 @@ fi output=$(curl --user $local_DATABASE_USER:$local_DATAFED_DATABASE_PASSWORD http://${local_DATAFED_DATABASE_HOST}:8529/_api/database/user) if [[ "$output" =~ .*"sdms".* ]]; then - echo "SDMS already exists do nothing" + echo "SDMS already exists do nothing" else - echo "Creating SDMS" - arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:8529" --server.password "${local_DATAFED_DATABASE_PASSWORD}" --server.username "${local_DATABASE_USER}" --javascript.execute "${PROJECT_ROOT}/core/database/foxx/db_create.js" + echo "Creating SDMS" + arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:8529" --server.password "${local_DATAFED_DATABASE_PASSWORD}" --server.username "${local_DATABASE_USER}" --javascript.execute "${DATAFED_PROJECT_ROOT}/core/database/foxx/db_create.js" # Give time for the database to be created sleep 2 - arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:8529" --server.password "${local_DATAFED_DATABASE_PASSWORD}" --server.username "${local_DATABASE_USER}" --javascript.execute-string 'db._useDatabase("sdms"); db.config.insert({"_key": "msg_daily", "msg" : "DataFed servers will be off-line for regular maintenance every Sunday night from 11:45 pm until 12:15 am EST Monday morning."}, {overwrite: true});' - arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:8529" --server.password "${local_DATAFED_DATABASE_PASSWORD}" --server.username "${local_DATABASE_USER}" --javascript.execute-string "db._useDatabase(\"sdms\"); db.config.insert({ \"_key\": \"system\", \"_id\": \"config/system\", \"secret\": \"${local_DATAFED_ZEROMQ_SYSTEM_SECRET}\"}, {overwrite: true } );" + arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:8529" --server.password "${local_DATAFED_DATABASE_PASSWORD}" --server.username "${local_DATABASE_USER}" --javascript.execute-string 'db._useDatabase("sdms"); db.config.insert({"_key": "msg_daily", "msg" : "DataFed servers will be off-line for regular maintenance every Sunday night from 11:45 pm until 12:15 am EST Monday morning."}, {overwrite: true});' + arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:8529" --server.password "${local_DATAFED_DATABASE_PASSWORD}" --server.username "${local_DATABASE_USER}" --javascript.execute-string "db._useDatabase(\"sdms\"); db.config.insert({ \"_key\": \"system\", \"_id\": \"config/system\"}, {overwrite: true } );" fi # There are apparently 3 different ways to deploy Foxx microservices, # Using curl with http requests -# Using the Arango web ui +# Using the Arango web ui # Using node module # # The web deployment requires manual interaction, and I could not figure out @@ -163,22 +139,20 @@ install_node $NVM_DIR/nvm-exec npm install --global foxx-cli FOXX_PREFIX="" -if ! command -v foxx > /dev/null 2>&1; then - FOXX_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/" +if ! command -v foxx >/dev/null 2>&1; then + FOXX_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/" fi PATH_TO_PASSWD_FILE=${SOURCE}/database_temp.password -echo "$local_DATAFED_DATABASE_PASSWORD" > "${PATH_TO_PASSWD_FILE}" +echo "$local_DATAFED_DATABASE_PASSWORD" >"${PATH_TO_PASSWD_FILE}" # Check if database foxx services have already been installed # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint -existing_services=$("${FOXX_PREFIX}foxx" list -a -u "$local_DATABASE_USER" -p "${PATH_TO_PASSWD_FILE}" --server "tcp://${local_DATAFED_DATABASE_HOST}:8529" --database "$local_DATABASE_NAME") +existing_services=$("${FOXX_PREFIX}foxx" list -a -u "$local_DATABASE_USER" -p "${PATH_TO_PASSWD_FILE}" --server "tcp://${local_DATAFED_DATABASE_HOST}:8529" --database "$local_DATABASE_NAME") echo "existing services ${existing_services}" -if [[ "$existing_services" =~ .*"DataFed".* ]] -then +if [[ "$existing_services" =~ .*"DataFed".* ]]; then echo "Running tests" else echo "Foxx services have not been installed cannot run tests!" exit 1 fi - diff --git a/core/database/tests/test_teardown.sh b/core/database/tests/test_teardown.sh index b7a1652a6..9ff83e0cc 100755 --- a/core/database/tests/test_teardown.sh +++ b/core/database/tests/test_teardown.sh @@ -12,8 +12,8 @@ set -euf -o pipefail SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath "${SOURCE}/../../../") -source "${PROJECT_ROOT}/config/datafed.sh" +DATAFED_PROJECT_ROOT=$(realpath "${SOURCE}/../../../") +source "${DATAFED_PROJECT_ROOT}/config/datafed.sh" PATH_TO_PASSWD_FILE="${SOURCE}/database_temp.password" rm "${PATH_TO_PASSWD_FILE}" diff --git a/core/docker/Dockerfile b/core/docker/Dockerfile index a9dfb8a6a..d88ad42cb 100644 --- a/core/docker/Dockerfile +++ b/core/docker/Dockerfile @@ -2,15 +2,16 @@ # cd ${PROJECT_ROOT} or cd DataFed # docker build -f core/docker/Dockerfile . -ARG BUILD_BASE="ubuntu:focal" -ARG DEPENDENCIES="dependencies" -ARG RUNTIME="runtime" -ARG DATAFED_DIR="/datafed" -ARG DATAFED_INSTALL_PATH="/opt/datafed" +ARG BUILD_BASE="debian:bookworm-slim" +ARG DEPENDENCIES="dependencies" +ARG RUNTIME="runtime" +ARG DATAFED_DIR="/datafed" +ARG DATAFED_INSTALL_PATH="/opt/datafed" ARG DATAFED_DEPENDENCIES_INSTALL_PATH="/opt/datafed/dependencies" -ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" -ARG BUILD_DIR="$DATAFED_DIR/source" -ARG LIB_DIR="/usr/local/lib" +ARG BUILD_DIR="$DATAFED_DIR/source" +ARG DATAFED_DEPENDENCIES_ROOT="$BUILD_DIR/external/DataFedDependencies" +ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" +ARG LIB_DIR="/usr/local/lib" FROM ${DEPENDENCIES} AS core-build @@ -20,6 +21,7 @@ ARG DATAFED_DIR ARG BUILD_DIR ARG DATAFED_INSTALL_PATH ARG DATAFED_DEPENDENCIES_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT ENV DATAFED_INSTALL_PATH="${DATAFED_INSTALL_PATH}" # For communicating with repo server @@ -27,9 +29,13 @@ EXPOSE 7512 # For listening to web server EXPOSE 7513 +RUN mkdir -p ${DATAFED_DEPENDENCIES_ROOT}/scripts/ && \ + mv ./scripts/dependency_versions.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/ && \ + mv ./scripts/generate_dependencies_config.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/ + +COPY ./common ${BUILD_DIR}/common COPY ./core/CMakeLists.txt ${BUILD_DIR}/core/CMakeLists.txt COPY ./CMakeLists.txt ${BUILD_DIR} -COPY ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ COPY ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/ COPY ./scripts/generate_core_config.sh ${BUILD_DIR}/scripts/ COPY ./scripts/install_core.sh ${BUILD_DIR}/scripts/ @@ -37,15 +43,16 @@ COPY ./cmake ${BUILD_DIR}/cmake COPY ./core/docker/entrypoint.sh ${BUILD_DIR}/core/docker/ COPY ./core/server ${BUILD_DIR}/core/server -RUN ${BUILD_DIR}/scripts/generate_datafed.sh && \ - ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake -S. -B build \ - -DBUILD_REPO_SERVER=False \ - -DBUILD_AUTHZ=False \ - -DBUILD_CORE_SERVER=True \ - -DBUILD_WEB_SERVER=False \ - -DBUILD_DOCS=False \ - -DBUILD_PYTHON_CLIENT=False \ - -DBUILD_FOXX=False +RUN ${DATAFED_DEPENDENCIES_ROOT}/scripts/generate_dependencies_config.sh && \ + ${BUILD_DIR}/scripts/generate_datafed.sh && \ + ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake -S. -B build \ + -DBUILD_REPO_SERVER=False \ + -DBUILD_AUTHZ=False \ + -DBUILD_CORE_SERVER=True \ + -DBUILD_WEB_SERVER=False \ + -DBUILD_DOCS=False \ + -DBUILD_PYTHON_CLIENT=False \ + -DBUILD_FOXX=False RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build -j 8 RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build --target install @@ -55,6 +62,7 @@ SHELL ["/bin/bash", "-c"] ARG DATAFED_DIR ARG DATAFED_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT ARG DATAFED_DEPENDENCIES_INSTALL_PATH ARG BUILD_DIR ARG LIB_DIR @@ -62,6 +70,7 @@ ARG LIB_DIR # The above should also be available at runtime ENV DATAFED_INSTALL_PATH="$DATAFED_INSTALL_PATH" ENV DATAFED_DEPENDENCIES_INSTALL_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}" +ENV DATAFED_DEPENDENCIES_ROOT="${DATAFED_DEPENDENCIES_ROOT}" ENV DATAFED_DIR="$DATAFED_DIR" ENV BUILD_DIR="$BUILD_DIR" ENV LIB_DIR="$LIB_DIR" @@ -76,13 +85,25 @@ COPY --chown=datafed:root ./scripts/generate_core_config.sh ${BUILD_DIR}/scripts COPY --chown=datafed:root ./scripts/install_core.sh ${BUILD_DIR}/scripts/install_core.sh COPY --chown=datafed:root ./cmake/Version.cmake ${BUILD_DIR}/cmake/Version.cmake COPY --from=core-build --chown=datafed:root ${BUILD_DIR}/core/docker/entrypoint.sh ${BUILD_DIR}/core/docker/entrypoint.sh +COPY --from=core-build --chown=datafed:root ${DATAFED_DEPENDENCIES_ROOT}/scripts ${DATAFED_DEPENDENCIES_ROOT}/scripts COPY --from=core-build --chown=datafed:root ${DATAFED_INSTALL_PATH}/core/datafed-core ${DATAFED_INSTALL_PATH}/core/datafed-core USER root -RUN chown -R datafed:root /datafed -RUN chown -R datafed:root /opt +RUN chown -R datafed:root ${DATAFED_DIR} /opt /home/datafed \ + ${DATAFED_DEPENDENCIES_ROOT} && \ + chmod 774 ${DATAFED_DIR} ${BUILD_DIR} ${BUILD_DIR}/core/docker/entrypoint.sh \ + ${DATAFED_INSTALL_PATH}/core/datafed-core \ + ${BUILD_DIR}/scripts/generate_datafed.sh \ + ${BUILD_DIR}/scripts/generate_core_config.sh \ + ${BUILD_DIR}/scripts/install_core.sh \ + ${DATAFED_INSTALL_PATH}/core && \ + find ${DATAFED_DEPENDENCIES_ROOT} -type d -exec chmod 0774 {} + && \ + chmod 664 ${BUILD_DIR}/cmake/Version.cmake && \ + chmod +t ${DATAFED_DIR} ${DATAFED_INSTALL_PATH} + +USER datafed # NOTE docker does not recognize curly braces around variables in entrypoint # and CMD ENTRYPOINT [ "/datafed/source/core/docker/entrypoint.sh", "/opt/datafed/core/datafed-core","--cfg", "/opt/datafed/core/datafed-core.cfg"] diff --git a/core/docker/entrypoint.sh b/core/docker/entrypoint.sh index efdd65c2c..faaec2b71 100755 --- a/core/docker/entrypoint.sh +++ b/core/docker/entrypoint.sh @@ -2,10 +2,6 @@ set -euf -o pipefail -if [ -n "$UID" ]; then - usermod -u $UID datafed -fi - SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../..") @@ -18,9 +14,8 @@ env log_path="$DATAFED_DEFAULT_LOG_PATH" -if [ ! -d "${log_path}" ] -then - su -c "mkdir -p ${log_path}" datafed +if [ ! -d "${log_path}" ]; then + mkdir -p ${log_path} fi echo "Number of arguments is $#" @@ -33,15 +28,14 @@ if [ "$#" -eq 0 ]; then fi datafed_core_exec=$(basename "$1") -if [ "${datafed_core_exec}" = "datafed-core" ] -then +if [ "${datafed_core_exec}" = "datafed-core" ]; then # Send output to log file # For this to work all commands must be passed in as a single string - su datafed -c '"$@"' -- argv0 "$@" 2>&1 | su datafed -c "tee $log_path/datafed-core.log" + "$@" -- argv0 "$@" 2>&1 | tee $log_path/datafed-core.log else echo "Not sending output to datafed-core.log" # If not do not by default send to log file - su datafed -c '"$@"' -- argv0 "$@" + "$@" -- argv0 "$@" fi echo "Give a few minutes to debug the problem" diff --git a/core/server/AuthMap.cpp b/core/server/AuthMap.cpp index 54f242943..3db306f97 100644 --- a/core/server/AuthMap.cpp +++ b/core/server/AuthMap.cpp @@ -9,7 +9,6 @@ namespace SDMS { namespace Core { AuthMap::AuthMap(const AuthMap &auth_map) { - m_trans_active_increment = auth_map.m_trans_active_increment; m_session_active_increment = auth_map.m_session_active_increment; @@ -31,7 +30,6 @@ AuthMap::AuthMap(const AuthMap &auth_map) { } AuthMap &AuthMap::operator=(const AuthMap &&auth_map) { - m_trans_active_increment = auth_map.m_trans_active_increment; m_session_active_increment = auth_map.m_session_active_increment; @@ -103,6 +101,11 @@ void AuthMap::removeKey(const PublicKeyType pub_key_type, if (m_session_auth_clients.count(pub_key)) { m_session_auth_clients.erase(pub_key); } + } else if (PublicKeyType::PERSISTENT == pub_key_type) { + lock_guard lock(m_persistent_clients_mtx); + if (m_persistent_auth_clients.count(pub_key)) { + m_persistent_auth_clients.erase(pub_key); + } } else { EXCEPT(1, "Unsupported PublicKey Type during execution of removeKey."); } @@ -129,7 +132,7 @@ void AuthMap::resetKey(const PublicKeyType pub_key_type, EXCEPT(1, "Missing public key cannot reset session expiration."); } } else { - EXCEPT(1, "Unsupported PublicKey Type during execution of addKey."); + EXCEPT(1, "Unsupported PublicKey Type during execution of resetKey."); } } @@ -181,26 +184,31 @@ void AuthMap::incrementKeyAccessCounter(const PublicKeyType pub_key_type, bool AuthMap::hasKey(const PublicKeyType pub_key_type, const std::string &public_key) const { - if (pub_key_type == PublicKeyType::TRANSIENT) { lock_guard lock(m_trans_clients_mtx); - if (m_trans_auth_clients.count(public_key)) { - return true; - } + return m_trans_auth_clients.count(public_key) > 0; } else if (pub_key_type == PublicKeyType::SESSION) { lock_guard lock(m_session_clients_mtx); - if (m_session_auth_clients.count(public_key)) - return true; + return m_session_auth_clients.count(public_key) > 0; } else if (pub_key_type == PublicKeyType::PERSISTENT) { - // Check to see if it is a repository key - if (m_persistent_auth_clients.count(public_key)) - return true; - - // Check to see if it is a user key - DatabaseAPI db(m_db_url, m_db_user, m_db_pass); - std::string uid; - if (db.uidByPubKey(public_key, uid)) { - return true; + // Check to see if it is a repository key FIRST + { + lock_guard lock(m_persistent_clients_mtx); + if (m_persistent_auth_clients.count(public_key) > 0) { + return true; + } + } + + // Only check database for user keys if not found in memory + try { + DatabaseAPI db(m_db_url, m_db_user, m_db_pass); + std::string uid; + if (db.uidByPubKey(public_key, uid)) { + return true; + } + } catch (const std::exception& e) { + // Database is down, but we already checked memory map + // TODO: Caller should log this failure for monitoring/alerting } } else { EXCEPT(1, "Unrecognized PublicKey Type during execution of hasKey."); @@ -210,40 +218,55 @@ bool AuthMap::hasKey(const PublicKeyType pub_key_type, std::string AuthMap::getUID(const PublicKeyType pub_key_type, const std::string &public_key) const { + + std::string uid = getUIDSafe(pub_key_type, public_key); + + if (uid.empty()) { + if (pub_key_type == PublicKeyType::TRANSIENT) { + EXCEPT(1, "Missing transient public key unable to map to uid."); + } else if (pub_key_type == PublicKeyType::SESSION) { + EXCEPT(1, "Missing session public key unable to map to uid."); + } else if (pub_key_type == PublicKeyType::PERSISTENT) { + EXCEPT(1, "Missing persistent public key unable to map to user id or " + "repo id. Possibly, cannot connect to database."); + } else { + EXCEPT(1, "Unrecognized PublicKey Type during execution of getId."); + } + } + + return uid; +} + +std::string AuthMap::getUIDSafe(const PublicKeyType pub_key_type, + const std::string &public_key) const { if (pub_key_type == PublicKeyType::TRANSIENT) { lock_guard lock(m_trans_clients_mtx); if (m_trans_auth_clients.count(public_key)) { return m_trans_auth_clients.at(public_key).uid; - } else { - EXCEPT(1, "Missing transient public key unable to map to uid."); } - } else if (pub_key_type == PublicKeyType::SESSION) { lock_guard lock(m_session_clients_mtx); if (m_session_auth_clients.count(public_key)) { return m_session_auth_clients.at(public_key).uid; - } else { - EXCEPT(1, "Missing session public key unable to map to uid."); } - } else if (pub_key_type == PublicKeyType::PERSISTENT) { - // If it is a repository key get it - // auto auth_clients = m_config.getAuthClients(); - if (m_persistent_auth_clients.count(public_key)) { - return m_persistent_auth_clients.at(public_key); + // Check repository keys first (with proper locking) + { + lock_guard lock(m_persistent_clients_mtx); + if (m_persistent_auth_clients.count(public_key)) { + return m_persistent_auth_clients.at(public_key); + } } - - // It must be a persistent user key + + // Check database for user keys DatabaseAPI db(m_db_url, m_db_user, m_db_pass); std::string uid; if (db.uidByPubKey(public_key, uid)) { return uid; - } else { - EXCEPT(1, "Missing persistent public key unable to map to user id or " - "repo id. Possibly, cannot connect to database."); } } - EXCEPT(1, "Unrecognized PublicKey Type during execution of getId."); + + return ""; // Return empty string instead of throwing } bool AuthMap::hasKeyType(const PublicKeyType pub_key_type, @@ -259,6 +282,24 @@ bool AuthMap::hasKeyType(const PublicKeyType pub_key_type, } } +void AuthMap::setAccessCount(const PublicKeyType pub_key_type, + const std::string &public_key, + const size_t count) { + if (pub_key_type == PublicKeyType::TRANSIENT) { + std::lock_guard lock(m_trans_clients_mtx); + if (m_trans_auth_clients.count(public_key)) { + m_trans_auth_clients.at(public_key).access_count = count; + } + } else if (pub_key_type == PublicKeyType::SESSION) { + std::lock_guard lock(m_session_clients_mtx); + if (m_session_auth_clients.count(public_key)) { + m_session_auth_clients.at(public_key).access_count = count; + } + } else { + EXCEPT(1, "Unsupported PublicKey Type during execution of setAccessCount."); + } +} + size_t AuthMap::getAccessCount(const PublicKeyType pub_key_type, const std::string &public_key) const { if (pub_key_type == PublicKeyType::TRANSIENT) { @@ -272,10 +313,80 @@ size_t AuthMap::getAccessCount(const PublicKeyType pub_key_type, return m_session_auth_clients.at(public_key).access_count; } } else { - EXCEPT(1, "Unsupported PublicKey Type during execution of hasKeyType."); + EXCEPT(1, "Unsupported PublicKey Type during execution of getAccessCount."); } return 0; } +bool isSupportedMigration(const PublicKeyType from, const PublicKeyType to) { + // Only support the following migrations + // TRANSIENT -> SESSION + // SESSION -> PERSISTENT + if ((from == PublicKeyType::TRANSIENT && to == PublicKeyType::SESSION ) || + (from == PublicKeyType::SESSION && to == PublicKeyType::PERSISTENT )) { + return true; + } + return false; +} + +void AuthMap::migrateKey(const PublicKeyType from_type, + const PublicKeyType to_type, + const std::string &public_key, + const std::string &id) { + + if( from_type == to_type ) { + return; + } + + if ( ! isSupportedMigration(from_type, to_type) ) { + EXCEPT(1, "Unsupported key migration attempted, only allowed to migrate to TRANSIENT -> SESSION or SESSION -> PERSISTENT"); + } + + if (from_type == PublicKeyType::TRANSIENT) { + // TRANSIENT -> SESSION + std::lock_guard lock_trans(m_trans_clients_mtx); + // Make sure TRANSIENT key exists before trying to remove it. + if (! m_trans_auth_clients.count(public_key)) { + EXCEPT(1, "Missing TRANSIENT key, unable to migrate key (TRANSIENT->SESSION)!"); + } + std::lock_guard lock_sess(m_session_clients_mtx); + m_trans_auth_clients.erase(public_key); + // Make sure SESSION key does not exist before trying to add it. + if ( m_session_auth_clients.count(public_key) == 0 ) { + AuthElement element = {id, time(0) + m_trans_active_increment, 0}; + m_session_auth_clients[public_key] = element; + } + + } else if (from_type == PublicKeyType::SESSION) { + // SESSION -> PERSISTENT + std::lock_guard lock_sess(m_session_clients_mtx); + // Make sure SESSION key exists before trying to remove it. + if (! m_session_auth_clients.count(public_key)) { + EXCEPT(1, "Missing SESSION key, unable to migrate key (SESSION->PERSISTENT)!"); + } + std::lock_guard lock_pers(m_persistent_clients_mtx); + m_session_auth_clients.erase(public_key); + // Make sure PERSISTENT key does not exist before trying to add it. + if ( m_persistent_auth_clients.count(public_key) == 0 ) { + m_persistent_auth_clients[public_key] = id; + } + } +} + +void AuthMap::clearTransientKeys() { + std::lock_guard lock(m_trans_clients_mtx); + m_trans_auth_clients.clear(); +} + +void AuthMap::clearSessionKeys() { + std::lock_guard lock(m_session_clients_mtx); + m_session_auth_clients.clear(); +} + +void AuthMap::clearAllNonPersistentKeys() { + clearTransientKeys(); + clearSessionKeys(); +} + } // namespace Core } // namespace SDMS diff --git a/core/server/AuthMap.hpp b/core/server/AuthMap.hpp index 1211d23e4..7ffaeda77 100644 --- a/core/server/AuthMap.hpp +++ b/core/server/AuthMap.hpp @@ -33,6 +33,11 @@ class AuthMap { time_t m_trans_active_increment = 0; time_t m_session_active_increment = 0; + /** + * WARNING if more than one lock guard need to be applied in a given + * method they must be locked in a consistent order to avoid deadlock + * TRANSIENT -> SESSION -> PERSISTENT + **/ mutable std::mutex m_trans_clients_mtx; ///< Mutex for transient client data access mutable std::mutex @@ -96,12 +101,25 @@ class AuthMap { size_t getAccessCount(const PublicKeyType pub_key_type, const std::string &public_key) const; + /** + * Set the access count on a key. + **/ + void setAccessCount(const PublicKeyType pub_key_type, + const std::string &public_key, + const size_t); + /** * Will return the users Unique ID if it exists, will throw an error if it *does not exist. Best to call hasKey first. **/ std::string getUID(const PublicKeyType pub_key_type, const std::string &public_key) const; + + /** + * Safe version that returns empty string if key not found + **/ + std::string getUIDSafe(const PublicKeyType pub_key_type, + const std::string &public_key) const; /** * Will return the number of keys of the provided type. Does not currently @@ -139,6 +157,36 @@ class AuthMap { void removeKey(const PublicKeyType pub_key_type, const std::string &public_key); + /** + * @brief Migrates an authentication key from one storage type to another. + * + * This method supports migrating keys between specific `PublicKeyType`s: + * - TRANSIENT -> SESSION + * - SESSION -> PERSISTENT + * + * This is useful for correcting misclassified keys (e.g., when a repository + * key was incorrectly cached as transient/session during DB outage). + * + * The migration process ensures: + * - The source key exists before attempting removal. + * - The destination key does not exist before insertion. + * - Appropriate locks are taken to ensure thread safety. + * + * @param from_type The original type of the key (TRANSIENT or SESSION). + * @param to_type The target type of the key (SESSION or PERSISTENT). + * @param public_key The public key to be migrated. + * @param id The identifier associated with the key. + * + * @throws Exception if: + * - Migration is not supported. + * - The source key is missing. + * - Any internal invariant fails during migration. + **/ + void migrateKey(const PublicKeyType from_type, + const PublicKeyType to_type, + const std::string &public_key, + const std::string &id); + /** * Will reset the access counter of the key to 0 and the allowed expiration *time of the key.. @@ -147,6 +195,24 @@ class AuthMap { **/ void resetKey(const PublicKeyType pub_key_type, const std::string &public_key); + + /** + * Clear all transient keys from the authentication map. + * This is useful for cleaning up stale keys after service restarts. + **/ + void clearTransientKeys(); + + /** + * Clear all session keys from the authentication map. + * This is useful for cleaning up stale keys after service restarts. + **/ + void clearSessionKeys(); + + /** + * Clear all non-persistent (transient and session) keys. + * Persistent keys are preserved as they represent service accounts. + **/ + void clearAllNonPersistentKeys(); }; } // namespace Core diff --git a/core/server/AuthenticationManager.cpp b/core/server/AuthenticationManager.cpp index 44bb35542..62b1d29b2 100644 --- a/core/server/AuthenticationManager.cpp +++ b/core/server/AuthenticationManager.cpp @@ -18,11 +18,10 @@ AuthenticationManager::AuthenticationManager( const std::string &db_url, const std::string &db_user, const std::string &db_pass) : m_purge_interval(purge_intervals), - m_purge_conditions(std::move(purge_conditions)) { - m_auth_mapper = std::move(AuthMap(m_purge_interval[PublicKeyType::TRANSIENT], - m_purge_interval[PublicKeyType::SESSION], - db_url, db_user, db_pass)); - + m_purge_conditions(std::move(purge_conditions)), + m_auth_mapper(m_purge_interval[PublicKeyType::TRANSIENT], + m_purge_interval[PublicKeyType::SESSION], + db_url, db_user, db_pass) { for (const auto &purge_int : m_purge_interval) { m_next_purge[purge_int.first] = time(0) + purge_int.second; } @@ -36,6 +35,7 @@ AuthenticationManager::operator=(AuthenticationManager &&other) { m_next_purge = other.m_next_purge; m_purge_interval = other.m_purge_interval; m_purge_conditions = std::move(other.m_purge_conditions); + m_auth_mapper = std::move(other.m_auth_mapper); } return *this; } @@ -82,25 +82,35 @@ void AuthenticationManager::incrementKeyAccessCounter( bool AuthenticationManager::hasKey(const std::string &public_key) const { std::lock_guard lock(m_lock); + if (m_auth_mapper.hasKey(PublicKeyType::TRANSIENT, public_key)) { return true; - } else if (m_auth_mapper.hasKey(PublicKeyType::SESSION, public_key)) { + } + + if (m_auth_mapper.hasKey(PublicKeyType::SESSION, public_key)) { return true; - } else if (m_auth_mapper.hasKey(PublicKeyType::PERSISTENT, public_key)) { + } + + if (m_auth_mapper.hasKey(PublicKeyType::PERSISTENT, public_key)) { return true; } + return false; } std::string AuthenticationManager::getUID(const std::string &public_key) const { std::lock_guard lock(m_lock); - if (m_auth_mapper.hasKey(PublicKeyType::TRANSIENT, public_key)) + if (m_auth_mapper.hasKey(PublicKeyType::TRANSIENT, public_key)) { return m_auth_mapper.getUID(PublicKeyType::TRANSIENT, public_key); - if (m_auth_mapper.hasKey(PublicKeyType::SESSION, public_key)) + } + if (m_auth_mapper.hasKey(PublicKeyType::SESSION, public_key)) { return m_auth_mapper.getUID(PublicKeyType::SESSION, public_key); - if (m_auth_mapper.hasKey(PublicKeyType::PERSISTENT, public_key)) + } + if (m_auth_mapper.hasKey(PublicKeyType::PERSISTENT, public_key)) { return m_auth_mapper.getUID(PublicKeyType::PERSISTENT, public_key); + } + EXCEPT(1, "Unrecognized public_key during execution of getUID."); } @@ -111,5 +121,56 @@ void AuthenticationManager::addKey(const PublicKeyType &pub_key_type, m_auth_mapper.addKey(pub_key_type, public_key, uid); } +bool AuthenticationManager::hasKey(const PublicKeyType &pub_key_type, + const std::string &public_key) const { + std::lock_guard lock(m_lock); + return m_auth_mapper.hasKey(pub_key_type, public_key); +} + +void AuthenticationManager::migrateKey(const PublicKeyType &from_type, + const PublicKeyType &to_type, + const std::string &public_key, + const std::string &uid) { + std::lock_guard lock(m_lock); + m_auth_mapper.migrateKey(from_type, to_type, public_key, uid); +} + +void AuthenticationManager::clearTransientKeys() { + std::lock_guard lock(m_lock); + m_auth_mapper.clearTransientKeys(); +} + +void AuthenticationManager::clearSessionKeys() { + std::lock_guard lock(m_lock); + m_auth_mapper.clearSessionKeys(); +} + +void AuthenticationManager::clearAllNonPersistentKeys() { + std::lock_guard lock(m_lock); + m_auth_mapper.clearAllNonPersistentKeys(); +} + +std::string AuthenticationManager::getUIDSafe(const std::string &public_key) const { + std::lock_guard lock(m_lock); + + // Try each key type in order + std::string uid = m_auth_mapper.getUIDSafe(PublicKeyType::TRANSIENT, public_key); + if (!uid.empty()) { + return uid; + } + + uid = m_auth_mapper.getUIDSafe(PublicKeyType::SESSION, public_key); + if (!uid.empty()) { + return uid; + } + + uid = m_auth_mapper.getUIDSafe(PublicKeyType::PERSISTENT, public_key); + if (!uid.empty()) { + return uid; + } + + return ""; // Return empty string if not found anywhere +} + } // namespace Core } // namespace SDMS diff --git a/core/server/AuthenticationManager.hpp b/core/server/AuthenticationManager.hpp index d648da8ab..65468df4a 100644 --- a/core/server/AuthenticationManager.hpp +++ b/core/server/AuthenticationManager.hpp @@ -36,6 +36,8 @@ class AuthenticationManager : public IAuthenticationManager { public: AuthenticationManager(){}; + virtual ~AuthenticationManager(){}; + AuthenticationManager &operator=(AuthenticationManager &&other); AuthenticationManager( @@ -82,6 +84,35 @@ class AuthenticationManager : public IAuthenticationManager { void addKey(const PublicKeyType &pub_key_type, const std::string &public_key, const std::string &uid); + /** + * Check if a specific key exists in a specific map type + **/ + bool hasKey(const PublicKeyType &pub_key_type, const std::string &public_key) const; + + /** + * Migrate a key from one type to another + **/ + void migrateKey(const PublicKeyType &from_type, const PublicKeyType &to_type, + const std::string &public_key, const std::string &uid); + + /** + * Clear all transient keys from the authentication map. + * This is useful for cleaning up stale keys after service restarts. + **/ + void clearTransientKeys(); + + /** + * Clear all session keys from the authentication map. + * This is useful for cleaning up stale keys after service restarts. + **/ + void clearSessionKeys(); + + /** + * Clear all non-persistent (transient and session) keys. + * Persistent keys are preserved as they represent service accounts. + **/ + void clearAllNonPersistentKeys(); + /** * Will the id or throw an error * @@ -91,6 +122,12 @@ class AuthenticationManager : public IAuthenticationManager { * - PERSISTENT **/ virtual std::string getUID(const std::string &pub_key) const final; + + /** + * Safe version that returns empty string if key not found + * instead of throwing an exception + **/ + std::string getUIDSafe(const std::string &pub_key) const; }; } // namespace Core diff --git a/core/server/ClientWorker.cpp b/core/server/ClientWorker.cpp index 41c01ef00..be85bae71 100644 --- a/core/server/ClientWorker.cpp +++ b/core/server/ClientWorker.cpp @@ -363,8 +363,9 @@ void ClientWorker::workerThread(LogContext log_context) { const std::string uid = std::get(message.get(MessageAttribute::ID)); if (msg_type != task_list_msg_type) { - DL_DEBUG(message_log_context, - "W" << m_tid << " msg " << msg_type << " [" << uid << "]"); + DL_DEBUG(message_log_context, "W" << m_tid << " msg " + << proto_map.toString(msg_type) + << " [" << uid << "]"); } if (uid.compare("anon") == 0 && msg_type > 0x1FF) { diff --git a/core/server/Condition.cpp b/core/server/Condition.cpp index 209c78165..9b6c81c45 100644 --- a/core/server/Condition.cpp +++ b/core/server/Condition.cpp @@ -19,6 +19,8 @@ void Promote::enforce(AuthMap &auth_map, const std::string &public_key) { } // Remove expired short lived transient key auth_map.removeKey(m_promote_from, public_key); + // Set the access counter so that it doesn't get prematurely removed + auth_map.setAccessCount(m_promote_to, public_key, access_count); } } diff --git a/core/server/Condition.hpp b/core/server/Condition.hpp index b2f2bcfdd..be4728ea3 100644 --- a/core/server/Condition.hpp +++ b/core/server/Condition.hpp @@ -22,6 +22,7 @@ class Condition { public: virtual ConditionType type() const noexcept = 0; virtual void enforce(AuthMap &auth_map, const std::string &public_key) = 0; + virtual ~Condition() {}; }; class Promote : public Condition { @@ -41,6 +42,7 @@ class Promote : public Condition { } virtual void enforce(AuthMap &auth_map, const std::string &public_key) final; + virtual ~Promote() {}; }; class Reset : public Condition { @@ -57,6 +59,7 @@ class Reset : public Condition { } virtual void enforce(AuthMap &auth_map, const std::string &public_key) final; + virtual ~Reset() {}; }; } // namespace Core diff --git a/core/server/Config.cpp b/core/server/Config.cpp index 09041cf91..579d184bd 100644 --- a/core/server/Config.cpp +++ b/core/server/Config.cpp @@ -70,11 +70,38 @@ void Config::loadRepositoryConfig(AuthenticationManager &auth_manager, } // Cache pub key for ZAP handler - auth_manager.addKey(PublicKeyType::PERSISTENT, r.pub_key(), r.id()); + // Historical bug (DAPS-1625): Repository keys could be incorrectly cached as + // transient/session keys if loadRepositoryConfig() was called before the + // AuthenticationManager was properly initialized. This is now fixed by proper + // initialization order in CoreServer.cpp, but we keep the migration logic + // during config reloads. + DL_TRACE(log_context, "Registering repo " << r.id()); + + // Check for duplicate keys across different maps + bool in_transient = auth_manager.hasKey(PublicKeyType::TRANSIENT, r.pub_key()); + bool in_session = auth_manager.hasKey(PublicKeyType::SESSION, r.pub_key()); + + if (in_transient && in_session) { + // Key exists in both maps - this is an inconsistent state + DL_WARNING(log_context, "Repo " << r.id() << " key found in BOTH TRANSIENT and SESSION maps. " + << "Removing from both and adding to PERSISTENT."); + auth_manager.migrateKey(PublicKeyType::TRANSIENT, PublicKeyType::PERSISTENT, r.pub_key(), r.id()); + auth_manager.migrateKey(PublicKeyType::SESSION, PublicKeyType::PERSISTENT, r.pub_key(), r.id()); + } else if (in_transient) { + DL_INFO(log_context, "Repo " << r.id() << " key found in TRANSIENT map, migrating to PERSISTENT"); + auth_manager.migrateKey(PublicKeyType::TRANSIENT, PublicKeyType::PERSISTENT, r.pub_key(), r.id()); + } else if (in_session) { + DL_INFO(log_context, "Repo " << r.id() << " key found in SESSION map, migrating to PERSISTENT"); + auth_manager.migrateKey(PublicKeyType::SESSION, PublicKeyType::PERSISTENT, r.pub_key(), r.id()); + } else { + // Normal case - add as new PERSISTENT key + DL_TRACE(log_context, "Adding repo " << r.id() << " key as new PERSISTENT key"); + auth_manager.addKey(PublicKeyType::PERSISTENT, r.pub_key(), r.id()); + } // Cache repo data for data handling m_repos_mtx.lock(); - DL_TRACE(log_context, std::string("Repo ") + DL_INFO(log_context, std::string("Repo ") << r.id() << " OK - UUID: " << r.endpoint() << " address: " << r.address()); m_repos[r.id()] = r; @@ -82,6 +109,18 @@ void Config::loadRepositoryConfig(AuthenticationManager &auth_manager, m_repos_mtx.unlock(); } } + + // Validate that repository keys are still present after loading + DL_TRACE(log_context, "Validating repository keys after loading"); + for (const auto& repo_pair : m_repos) { + const RepoData& repo = repo_pair.second; + if (auth_manager.hasKey(PublicKeyType::PERSISTENT, repo.pub_key())) { + DL_TRACE(log_context, "Key for " << repo.id() << " verified in PERSISTENT map"); + } else { + DL_ERROR(log_context, "KEY MISSING! Repository " << repo.id() + << " key not found after loading!"); + } + } } // NOTE this would be better as an observer pattern using a separate object diff --git a/core/server/CoreServer.cpp b/core/server/CoreServer.cpp index c4fa4b311..fab7f9f0b 100644 --- a/core/server/CoreServer.cpp +++ b/core/server/CoreServer.cpp @@ -80,14 +80,15 @@ Server::Server(LogContext log_context) purge_conditions[PublicKeyType::SESSION].emplace_back( std::make_unique(accesses_to_reset, key_type_to_apply_reset)); - // Load repository config from DB - m_config.loadRepositoryConfig(m_auth_manager, log_context); - - // Must occur after loading config settings + // Initialize AuthenticationManager BEFORE loading repository config + // This ensures repos are loaded into the correct instance m_auth_manager = std::move(AuthenticationManager( purge_intervals, std::move(purge_conditions), m_config.db_url, m_config.db_user, m_config.db_pass)); + // Now load repository config from DB into the initialized AuthenticationManager + m_config.loadRepositoryConfig(m_auth_manager, log_context); + // Start ZAP handler must be started before any other socket binds are called // m_zap_thread = thread( &Server::zapHandler, this ); @@ -136,7 +137,7 @@ void Server::loadKeys(const std::string &a_cred_dir) { void Server::waitForDB() { DL_INFO(m_log_context, "Waiting for DB..."); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 20; i++) { try { DatabaseAPI db_client(m_config.db_url, m_config.db_user, m_config.db_pass); @@ -144,9 +145,9 @@ void Server::waitForDB() { DL_INFO(m_log_context, "DB Ping Success"); return; } catch (...) { - DL_INFO(m_log_context, "DB connection error"); + DL_WARNING(m_log_context, "DB connection error."); } - sleep(5); + sleep(10); } EXCEPT(1, "Unable to connect to DB"); diff --git a/core/server/DatabaseAPI.cpp b/core/server/DatabaseAPI.cpp index 6b24f4a35..5992da865 100644 --- a/core/server/DatabaseAPI.cpp +++ b/core/server/DatabaseAPI.cpp @@ -442,7 +442,6 @@ void DatabaseAPI::userCreate(const Auth::UserCreateRequest &a_request, << ", name: " << a_request.name()); vector> params; - params.push_back({"secret", a_request.secret()}); params.push_back({"uid", a_request.uid()}); params.push_back({"name", a_request.name()}); params.push_back({"email", a_request.email()}); @@ -2159,23 +2158,28 @@ void DatabaseAPI::repoCreate(const Auth::RepoCreateRequest &a_request, Value result; nlohmann::json payload; + + // Required attributes payload["id"] = a_request.id(); payload["title"] = a_request.title(); - payload["path"] = a_request.path(); - payload["pub_key"] = a_request.pub_key(); - payload["address"] = a_request.address(); - payload["endpoint"] = a_request.endpoint(); - payload["capacity"] = to_string(a_request.capacity()); + payload["capacity"] = std::to_string(a_request.capacity()); + + // Helper to add optional fields if present + auto add_if_present = [&](auto has_fn, auto get_fn, const std::string& key) { + if ((a_request.*has_fn)()) { + payload[key] = (a_request.*get_fn)(); + } + }; + + // List of optional fields to check + add_if_present(&Auth::RepoCreateRequest::has_path, &Auth::RepoCreateRequest::path, "path"); + add_if_present(&Auth::RepoCreateRequest::has_pub_key, &Auth::RepoCreateRequest::pub_key, "pub_key"); + add_if_present(&Auth::RepoCreateRequest::has_address, &Auth::RepoCreateRequest::address, "address"); + add_if_present(&Auth::RepoCreateRequest::has_endpoint, &Auth::RepoCreateRequest::endpoint, "endpoint"); + add_if_present(&Auth::RepoCreateRequest::has_desc, &Auth::RepoCreateRequest::desc, "desc"); + add_if_present(&Auth::RepoCreateRequest::has_domain, &Auth::RepoCreateRequest::domain, "domain"); + add_if_present(&Auth::RepoCreateRequest::has_exp_path, &Auth::RepoCreateRequest::exp_path, "exp_path"); - if (a_request.has_desc()) { - payload["desc"] = a_request.desc(); - } - if (a_request.has_domain()) { - payload["domain"] = a_request.domain(); - } - if (a_request.has_exp_path()) { - payload["exp_path"] = a_request.exp_path(); - } if (a_request.admin_size() > 0) { nlohmann::json admins = nlohmann::json::array(); for (int i = 0; i < a_request.admin_size(); ++i) { @@ -3657,69 +3661,97 @@ void DatabaseAPI::taskPurge(uint32_t a_age_sec, LogContext log_context) { } */ +/** + * @brief Converts client metrics into a structured JSON string. + * + * This method takes a timestamp, a total count, and a nested map of client + * metrics, and produces a JSON string with the following structure: + * + * - `timestamp`: the timestamp provided. + * - `total`: the total count provided. + * - `uids` (or clients): a JSON object where each key is a client ID and the + * value is an object containing: + * - `tot`: subtotal for the client (from message type 0, if present) + * - `msg`: an object mapping message types (as strings) to counts. + * + * @param a_timestamp The timestamp to include in the JSON payload. + * @param a_total The total count across all clients (sum of all subtotals). + * @param a_metrics A map where: + * - The first key (`std::string`) is the client ID. + * - The nested map (`std::map`) maps: + * - Key: message type (uint16_t), where `0` is reserved for subtotal. + * - Value: count of messages for that type, at key `0` it is the + * subtotal. + * - If a client has no metrics, the nested map will be empty. + * - Message type `0` is used as a subtotal and is never a valid message type. + * + * @return A formatted JSON string representing the clients and their message + * counts. + * + * @note The JSON structure will always include the `"uids"` object, even if + * empty. + * @note Message type keys in `"msg"` are converted to strings to ensure valid + * JSON objects. + * + * In the below example total is equivalent to subtotal because there is only + * one client. + * + * @example + * Input: + * @code + * timestamp = 111 + * total = 15 + * metrics = { + * {"client1", {{0, 15}, {1, 10}, {2, 5}}} + * } + * @endcode + * + * Output JSON: + * @code + * { + * "timestamp": 111, + * "total": 15, + * "uids": { + * "client1": { + * "tot": 15, + * "msg": { + * "1": 10, + * "2": 5 + * } + * } + * } + * } + * @endcode + */ std::string DatabaseAPI::newJsonMetricParse( uint32_t a_timestamp, uint32_t a_total, const std::map> &a_metrics) { - map>::const_iterator u; - map::const_iterator m; + nlohmann::json payload; - payload["timestamp"] = to_string(a_timestamp); - payload["total"] = to_string(a_total); - - nlohmann::json uids; - for (u = a_metrics.begin(); u != a_metrics.end(); ++u) { - nlohmann::json uid_body; - uid_body["tot"] = to_string(u->second.at(0)); - nlohmann::json uid_msg; - for (m = u->second.begin(); m != u->second.end(); ++m) { - if (m->first != 0) { - uid_msg[to_string(m->first)] = to_string(m->second); - } - } - uid_body["msg"] = uid_msg; + payload["timestamp"] = a_timestamp; + payload["total"] = a_total; - uids[u->first] = uid_body; - } + nlohmann::json clients_json = nlohmann::json::object(); - payload["uids"] = uids; - string body = payload.dump(-1, ' ', true); - return body; -} + for (const auto &[client_id, client_metrics] : a_metrics) { + nlohmann::json client_json; -// TODO: verify and remove -std::string DatabaseAPI::oldJsonMetricParse( - uint32_t a_timestamp, uint32_t a_total, - const std::map> &a_metrics) { - map>::const_iterator u; - map::const_iterator m; - string body = "{\"timestamp\":" + to_string(a_timestamp) + - ",\"total\":" + to_string(a_total) + ",\"uids\":{"; - bool c = false, cc; - - for (u = a_metrics.begin(); u != a_metrics.end(); ++u) { - if (c) - body += ","; - else - c = true; - - body += "\"" + u->first + "\":{\"tot\":" + to_string(u->second.at(0)) + - ",\"msg\":{"; - - for (cc = false, m = u->second.begin(); m != u->second.end(); ++m) { - if (m->first != 0) { - if (cc) - body += ","; - else - cc = true; - - body += "\"" + to_string(m->first) + "\":" + to_string(m->second); - } + // Use safe access for total + auto it = client_metrics.find(0); + client_json["tot"] = (it != client_metrics.end()) ? it->second : 0; + + nlohmann::json msg_json; + for (const auto &[msg_id, msg_count] : client_metrics) { + if (msg_id != 0) + msg_json[std::to_string(msg_id)] = msg_count; } - body += "}}"; + + client_json["msg"] = msg_json; + clients_json[client_id] = client_json; } - body += "}}"; - return body; + payload["uids"] = clients_json; + return payload.dump(-1, ' ', true); } void DatabaseAPI::metricsUpdateMsgCounts( @@ -3727,21 +3759,7 @@ void DatabaseAPI::metricsUpdateMsgCounts( const std::map> &a_metrics, LogContext log_context) { - string body; - string new_body = newJsonMetricParse(a_timestamp, a_total, a_metrics); - string old_body = oldJsonMetricParse(a_timestamp, a_total, a_metrics); - - if (new_body == old_body) { - // on match use safer serialization - body = new_body; - } else { - body = old_body; - DL_WARNING( - log_context, - "Serialized metric bodies did not match, new serialization yielded:\n" - << new_body << "\n old serialization yielded:\n" - << old_body); - } + std::string body = newJsonMetricParse(a_timestamp, a_total, a_metrics); libjson::Value result; diff --git a/core/server/DatabaseAPI.hpp b/core/server/DatabaseAPI.hpp index ce5e0a649..bf94ce90b 100644 --- a/core/server/DatabaseAPI.hpp +++ b/core/server/DatabaseAPI.hpp @@ -333,7 +333,7 @@ class DatabaseAPI { LogContext); void metricsPurge(uint32_t a_timestamp, LogContext); -private: +protected: long dbGet(const char *a_url_path, const std::vector> &a_params, libjson::Value &a_result, LogContext, bool a_log = true); diff --git a/core/server/GlobusAPI.cpp b/core/server/GlobusAPI.cpp index 095060f46..7cc42b4cd 100644 --- a/core/server/GlobusAPI.cpp +++ b/core/server/GlobusAPI.cpp @@ -48,16 +48,26 @@ GlobusAPI::GlobusAPI(LogContext log_context) GlobusAPI &GlobusAPI::operator=(GlobusAPI &&other) noexcept { if (this != &other) { + curl_easy_cleanup(m_curl_auth); + curl_easy_cleanup(m_curl_xfr); this->m_curl_xfr = other.m_curl_xfr; this->m_curl_auth = other.m_curl_auth; + other.m_curl_xfr = nullptr; + other.m_curl_auth = nullptr; this->m_log_context = other.m_log_context; } return *this; } GlobusAPI::~GlobusAPI() { - curl_easy_cleanup(m_curl_auth); - curl_easy_cleanup(m_curl_xfr); + if(m_curl_auth) + { + curl_easy_cleanup(m_curl_auth); + } + if(m_curl_xfr) + { + curl_easy_cleanup(m_curl_xfr); + } } long GlobusAPI::get(CURL *a_curl, const std::string &a_base_url, diff --git a/core/server/tests/unit/CMakeLists.txt b/core/server/tests/unit/CMakeLists.txt index f42b95ef9..054d0c5f9 100644 --- a/core/server/tests/unit/CMakeLists.txt +++ b/core/server/tests/unit/CMakeLists.txt @@ -2,6 +2,7 @@ foreach(PROG test_AuthMap test_AuthenticationManager + test_DatabaseAPI ) file(GLOB ${PROG}_SOURCES ${PROG}*.cpp) diff --git a/core/server/tests/unit/test_AuthMap.cpp b/core/server/tests/unit/test_AuthMap.cpp index 2699629fa..02678d2e2 100644 --- a/core/server/tests/unit/test_AuthMap.cpp +++ b/core/server/tests/unit/test_AuthMap.cpp @@ -13,10 +13,10 @@ using namespace SDMS::Core; struct GlobalProtobufTeardown { - ~GlobalProtobufTeardown() { - // This is the teardown function that runs once at the end - google::protobuf::ShutdownProtobufLibrary(); - } + ~GlobalProtobufTeardown() { + // This is the teardown function that runs once at the end + google::protobuf::ShutdownProtobufLibrary(); + } }; // Declare a global fixture instance @@ -47,4 +47,29 @@ BOOST_AUTO_TEST_CASE(testing_AuthMap) { BOOST_TEST(auth_map.getUID(PublicKeyType::TRANSIENT, new_pub_key) == user_id); } +BOOST_AUTO_TEST_CASE(testing_AuthMap_setgetcount) { + time_t active_transient_key_time = 30; + time_t active_session_key_time = 30; + std::string db_url = "https://db/sdms/blah"; + std::string db_user = "greatestone"; + std::string db_pass = "1234"; + + AuthMap auth_map(active_transient_key_time, active_session_key_time, db_url, + db_user, db_pass); + + BOOST_TEST(auth_map.size(PublicKeyType::TRANSIENT) == 0); + + std::string new_pub_key = "ugh"; + std::string user_id = "u/bob"; + auth_map.addKey(PublicKeyType::TRANSIENT, new_pub_key, user_id); + + BOOST_TEST(auth_map.getAccessCount(PublicKeyType::TRANSIENT, new_pub_key) == + 0); + + auth_map.setAccessCount(PublicKeyType::TRANSIENT, new_pub_key, 5); + + BOOST_TEST(auth_map.getAccessCount(PublicKeyType::TRANSIENT, new_pub_key) == + 5); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/core/server/tests/unit/test_DatabaseAPI.cpp b/core/server/tests/unit/test_DatabaseAPI.cpp new file mode 100644 index 000000000..23812af2b --- /dev/null +++ b/core/server/tests/unit/test_DatabaseAPI.cpp @@ -0,0 +1,215 @@ +#define BOOST_TEST_MAIN + +#define BOOST_TEST_MODULE authmap + +// Local includes +#include "DatabaseAPI.hpp" + +// Third party includes +#include +#include +#include +#include +#include +#include + +// Standard includes +#include +#include +#include + +using namespace SDMS::Core; + +class DatabaseAPITestHelper : public DatabaseAPI { +public: + // Inherit constructor(s) from DatabaseAPI + using DatabaseAPI::DatabaseAPI; + + // Or you can just use protected methods directly in your own logic + std::string newJsonMetricParse( + uint32_t ts, uint32_t total, + const std::map> &metrics) { + return DatabaseAPI::newJsonMetricParse(ts, total, + metrics); // if it's protected + } +}; + +struct CurlGlobalFixture { + CurlGlobalFixture() { curl_global_init(CURL_GLOBAL_DEFAULT); } + + ~CurlGlobalFixture() { curl_global_cleanup(); } +}; + +// Register fixture to run once per test module +BOOST_TEST_GLOBAL_CONFIGURATION(CurlGlobalFixture); + +const std::string url("https://localhost:8529"); +const std::string user("bob"); +const std::string pass("open_sesame"); + +BOOST_AUTO_TEST_SUITE(DatabaseAPITest) + +/** + * @brief Unit test for DatabaseAPI::newJsonMetricParse() with empty metrics. + * + * This test verifies that the `newJsonMetricParse` function correctly handles + * the case where the metrics map is empty. + * + * Test details: + * - The `metrics` map is empty (no users or messages). + * - The function is called with a timestamp and total value. + * - The test asserts that the JSON output contains the correct timestamp, + * total, and an empty "uids" object. + * + * Example of expected JSON structure: + * @code + * { + * "timestamp": 123456, + * "total": 42, + * "uids": {} + * } + * @endcode + * + * Notes: + * - Ensures that `newJsonMetricParse` does not fail or throw exceptions + * when no user metrics are provided. + * - Uses DatabaseAPITestHelper to invoke the function. + * - Uses nlohmann::json to build and compare the expected JSON output. + */ +BOOST_AUTO_TEST_CASE(testing_empty_metrics) { + + DatabaseAPITestHelper db_api(url, user, pass); + + std::map> metrics; + + std::string result = db_api.newJsonMetricParse(123456, 42, metrics); + + std::cout << "Result is " << std::endl; + std::cout << result << std::endl; + + nlohmann::json expected; + expected["timestamp"] = 123456; + expected["total"] = 42; + expected["uids"] = nlohmann::json::object(); + + std::cout << "expected dump" << std::endl; + std::cout << expected.dump(-1, ' ', true) << std::endl; + BOOST_TEST(result == expected.dump(-1, ' ', true)); +} + +/** + * @brief Unit test for DatabaseAPI::newJsonMetricParse() with a single user. + * + * This test verifies that the `newJsonMetricParse` function correctly converts + * a metrics map containing a single user into the expected JSON format. + * + * Test details: + * - One user is included: "user1". + * - The user has a "tot" value (total) and a "msg" object containing + * message IDs mapped to counts. + * - The total across all messages is passed as `total` to the function. + * - The test asserts that the JSON output matches the expected structure. + * + * Example of expected JSON structure: + * @code + * { + * "timestamp": 111, + * "total": 5, + * "uids": { + * "user1": { + * "tot": 15, + * "msg": { + * "1": 10, + * "2": 5 + * } + * } + * } + * } + * @endcode + * + * Notes: + * - Keys inside the "msg" object must be strings to avoid being interpreted + * as JSON arrays by nlohmann::json. + * - Uses DatabaseAPITestHelper to invoke `newJsonMetricParse`. + * - Uses nlohmann::json to build and compare expected JSON output. + */ +BOOST_AUTO_TEST_CASE(testing_single_uid_with_tot_and_msg) { + + DatabaseAPITestHelper db_api(url, user, pass); + + std::map> metrics = { + {"user1", {{0, 15}, {1, 10}, {2, 5}}}}; + + std::string result = db_api.newJsonMetricParse(111, 5, metrics); + + nlohmann::json expected; + expected["timestamp"] = 111; + expected["total"] = 5; + nlohmann::json uids; + // NOTE keys must be strings + uids["user1"] = {{"tot", 15}, {"msg", {{"1", 10}, {"2", 5}}}}; + expected["uids"] = uids; + + std::cout << "result" << std::endl; + std::cout << result << std::endl; + + std::cout << "expected" << std::endl; + std::cout << expected.dump(-1, ' ', true) << std::endl; + BOOST_TEST(result == expected.dump(-1, ' ', true)); +} + +/** + * @brief Unit test for DatabaseAPI::newJsonMetricParse() with multiple users. + * + * This test verifies that the `newJsonMetricParse` function correctly converts + * a metrics map containing multiple users into the expected JSON format. + * + * Test details: + * - Two users are included: "userA" and "userB". + * - Each user has a "tot" value (total) and a "msg" object containing + * message IDs mapped to counts. + * - The total across all users is passed as `total` to the function. + * - The test asserts that the JSON output matches the expected structure. + * + * Example of expected JSON structure: + * @code + * { + * "timestamp": 999, + * "total": 351, + * "uids": { + * "userA": { "tot": 201, "msg": {"1": 200, "4": 1} }, + * "userB": { "tot": 150, "msg": {"2": 150} } + * } + * } + * @endcode + * + * Uses: + * - DatabaseAPITestHelper for invoking `newJsonMetricParse`. + * - nlohmann::json for building and comparing expected JSON output. + */ +BOOST_AUTO_TEST_CASE(testing_multiple_uids) { + DatabaseAPITestHelper db_api(url, user, pass); + + std::map> metrics = { + {"userA", {{0, 201}, {1, 200}, {4, 1}}}, {"userB", {{0, 150}, {2, 150}}}}; + + std::string result = db_api.newJsonMetricParse(999, 351, metrics); + + nlohmann::json expected; + expected["timestamp"] = 999; + expected["total"] = 351; + nlohmann::json uids; + uids["userA"] = {{"tot", 201}, {"msg", {{"1", 200}, {"4", 1}}}}; + uids["userB"] = {{"tot", 150}, {"msg", {{"2", 150}}}}; + expected["uids"] = uids; + + std::cout << "result" << std::endl; + std::cout << result << std::endl; + + std::cout << "expected" << std::endl; + std::cout << expected.dump(-1, ' ', true) << std::endl; + + BOOST_TEST(result == expected.dump(-1, ' ', true)); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/doc_source/source/admin/install_bare_metal.rst b/doc_source/source/admin/install_bare_metal.rst index 44171394d..ef14dd8e4 100644 --- a/doc_source/source/admin/install_bare_metal.rst +++ b/doc_source/source/admin/install_bare_metal.rst @@ -71,9 +71,9 @@ The npm packages needed primarily by the web server are: This can be done with a helper scripts these scripts are for ubuntu:: - ./DataFed/scripts/install_core_dependencies.sh - ./DataFed/scripts/install_repo_dependencies.sh - ./DataFed/scripts/install_ws_dependencies.sh + ./DataFed/external/DataFedDependencies/scripts/install_core_dependencies.sh + ./DataFed/external/DataFedDependencies/scripts/install_repo_dependencies.sh + ./DataFed/external/DataFedDependencies/scripts/install_ws_dependencies.sh The next step is to enter configuration options that are listed in ./config/datafed.sh. To generate a template for this file you will first need to run:: @@ -86,7 +86,6 @@ of the configuration options: 1. DATAFED_DEFAULT_LOG_PATH - Needed by core, repo, web services 2. DATAFED_DATABASE_PASSWORD - Needed by core 3. DATAFED_ZEROMQ_SESSION_SECRET - Needed by web server -4. DATAFED_ZEROMQ_SYSTEM_SECRET - Needed by web server 5. DATAFED_LEGO_EMAIL - Needed by web server 6. DATAFED_WEB_KEY_PATH - Needed by web server 7. DATAFED_WEB_CERT_PATH - Needed by web server diff --git a/doc_source/source/admin/install_docker.rst b/doc_source/source/admin/install_docker.rst index 2fbebce14..13feca1fe 100644 --- a/doc_source/source/admin/install_docker.rst +++ b/doc_source/source/admin/install_docker.rst @@ -67,7 +67,6 @@ of the relevant configuration options to an initial deployment: 1. DATAFED_GLOBUS_APP_SECRET 2. DATAFED_GLOBUS_APP_ID 3. DATAFED_ZEROMQ_SESSION_SECRET -4. DATAFED_ZEROMQ_SYSTEM_SECRET 5. DATAFED_DATABASE_PASSWORD 6. DATAFED_DATABASE_IP_ADDRESS 7. DATAFED_GCS_ROOT_NAME @@ -139,16 +138,16 @@ Here is an example for the core service: docker run -d \ --restart=always \ --name datafed-core \ + --user $(id -u):0 \ -e DATAFED_GLOBUS_APP_SECRET="" \ -e DATAFED_GLOBUS_APP_ID="" \ -e DATAFED_ZEROMQ_SESSION_SECRET="" \ - -e DATAFED_ZEROMQ_SYSTEM_SECRET="" \ -e DATAFED_DOMAIN="" \ -e DATAFED_DATABASE_PASSWORD="" \ -e DATAFED_DATABASE_IP_ADDRESS_PORT="" \ -e DATAFED_DEFAULT_LOG_PATH="" \ -e DATAFED_CORE_ADDRESS_PORT_INTERNAL="" \ - -e UID="" \ + --security-opt no-new-privileges \ --network datafed-network \ -p 7513:7513 \ -p 7512:7512 \ @@ -157,6 +156,16 @@ Here is an example for the core service: -v "/local/path/keys/datafed-core-key.priv:/opt/datafed/keys/datafed-core-key.priv" \ -t "datafed-core:latest" +If arango has been built with self signed certificates and the core service needs to communicate +with it, the following additional environment variables need to be added. + +``` +# An env variable to point to the certificate + -e SSL_CERT_FILE: "/opt/datafed/keys/datafed-arango.crt" +# A volume mount that actually mountes the .crt file + -v "/local/path/keys/datafed-arango.crt:/opt/datafed/keys/datafed-arango.crt" +``` + Web Service ------------ @@ -170,21 +179,20 @@ Here is an example for the web service: -e DATAFED_GLOBUS_APP_SECRET="" \ -e DATAFED_GLOBUS_APP_ID="" \ -e DATAFED_ZEROMQ_SESSION_SECRET="" \ - -e DATAFED_ZEROMQ_SYSTEM_SECRET="" \ -e DATAFED_DOMAIN="" \ - -e DATAFED_WEB_CERT_PATH="" \ - -e DATAFED_WEB_KEY_PATH="" \ + -e DATAFED_WEB_CERT_PATH="" \ + -e DATAFED_WEB_KEY_PATH="" \ -e DATAFED_DEFAULT_LOG_PATH="" \ -e DATAFED_CORE_ADDRESS_PORT_INTERNAL="" \ - -e DATAFED_GOOGLE_ANALYTICS_TAG="" \ + -e DATAFED_GOOGLE_ANALYTICS_TAG="" \ -e UID="" \ --network datafed-network \ -p 7513:7513 \ -p 7512:7512 \ -v "/local/path/logs:/datafed/logs" \ -v "/local/path/keys/datafed-core-key.pub:/opt/datafed/keys/datafed-core-key.pub" \ - -v "$DATAFED_WEB_CERT_PATH:$DATAFED_WEB_CERT_PATH" \ - -v "$DATAFED_WEB_KEY_PATH:$DATAFED_WEB_KEY_PATH" \ + -v "$DATAFED_WEB_CERT_PATH:$DATAFED_WEB_CERT_PATH" \ + -v "$DATAFED_WEB_KEY_PATH:$DATAFED_WEB_KEY_PATH" \ -t "datafed-web:latest" Repository Service @@ -200,7 +208,6 @@ Here is an example for the repository service: -e DATAFED_GLOBUS_APP_SECRET="" \ -e DATAFED_GLOBUS_APP_ID="" \ -e DATAFED_ZEROMQ_SESSION_SECRET="" \ - -e DATAFED_ZEROMQ_SYSTEM_SECRET="" \ -e DATAFED_HTTPS_SERVER_PORT="" \ -e DATAFED_DOMAIN="" \ -e DATAFED_DEFAULT_LOG_PATH="" \ @@ -230,7 +237,6 @@ Here is an example for the Globus Connect Server service: -e DATAFED_GLOBUS_APP_SECRET="" \ -e DATAFED_GLOBUS_APP_ID="" \ -e DATAFED_ZEROMQ_SESSION_SECRET="" \ - -e DATAFED_ZEROMQ_SYSTEM_SECRET="" \ -e DATAFED_HTTPS_SERVER_PORT="" \ -e DATAFED_DOMAIN="" \ -e DATAFED_CORE_ADDRESS_PORT_INTERNAL="" \ @@ -257,6 +263,26 @@ Here is an example for the Globus Connect Server service: Notice that the gcs container must run in host networking mode to avoid performance bottlenecks with GridFTP. +ArangoDB +------------- + +Notes on running arango in a container can be found on their official web site. I will only include here that if running the arango with ssl enabled the certificate must be passed in. + +.. code-block:: bash + + docker run -d \ + --restart=always \ + --network datafed-network \ + -p 8529:8529 \ + -v "/opt/datafed/keys/datafed-arango.pem:/usr/local/share/ca-certificates/datafed-arango.pem:ro" \ + -e ARANGO_ROOT_PASSWORD="" \ + arangodb/arangodb:latest \ + --ssl.keyfile /usr/local/share/ca-certificates/datafed-arango.pem \ + --server.endpoint ssl://0.0.0.0:8529 + + + + Nginx Service ------------- @@ -285,4 +311,4 @@ Networking If the web server and core server are on different machines you will need to ensure that they can communicate, this will require exchanging the public keys -that are in the /opt/datafed/keys folder. \ No newline at end of file +that are in the /opt/datafed/keys folder. diff --git a/doc_source/source/dev/testing.rst b/doc_source/source/dev/testing.rst index 99555357b..68b8af55a 100644 --- a/doc_source/source/dev/testing.rst +++ b/doc_source/source/dev/testing.rst @@ -60,16 +60,17 @@ Assuming you're at the root of the DataFed repository: Now, run the Foxx container with the appropriate environment variables to install the services and enable testing: -DATAFED_DATABASE_PASSWORD, and DATAFED_ZEROMQ_SYSTEM_SECRET can be anything but they should be consistent with what is in the config/datafed.sh file. +DATAFED_DATABASE_PASSWORD, can be anything but it should be consistent with what is in the config/datafed.sh file. .. code-block:: bash docker run \ -e DATAFED_DATABASE_PASSWORD="" \ - -e DATAFED_ZEROMQ_SYSTEM_SECRET="" \ -e INSTALL_FOXX=ON \ -e ENABLE_FOXX_TESTS=TRUE \ + --user $(id -u):0 \ --network=host \ + --security-opt no-new-privileges \ datafed-foxx:latest This will deploy the Foxx microservices and automatically execute the unit tests against the ArangoDB instance. diff --git a/docker/Dockerfile.dependencies b/docker/Dockerfile.dependencies deleted file mode 100644 index 8788a2b87..000000000 --- a/docker/Dockerfile.dependencies +++ /dev/null @@ -1,78 +0,0 @@ -ARG DATAFED_DIR="/datafed" -ARG DATAFED_INSTALL_PATH="/opt/datafed" -ARG DATAFED_DEPENDENCIES_INSTALL_PATH="/opt/datafed/dependencies" -ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" -ARG BUILD_DIR="$DATAFED_DIR/source" -ARG LIB_DIR="/opt/datafed/dependencies/lib" -ARG BASE_IMAGE="ubuntu:focal" - -FROM ${BASE_IMAGE} AS base - -SHELL ["/bin/bash", "-c"] -ARG DATAFED_DIR -ARG BUILD_DIR -ARG DATAFED_INSTALL_PATH -ARG DEBIAN_FRONTEND=noninteractive -ARG LIB_DIR -ARG DATAFED_DEPENDENCIES_INSTALL_PATH - -ENV BUILD_DIR="${BUILD_DIR}" -ENV DATAFED_DIR="${DATAFED_DIR}" -ENV DATAFED_DEPENDENCIES_INSTALL_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}" -ENV LIB_DIR="${LIB_DIR}" - -RUN mkdir -p ${BUILD_DIR} -RUN mkdir -p ${BUILD_DIR}/logs -RUN mkdir -p ${BUILD_DIR}/repository/server -RUN mkdir -p ${BUILD_DIR}/common/proto -RUN mkdir -p /libraries - -WORKDIR ${BUILD_DIR} - -# Copy install scripts -COPY ./scripts/dependency_install_functions.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/install_dependencies.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/utils.sh ${BUILD_DIR}/scripts/utils.sh -COPY ./scripts/install_docs_dependencies.sh ${BUILD_DIR}/scripts/ -COPY ./cmake/Web.cmake ${BUILD_DIR}/cmake/Web.cmake -COPY ./cmake/Version.cmake ${BUILD_DIR}/cmake/Version.cmake -COPY ./web/package.json.in ${BUILD_DIR}/web/package.json.in -COPY ./web/version.js.in ${BUILD_DIR}/web/version.js.in -COPY ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/generate_datafed.sh - -RUN echo "#!/bin/bash\n\$@" > /usr/bin/sudo && chmod +x /usr/bin/sudo - -# run build scripts -RUN ${BUILD_DIR}/scripts/generate_datafed.sh - -# Web dependencies -COPY ./scripts/install_ws_dependencies.sh ${BUILD_DIR}/scripts/ -RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC ${BUILD_DIR}/scripts/install_dependencies.sh -a -r -z -c - -# Core dependencies -COPY ./scripts/install_core_dependencies.sh ${BUILD_DIR}/scripts/ -RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC ${BUILD_DIR}/scripts/install_dependencies.sh -a -r -z -w - -# Repo dependencies -COPY ./scripts/install_repo_dependencies.sh ${BUILD_DIR}/scripts/ -RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC ${BUILD_DIR}/scripts/install_dependencies.sh -a -z -w -c - -# Authz dependencies -COPY ./scripts/install_authz_dependencies.sh ${BUILD_DIR}/scripts/ -RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC ${BUILD_DIR}/scripts/install_dependencies.sh -a -w -c -r - -COPY ./scripts/copy_dependency.sh ${BUILD_DIR}/scripts/ -RUN ${BUILD_DIR}/scripts/copy_dependency.sh protobuf from -RUN ${BUILD_DIR}/scripts/copy_dependency.sh protoc from -RUN ${BUILD_DIR}/scripts/copy_dependency.sh libzmq from -RUN ${BUILD_DIR}/scripts/copy_dependency.sh libsodium from -RUN ${BUILD_DIR}/scripts/copy_dependency.sh boost_program_options from -RUN ${BUILD_DIR}/scripts/copy_dependency.sh boost_filesystem from - -RUN mkdir -p ${DATAFED_INSTALL_PATH} -RUN mkdir -p ${DATAFED_INSTALL_PATH}/keys - -WORKDIR ${BUILD_DIR} - -COPY ./common ${BUILD_DIR}/common diff --git a/docker/Dockerfile.foxx b/docker/Dockerfile.foxx index 29b936d99..a94405282 100644 --- a/docker/Dockerfile.foxx +++ b/docker/Dockerfile.foxx @@ -2,17 +2,16 @@ # cd ${PROJECT_ROOT} or cd DataFed # docker build -f core/docker/Dockerfile . -ARG BUILD_BASE="ubuntu:focal" ARG DEPENDENCIES="dependencies" ARG RUNTIME="runtime" ARG DATAFED_DIR="/datafed" ARG DATAFED_INSTALL_PATH="/opt/datafed" ARG DATAFED_DEPENDENCIES_INSTALL_PATH="/opt/datafed/dependencies" -ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" ARG BUILD_DIR="$DATAFED_DIR/source" +ARG DATAFED_DEPENDENCIES_ROOT="$BUILD_DIR/external/DataFedDependencies" ARG NVM_DIR="$DATAFED_DIR/.nvm" -ARG NVM_INC="$DATAFED_DIR/.nvm/versions/node/v13.14.0/include/node" -ARG NVM_BIN="$DATAFED_DIR/.nvm/versions/node/v13.14.0/bin" +ARG NVM_INC="$DATAFED_DIR/.nvm/versions/node/v20.18.2/include/node" +ARG NVM_BIN="$DATAFED_DIR/.nvm/versions/node/v20.18.2/bin" ARG LIB_DIR="/usr/local/lib" FROM ${DEPENDENCIES} AS foxx-build @@ -21,6 +20,7 @@ ARG DATAFED_DIR ARG BUILD_DIR ARG DATAFED_INSTALL_PATH ARG DATAFED_DEPENDENCIES_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT # WARNING # @@ -29,16 +29,23 @@ ARG DATAFED_DEPENDENCIES_INSTALL_PATH # If PATH is different on the host you could create a broken container. ENV BUILD_DIR="${BUILD_DIR}" +ENV HOME="${BUILD_DIR}" ENV DATAFED_DIR="${DATAFED_DIR}" ENV DATAFED_DEPENDENCIES_INSTALL_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}" +ENV DATAFED_DEPENDENCIES_ROOT="${DATAFED_DEPENDENCIES_ROOT}" ENV DATAFED_INSTALL_PATH="$DATAFED_INSTALL_PATH" ENV DATAFED_DEFAULT_LOG_PATH="$DATAFED_INSTALL_PATH/logs" # Set to false by default to avoid wiping the database ENV ENABLE_FOXX_TESTS="FALSE" +RUN mkdir -p ${BUILD_DIR}/external/DataFedDependencies/scripts/ && \ + mv ./scripts/dependency_versions.sh ${BUILD_DIR}/external/DataFedDependencies/scripts/ && \ + mv ./scripts/dependency_install_functions.sh ${BUILD_DIR}/external/DataFedDependencies/scripts/ && \ + mv ./scripts/generate_dependencies_config.sh ${BUILD_DIR}/external/DataFedDependencies/scripts/ && \ + mv ./scripts/utils.sh ${BUILD_DIR}/external/DataFedDependencies/scripts/ + COPY ./core/CMakeLists.txt ${BUILD_DIR}/core/CMakeLists.txt COPY ./CMakeLists.txt ${BUILD_DIR} -COPY ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ COPY ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/ COPY ./cmake ${BUILD_DIR}/cmake COPY ./docker/entrypoint_foxx.sh ${BUILD_DIR}/docker/entrypoint_foxx.sh @@ -57,7 +64,7 @@ RUN curl -OL https://download.arangodb.com/arangodb312/DEBIAN/Release.key; apt-k # RUN echo 'deb https://download.arangodb.com/arangodb311/DEBIAN/ /' | tee /etc/apt/sources.list.d/arangodb.list # If trust the site but the gpg key has expired can add [trusted=yes] -# i.e. + RUN echo 'deb [trusted=yes] https://download.arangodb.com/arangodb312/DEBIAN/ /' | tee /etc/apt/sources.list.d/arangodb.list RUN apt update RUN apt install arangodb3-client -y @@ -65,6 +72,35 @@ RUN arangosh --version USER root +# Here we are selective with permissions because of the performance implications +# of changing permissions of everything when building. +RUN chown -R datafed:root /home/datafed \ + ${BUILD_DIR}/docker \ + ${BUILD_DIR}/config \ + ${BUILD_DIR}/scripts \ + ${BUILD_DIR}/core/ \ + ${BUILD_DIR}/common/ \ + ${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm \ + ${BUILD_DIR}/external/DataFedDependencies/ && \ + chown datafed:root ${BUILD_DIR} ${DATAFED_DEPENDENCIES_INSTALL_PATH} && \ + find ${BUILD_DIR}/config -maxdepth 1 -type f -exec chmod 0664 {} + && \ + find ${BUILD_DIR}/core/database -type f -exec chmod 0664 {} + && \ + find ${BUILD_DIR}/core -type d -exec chmod 0774 {} + && \ + find ${BUILD_DIR}/config -type d -exec chmod 0774 {} + && \ + find ${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm -type d -exec chmod 0774 {} + && \ + find ${DATAFED_DEPENDENCIES_ROOT} -type d -exec chmod 0774 {} + && \ + chmod 774 ${BUILD_DIR} \ + ${BUILD_DIR}/scripts \ + ${DATAFED_DEPENDENCIES_INSTALL_PATH} \ + ${BUILD_DIR}/core/database/tests/test_fixture_setup.sh \ + ${BUILD_DIR}/core/database/tests/test_foxx.sh \ + ${BUILD_DIR}/core/database/tests/test_teardown.sh \ + ${BUILD_DIR}/core/database/tests/test_setup.sh \ + ${BUILD_DIR}/docker/entrypoint_foxx.sh \ + ${BUILD_DIR}/scripts/generate_datafed.sh \ + ${BUILD_DIR}/scripts/install_foxx.sh +USER datafed + WORKDIR ${BUILD_DIR} ENTRYPOINT /datafed/source/docker/entrypoint_foxx.sh diff --git a/docker/Dockerfile.runtime b/docker/Dockerfile.runtime index 6742e4326..eb564dcc9 100644 --- a/docker/Dockerfile.runtime +++ b/docker/Dockerfile.runtime @@ -4,7 +4,7 @@ ARG DATAFED_DEPENDENCIES_INSTALL_PATH="/opt/datafed/dependencies" ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" ARG BUILD_DIR="$DATAFED_DIR/source" ARG LIB_DIR="/usr/local/lib" -ARG BASE_IMAGE="ubuntu:focal" +ARG BASE_IMAGE="debian:bookworm-slim" FROM ${BASE_IMAGE} AS base @@ -24,7 +24,6 @@ RUN echo $DATAFED_DIR RUN adduser --disabled-password --gecos "" datafed COPY ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/copy_dependency.sh ${BUILD_DIR}/scripts/ RUN mkdir -p ${DATAFED_DIR} RUN mkdir -p /opt/datafed RUN mkdir -p /var/log/datafed diff --git a/docker/entrypoint_foxx.sh b/docker/entrypoint_foxx.sh index ea60c6bee..45f890bb7 100755 --- a/docker/entrypoint_foxx.sh +++ b/docker/entrypoint_foxx.sh @@ -5,7 +5,7 @@ set -euf -o pipefail # NOTE We do not need to change the user in this container because we should not have # any log output, and running chmod to update all the folders during runtime is # expensive! -# +# # The following lines are not needed # if [ -n "$UID" ]; then # usermod -u $UID datafed @@ -15,46 +15,68 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../") -# Why is this flag used, it is used because the same container is used for +# Force installation of foxx api, even if the .foxx_is_installed touch +# file exists. +local_DATAFED_FORCE_INSTALL_FOXX="${DATAFED_FORCE_INSTALL_FOXX:-FALSE}" + +# Cleanup pre-existing files if they exist, you would think that the Cmake configure +# step would overwrite these files without problem. However, when running containers +# with openshift user settings, cmake complains if these files exist before hand +# under a different user. +if [ -f "${PROJECT_ROOT}/core/database/foxx/api/version_router.js" ]; then + rm "${PROJECT_ROOT}/core/database/foxx/api/version_router.js" +fi + +if [ -f "${PROJECT_ROOT}/core/database/foxx/manifest.json" ]; then + rm "${PROJECT_ROOT}/core/database/foxx/manifest.json" +fi + +install_flag="/tmp/.foxx_is_installed" +if [ "${local_DATAFED_FORCE_INSTALL_FOXX}" == "TRUE" ]; then + if [ -f "$install_flag" ]; then + rm "$install_flag" + fi +fi +# Why is this flag used, it is used because the same container is used for # compose as is for operations and ci. If you have a compose dev environment # we may want to keep the existing state and not overwrite the database. install_flag="/tmp/.foxx_is_installed" -if [ ! -f "$install_flag" ] -then +if [ ! -f "$install_flag" ]; then echo "Installing foxx." log_path="$DATAFED_DEFAULT_LOG_PATH" - if [ ! -d "${log_path}" ] - then - su -c "mkdir -p ${log_path}" datafed + if [ ! -d "${log_path}" ]; then + mkdir -p "${log_path}" datafed fi - + # It should be fine to run this as root because it is an ephemeral container anyway cd "${PROJECT_ROOT}" # Check to see if foxx has previously been installed "${PROJECT_ROOT}/scripts/generate_datafed.sh" - # Define common CMake options - cmake_options=( - -S. -B build - -DBUILD_REPO_SERVER=False - -DBUILD_COMMON=False - -DBUILD_AUTHZ=False - -DBUILD_CORE_SERVER=False - -DBUILD_WEB_SERVER=False - -DBUILD_DOCS=False - -DBUILD_PYTHON_CLIENT=False - -DBUILD_FOXX=True - -DINSTALL_FOXX=True - ) - - # Add the ENABLE_FOXX_TESTS option if it's set to TRUE + export LD_LIBRARY_PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH/lib" + + # Define common CMake options + cmake_options=( + -S. -B build + -DBUILD_REPO_SERVER=False + -DBUILD_COMMON=False + -DBUILD_AUTHZ=False + -DBUILD_CORE_SERVER=False + -DBUILD_WEB_SERVER=False + -DBUILD_DOCS=False + -DBUILD_PYTHON_CLIENT=False + -DBUILD_FOXX=True + -DINSTALL_FOXX=True + ) + + # Add the ENABLE_FOXX_TESTS option if it's set to TRUE # Should only run this if you are ok with making changes to the database - if [ "$ENABLE_FOXX_TESTS" == "TRUE" ]; then - cmake_options+=(-DENABLE_FOXX_TESTS=True) - fi + if [ "$ENABLE_FOXX_TESTS" == "TRUE" ]; then + cmake_options+=(-DENABLE_FOXX_TESTS=True) + fi - # Run the CMake command with the constructed options - "${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake" "${cmake_options[@]}" + # Run the CMake command with the constructed options + "${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake" "${cmake_options[@]}" "${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake" --build build @@ -63,8 +85,7 @@ then sleep 5 "${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake" --build build --target install - if [ "$ENABLE_FOXX_TESTS" == "TRUE" ] - then + if [ "$ENABLE_FOXX_TESTS" == "TRUE" ]; then "${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake" \ --build build \ --target test @@ -72,9 +93,8 @@ then if [ "$EXIT_CODE" != "0" ]; then exit "$EXIT_CODE"; fi fi - # Create flag to indicate container has done its job + # Create flag to indicate container has done its job touch "$install_flag" - chown -R "$UID":"$UID" "/tmp" else echo "$install_flag has been found skipping reinstall" fi diff --git a/docs/_sources/admin/general.rst.txt b/docs/_sources/admin/general.rst.txt index 4003f9ee3..20eca8ba8 100644 --- a/docs/_sources/admin/general.rst.txt +++ b/docs/_sources/admin/general.rst.txt @@ -74,9 +74,9 @@ The npm packages needed primarily by the web server are: This can be done with a helper scripts these scripts are for ubuntu:: - ./DataFed/scripts/install_core_dependencies.sh - ./DataFed/scripts/install_repo_dependencies.sh - ./DataFed/scripts/install_ws_dependencies.sh + ./DataFed/external/DataFedDependencies/scripts/install_core_dependencies.sh + ./DataFed/external/DataFedDependencies/scripts/install_repo_dependencies.sh + ./DataFed/external/DataFedDependencies/scripts/install_ws_dependencies.sh The next step is to enter configuration options that are listed in ./config/datafed.sh. To generate a template for this file you will first need to run:: @@ -89,7 +89,6 @@ of the configuration options: 1. DATAFED_DEFAULT_LOG_PATH - Needed by core, repo, web services 2. DATAFED_DATABASE_PASSWORD - Needed by core 3. DATAFED_ZEROMQ_SESSION_SECRET - Needed by web server -4. DATAFED_ZEROMQ_SYSTEM_SECRET - Needed by web server 5. DATAFED_LEGO_EMAIL - Needed by web server 6. DATAFED_WEB_KEY_PATH - Needed by web server 7. DATAFED_WEB_CERT_PATH - Needed by web server diff --git a/docs/_static/js/badge_only.js b/docs/_static/js/badge_only.js index 0b0a813fc..6556eec86 100644 --- a/docs/_static/js/badge_only.js +++ b/docs/_static/js/badge_only.js @@ -3,18 +3,18 @@ function r(n) { if (t[n]) return t[n].exports; var o = (t[n] = { i: n, l: !1, exports: {} }); - return e[n].call(o.exports, o, o.exports, r), (o.l = !0), o.exports; + return (e[n].call(o.exports, o, o.exports, r), (o.l = !0), o.exports); } - (r.m = e), + ((r.m = e), (r.c = t), (r.d = function (e, t, n) { r.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: n }); }), (r.r = function (e) { - "undefined" != typeof Symbol && + ("undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), - Object.defineProperty(e, "__esModule", { value: !0 }); + Object.defineProperty(e, "__esModule", { value: !0 })); }), (r.t = function (e, t) { if ((1 & t && (e = r(e)), 8 & t)) return e; @@ -44,11 +44,11 @@ : function () { return e; }; - return r.d(t, "a", t), t; + return (r.d(t, "a", t), t); }), (r.o = function (e, t) { return Object.prototype.hasOwnProperty.call(e, t); }), (r.p = ""), - r((r.s = 4)); + r((r.s = 4))); })({ 4: function (e, t, r) {} }); diff --git a/docs/_static/js/html5shiv-printshiv.min.js b/docs/_static/js/html5shiv-printshiv.min.js index 414bf5e58..72406b792 100644 --- a/docs/_static/js/html5shiv-printshiv.min.js +++ b/docs/_static/js/html5shiv-printshiv.min.js @@ -6,7 +6,8 @@ var c = a.createElement("p"), d = a.getElementsByTagName("head")[0] || a.documentElement; return ( - (c.innerHTML = "x"), d.insertBefore(c.lastChild, d.firstChild) + (c.innerHTML = "x"), + d.insertBefore(c.lastChild, d.firstChild) ); } function d() { @@ -15,14 +16,14 @@ } function e(a, b) { var c = y.elements; - "string" != typeof c && (c = c.join(" ")), + ("string" != typeof c && (c = c.join(" ")), "string" != typeof a && (a = a.join(" ")), (y.elements = c + " " + a), - j(b); + j(b)); } function f(a) { var b = x[a[v]]; - return b || ((b = {}), w++, (a[v] = w), (x[w] = b)), b; + return (b || ((b = {}), w++, (a[v] = w), (x[w] = b)), b); } function g(a, c, d) { if ((c || (c = b), q)) return c.createElement(a); @@ -45,7 +46,7 @@ return e; } function i(a, b) { - b.cache || + (b.cache || ((b.cache = {}), (b.createElem = a.createElement), (b.createFrag = a.createDocumentFragment), @@ -59,10 +60,10 @@ d() .join() .replace(/[\w\-:]+/g, function (a) { - return b.createElem(a), b.frag.createElement(a), 'c("' + a + '")'; + return (b.createElem(a), b.frag.createElement(a), 'c("' + a + '")'); }) + ");return n}", - )(y, b.frag)); + )(y, b.frag))); } function j(a) { a || (a = b); @@ -89,7 +90,7 @@ e--; ) - (b = c[e]), f.test(b.nodeName) && g.push(b.applyElement(l(b))); + ((b = c[e]), f.test(b.nodeName) && g.push(b.applyElement(l(b)))); return g; } function l(a) { @@ -101,8 +102,8 @@ d--; ) - (b = c[d]), b.specified && e.setAttribute(b.nodeName, b.nodeValue); - return (e.style.cssText = a.style.cssText), e; + ((b = c[d]), b.specified && e.setAttribute(b.nodeName, b.nodeValue)); + return ((e.style.cssText = a.style.cssText), e); } function m(a) { for ( @@ -114,9 +115,9 @@ e--; ) - (b = c[e] = c[e].split("}")), + ((b = c[e] = c[e].split("}")), (b[b.length - 1] = b[b.length - 1].replace(f, g)), - (c[e] = b.join("}")); + (c[e] = b.join("}"))); return c.join("{"); } function n(a) { @@ -124,7 +125,7 @@ } function o(a) { function b() { - clearTimeout(g._removeSheetTimer), d && d.removeNode(!0), (d = null); + (clearTimeout(g._removeSheetTimer), d && d.removeNode(!0), (d = null)); } var d, e, @@ -141,7 +142,7 @@ for (; (h = n.pop()); ) if (!h.disabled && z.test(h.media)) { try { - (f = h.imports), (g = f.length); + ((f = h.imports), (g = f.length)); } catch (o) { g = 0; } @@ -150,12 +151,12 @@ j.push(h.cssText); } catch (o) {} } - (j = m(j.reverse().join(""))), (e = k(a)), (d = c(a, j)); + ((j = m(j.reverse().join(""))), (e = k(a)), (d = c(a, j))); }), i.attachEvent("onafterprint", function () { - n(e), + (n(e), clearTimeout(g._removeSheetTimer), - (g._removeSheetTimer = setTimeout(b, 500)); + (g._removeSheetTimer = setTimeout(b, 500))); }), (a.printShived = !0), a); @@ -173,7 +174,7 @@ !(function () { try { var a = b.createElement("a"); - (a.innerHTML = ""), + ((a.innerHTML = ""), (p = "hidden" in a), (q = 1 == a.childNodes.length || @@ -185,9 +186,9 @@ "undefined" == typeof a.createDocumentFragment || "undefined" == typeof a.createElement ); - })()); + })())); } catch (c) { - (p = !0), (q = !0); + ((p = !0), (q = !0)); } })(); var y = { @@ -204,7 +205,7 @@ createDocumentFragment: h, addElements: e, }; - (a.html5 = y), j(b); + ((a.html5 = y), j(b)); var z = /^$|\b(?:all|print)\b/, A = "html5shiv", B = @@ -219,8 +220,8 @@ "undefined" == typeof a.attachEvent ); })(); - (y.type += " print"), + ((y.type += " print"), (y.shivPrint = o), o(b), - "object" == typeof module && module.exports && (module.exports = y); + "object" == typeof module && module.exports && (module.exports = y)); })("undefined" != typeof window ? window : this, document); diff --git a/docs/_static/js/html5shiv.min.js b/docs/_static/js/html5shiv.min.js index 8a8d7c549..e2d889711 100644 --- a/docs/_static/js/html5shiv.min.js +++ b/docs/_static/js/html5shiv.min.js @@ -6,7 +6,8 @@ var c = a.createElement("p"), d = a.getElementsByTagName("head")[0] || a.documentElement; return ( - (c.innerHTML = "x"), d.insertBefore(c.lastChild, d.firstChild) + (c.innerHTML = "x"), + d.insertBefore(c.lastChild, d.firstChild) ); } function d() { @@ -15,14 +16,14 @@ } function e(a, b) { var c = t.elements; - "string" != typeof c && (c = c.join(" ")), + ("string" != typeof c && (c = c.join(" ")), "string" != typeof a && (a = a.join(" ")), (t.elements = c + " " + a), - j(b); + j(b)); } function f(a) { var b = s[a[q]]; - return b || ((b = {}), r++, (a[q] = r), (s[r] = b)), b; + return (b || ((b = {}), r++, (a[q] = r), (s[r] = b)), b); } function g(a, c, d) { if ((c || (c = b), l)) return c.createElement(a); @@ -45,7 +46,7 @@ return e; } function i(a, b) { - b.cache || + (b.cache || ((b.cache = {}), (b.createElem = a.createElement), (b.createFrag = a.createDocumentFragment), @@ -59,10 +60,10 @@ d() .join() .replace(/[\w\-:]+/g, function (a) { - return b.createElem(a), b.frag.createElement(a), 'c("' + a + '")'; + return (b.createElem(a), b.frag.createElement(a), 'c("' + a + '")'); }) + ");return n}", - )(t, b.frag)); + )(t, b.frag))); } function j(a) { a || (a = b); @@ -92,7 +93,7 @@ !(function () { try { var a = b.createElement("a"); - (a.innerHTML = ""), + ((a.innerHTML = ""), (k = "hidden" in a), (l = 1 == a.childNodes.length || @@ -104,9 +105,9 @@ "undefined" == typeof a.createDocumentFragment || "undefined" == typeof a.createElement ); - })()); + })())); } catch (c) { - (k = !0), (l = !0); + ((k = !0), (l = !0)); } })(); var t = { @@ -123,5 +124,5 @@ createDocumentFragment: h, addElements: e, }; - (a.html5 = t), j(b), "object" == typeof module && module.exports && (module.exports = t); + ((a.html5 = t), j(b), "object" == typeof module && module.exports && (module.exports = t)); })("undefined" != typeof window ? window : this, document); diff --git a/docs/_static/js/theme.js b/docs/_static/js/theme.js index 5067be622..a3d60fa04 100644 --- a/docs/_static/js/theme.js +++ b/docs/_static/js/theme.js @@ -3,18 +3,18 @@ function t(i) { if (e[i]) return e[i].exports; var o = (e[i] = { i: i, l: !1, exports: {} }); - return n[i].call(o.exports, o, o.exports, t), (o.l = !0), o.exports; + return (n[i].call(o.exports, o, o.exports, t), (o.l = !0), o.exports); } - (t.m = n), + ((t.m = n), (t.c = e), (t.d = function (n, e, i) { t.o(n, e) || Object.defineProperty(n, e, { enumerable: !0, get: i }); }), (t.r = function (n) { - "undefined" != typeof Symbol && + ("undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }), - Object.defineProperty(n, "__esModule", { value: !0 }); + Object.defineProperty(n, "__esModule", { value: !0 })); }), (t.t = function (n, e) { if ((1 & e && (n = t(n)), 8 & e)) return n; @@ -44,21 +44,21 @@ : function () { return n; }; - return t.d(e, "a", e), e; + return (t.d(e, "a", e), e); }), (t.o = function (n, e) { return Object.prototype.hasOwnProperty.call(n, e); }), (t.p = ""), - t((t.s = 0)); + t((t.s = 0))); })([ function (n, e, t) { - t(1), (n.exports = t(3)); + (t(1), (n.exports = t(3))); }, function (n, e, t) { (function () { var e = "undefined" != typeof window ? window.jQuery : t(2); - (n.exports.ThemeNav = { + ((n.exports.ThemeNav = { navBar: null, win: null, winScroll: !1, @@ -70,11 +70,11 @@ isRunning: !1, enable: function (n) { var t = this; - void 0 === n && (n = !0), + (void 0 === n && (n = !0), t.isRunning || ((t.isRunning = !0), e(function (e) { - t.init(e), + (t.init(e), t.reset(), t.win.on("hashchange", t.reset), n && @@ -93,8 +93,8 @@ t.onResize(); })); }), - t.onResize(); - })); + t.onResize()); + }))); }, enableSticky: function () { this.enable(!0); @@ -102,19 +102,19 @@ init: function (n) { n(document); var e = this; - (this.navBar = n("div.wy-side-scroll:first")), + ((this.navBar = n("div.wy-side-scroll:first")), (this.win = n(window)), n(document) .on("click", "[data-toggle='wy-nav-top']", function () { - n("[data-toggle='wy-nav-shift']").toggleClass("shift"), - n("[data-toggle='rst-versions']").toggleClass("shift"); + (n("[data-toggle='wy-nav-shift']").toggleClass("shift"), + n("[data-toggle='rst-versions']").toggleClass("shift")); }) .on("click", ".wy-menu-vertical .current ul li a", function () { var t = n(this); - n("[data-toggle='wy-nav-shift']").removeClass("shift"), + (n("[data-toggle='wy-nav-shift']").removeClass("shift"), n("[data-toggle='rst-versions']").toggleClass("shift"), e.toggleCurrent(t), - e.hashChange(); + e.hashChange()); }) .on("click", "[data-toggle='rst-current-version']", function () { n("[data-toggle='rst-versions']").toggleClass("shift-up"); @@ -133,14 +133,14 @@ .siblings("a") .each(function () { var t = n(this); - (expand = n( + ((expand = n( '', )), expand.on("click", function (n) { - return e.toggleCurrent(t), n.stopPropagation(), !1; + return (e.toggleCurrent(t), n.stopPropagation(), !1); }), - t.prepend(expand); - }); + t.prepend(expand)); + })); }, reset: function () { var n = encodeURI(window.location.hash) || "#"; @@ -155,7 +155,7 @@ (t = e.find('[href="#"]')); } if (t.length > 0) { - $(".wy-menu-vertical .current") + ($(".wy-menu-vertical .current") .removeClass("current") .attr("aria-expanded", "false"), t.addClass("current").attr("aria-expanded", "true"), @@ -163,7 +163,7 @@ .closest("li.toctree-l1") .parent() .addClass("current") - .attr("aria-expanded", "true"); + .attr("aria-expanded", "true")); for (let n = 1; n <= 10; n++) t.closest("li.toctree-l" + n) .addClass("current") @@ -184,24 +184,24 @@ (this.navBar.scrollTop(t), (this.winPosition = n)); }, onResize: function () { - (this.winResize = !1), + ((this.winResize = !1), (this.winHeight = this.win.height()), - (this.docHeight = $(document).height()); + (this.docHeight = $(document).height())); }, hashChange: function () { - (this.linkScroll = !0), + ((this.linkScroll = !0), this.win.one("hashchange", function () { this.linkScroll = !1; - }); + })); }, toggleCurrent: function (n) { var e = n.closest("li"); - e.siblings("li.current").removeClass("current").attr("aria-expanded", "false"), + (e.siblings("li.current").removeClass("current").attr("aria-expanded", "false"), e .siblings() .find("li.current") .removeClass("current") - .attr("aria-expanded", "false"); + .attr("aria-expanded", "false")); var t = e.find("> ul li"); t.length && (t.removeClass("current").attr("aria-expanded", "false"), @@ -221,24 +221,24 @@ t < e.length && !window.requestAnimationFrame; ++t ) - (window.requestAnimationFrame = window[e[t] + "RequestAnimationFrame"]), + ((window.requestAnimationFrame = window[e[t] + "RequestAnimationFrame"]), (window.cancelAnimationFrame = window[e[t] + "CancelAnimationFrame"] || - window[e[t] + "CancelRequestAnimationFrame"]); - window.requestAnimationFrame || + window[e[t] + "CancelRequestAnimationFrame"])); + (window.requestAnimationFrame || (window.requestAnimationFrame = function (e, t) { var i = new Date().getTime(), o = Math.max(0, 16 - (i - n)), r = window.setTimeout(function () { e(i + o); }, o); - return (n = i + o), r; + return ((n = i + o), r); }), window.cancelAnimationFrame || (window.cancelAnimationFrame = function (n) { clearTimeout(n); - }); - })(); + })); + })()); }).call(window); }, function (n, e) { diff --git a/docs/admin/general.html b/docs/admin/general.html index ef58285ea..9e5987089 100644 --- a/docs/admin/general.html +++ b/docs/admin/general.html @@ -178,9 +178,9 @@

Downloading DataFed & Installing Dependencies

  • client-oauth2

  • This can be done with a helper scripts these scripts are for ubuntu:

    -
    ./DataFed/scripts/install_core_dependencies.sh
    -./DataFed/scripts/install_repo_dependencies.sh
    -./DataFed/scripts/install_ws_dependencies.sh
    +
    ./DataFed/external/DataFedDependencies/scripts/install_core_dependencies.sh
    +./DataFed/external/DataFedDependencies/scripts/install_repo_dependencies.sh
    +./DataFed/external/DataFedDependencies/scripts/install_ws_dependencies.sh
     

    The next step is to enter configuration options that are listed in ./config/datafed.sh. To @@ -194,7 +194,6 @@

    Downloading DataFed & Installing Dependencies

  • DATAFED_DEFAULT_LOG_PATH - Needed by core, repo, web services

  • DATAFED_DATABASE_PASSWORD - Needed by core

  • DATAFED_ZEROMQ_SESSION_SECRET - Needed by web server

  • -
  • DATAFED_ZEROMQ_SYSTEM_SECRET - Needed by web server

  • DATAFED_LEGO_EMAIL - Needed by web server

  • DATAFED_WEB_KEY_PATH - Needed by web server

  • DATAFED_WEB_CERT_PATH - Needed by web server

  • diff --git a/external/DataFedDependencies b/external/DataFedDependencies new file mode 160000 index 000000000..40b809405 --- /dev/null +++ b/external/DataFedDependencies @@ -0,0 +1 @@ +Subproject commit 40b80940525c05229a81c437763dbde915f06a12 diff --git a/external/globus-connect-server-deploy b/external/globus-connect-server-deploy index 38a40b7a0..ff7167860 160000 --- a/external/globus-connect-server-deploy +++ b/external/globus-connect-server-deploy @@ -1 +1 @@ -Subproject commit 38a40b7a00f86b2355663680c328c1fef3311f6a +Subproject commit ff7167860345e9b994110dfabdb251fe4dea8c00 diff --git a/external/protobuf b/external/protobuf deleted file mode 160000 index a9b006bdd..000000000 --- a/external/protobuf +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a9b006bddd52e289029f16aa77b77e8e0033d9ee diff --git a/python/datafed_pkg/requirements.txt b/python/datafed_pkg/requirements.txt deleted file mode 100644 index ab83b039c..000000000 --- a/python/datafed_pkg/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -protobuf>=5.27.1 -pyzmq>=16 -wget>=3 -requests>=2 -click>=7 -prompt_toolkit>=2 diff --git a/python/datafed_pkg/test/security.py b/python/datafed_pkg/test/security.py index 1ac258bb7..d9b479c1a 100755 --- a/python/datafed_pkg/test/security.py +++ b/python/datafed_pkg/test/security.py @@ -20,7 +20,6 @@ msg.password = "temptemp" msg.name = "New User" msg.email = "NewUser@foo.bar" -msg.secret = "dfgdfg" print("sending") diff --git a/python/docker/Dockerfile.python-client-base.ubuntu b/python/docker/Dockerfile.python-client-base.ubuntu index 53102ac43..be84235cd 100644 --- a/python/docker/Dockerfile.python-client-base.ubuntu +++ b/python/docker/Dockerfile.python-client-base.ubuntu @@ -14,7 +14,7 @@ COPY ./scripts/dependency_install_functions.sh ${BUILD_DIR}/scripts/ COPY ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ COPY ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/ COPY ./scripts/utils.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/install_python_client_dependencies.sh ${BUILD_DIR}/scripts/ +COPY ./external/DataFedDependencies/scripts/install_python_client_dependencies.sh ${BUILD_DIR}/scripts/ RUN echo "#!/bin/bash\n\$@" > /usr/bin/sudo && chmod +x /usr/bin/sudo RUN ${BUILD_DIR}/scripts/generate_datafed.sh diff --git a/python/docker/entrypoint.sh b/python/docker/entrypoint.sh index f9573344f..0bc7c360d 100755 --- a/python/docker/entrypoint.sh +++ b/python/docker/entrypoint.sh @@ -5,7 +5,7 @@ set -euf -o pipefail SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") -# Entry point file expects that the directory where the DataFed source file +# Entry point file expects that the directory where the DataFed source file # is passed in as the first argument echo "SOURCE BUILD DIR $BUILD_DIR" @@ -20,7 +20,7 @@ source "${BUILD_DIR}/config/datafed.sh" mkdir -p "/home/datafed/.datafed" # At this point we will create an ini file -cat << EOF > "/home/datafed/.datafed/datafed-client.ini" +cat <"/home/datafed/.datafed/datafed-client.ini" [server] host = ${DATAFED_DOMAIN} port = ${DATAFED_SERVER_PORT} @@ -37,4 +37,3 @@ if [ "$#" -eq 0 ]; then fi "$@" - diff --git a/repository/docker/Dockerfile b/repository/docker/Dockerfile index 054be48c2..9fa693142 100644 --- a/repository/docker/Dockerfile +++ b/repository/docker/Dockerfile @@ -2,15 +2,16 @@ # cd ${PROJECT_ROOT} or cd DataFed # docker build -f repository/docker/Dockerfile . -ARG BUILD_BASE="ubuntu:focal" -ARG DEPENDENCIES="dependencies" -ARG RUNTIME="runtime" -ARG DATAFED_DIR="/datafed" -ARG DATAFED_INSTALL_PATH="/opt/datafed" +ARG BUILD_BASE="debian:bookworm-slim" +ARG DEPENDENCIES="dependencies" +ARG RUNTIME="runtime" +ARG DATAFED_DIR="/datafed" +ARG DATAFED_INSTALL_PATH="/opt/datafed" ARG DATAFED_DEPENDENCIES_INSTALL_PATH="/opt/datafed/dependencies" -ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" -ARG BUILD_DIR="$DATAFED_DIR/source" -ARG LIB_DIR="/usr/local/lib" +ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" +ARG BUILD_DIR="$DATAFED_DIR/source" +ARG LIB_DIR="/usr/local/lib" +ARG DATAFED_DEPENDENCIES_ROOT="$BUILD_DIR/external/DataFedDependencies" FROM ${DEPENDENCIES} AS repo-build @@ -18,34 +19,41 @@ SHELL ["/bin/bash", "-c"] ARG DATAFED_DIR ARG BUILD_DIR ARG DATAFED_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT ARG DATAFED_DEPENDENCIES_INSTALL_PATH ENV DATAFED_INSTALL_PATH="$DATAFED_INSTALL_PATH" # This port is needed to communicate with the DataFed core server EXPOSE 7512 # Not quite sure what 9000 is doing that 7512 isn't, difference between egress + # and ingress? EXPOSE 9000 +RUN mkdir -p ${DATAFED_DEPENDENCIES_ROOT}/scripts/ && \ + mv ./scripts/dependency_versions.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/ && \ + mv ./scripts/dependency_install_functions.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/ && \ + mv ./scripts/generate_dependencies_config.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/ + +COPY ./common ${BUILD_DIR}/common COPY ./repository/CMakeLists.txt ${BUILD_DIR}/repository/CMakeLists.txt COPY ./CMakeLists.txt ${BUILD_DIR} -COPY ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/dependency_install_functions.sh ${BUILD_DIR}/scripts/ COPY ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/ COPY ./scripts/generate_repo_config.sh ${BUILD_DIR}/scripts/ COPY ./scripts/install_repo.sh ${BUILD_DIR}/scripts/ COPY ./cmake ${BUILD_DIR}/cmake COPY ./repository/server ${BUILD_DIR}/repository/server -RUN ${BUILD_DIR}/scripts/generate_datafed.sh && \ - ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake -S. -B build \ - -DBUILD_REPO_SERVER=True \ - -DBUILD_AUTHZ=False \ - -DBUILD_CORE_SERVER=False \ - -DBUILD_WEB_SERVER=False \ - -DBUILD_DOCS=False \ - -DBUILD_PYTHON_CLIENT=False \ - -DBUILD_FOXX=False +RUN ${DATAFED_DEPENDENCIES_ROOT}/scripts/generate_dependencies_config.sh && \ + ${BUILD_DIR}/scripts/generate_datafed.sh && \ + ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake -S. -B build \ + -DBUILD_REPO_SERVER=True \ + -DBUILD_AUTHZ=False \ + -DBUILD_CORE_SERVER=False \ + -DBUILD_WEB_SERVER=False \ + -DBUILD_DOCS=False \ + -DBUILD_PYTHON_CLIENT=False \ + -DBUILD_FOXX=False RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build -j 8 RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build --target install @@ -57,38 +65,40 @@ ARG DATAFED_INSTALL_PATH ARG BUILD_DIR ARG LIB_DIR ARG DATAFED_DEPENDENCIES_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT # The above should also be available at runtime ENV DATAFED_INSTALL_PATH="$DATAFED_INSTALL_PATH" ENV DATAFED_DEPENDENCIES_INSTALL_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}" ENV DATAFED_GCS_COLLECTION_BASE_PATH="/mnt/datafed" ENV DATAFED_GCS_COLLECTION_ROOT_PATH="/mnt/datafed" +ENV DATAFED_DEPENDENCIES_ROOT="$DATAFED_DEPENDENCIES_ROOT" ENV DATAFED_REPO_ID_AND_DIR="home" ENV DATAFED_DIR="$DATAFED_DIR" ENV BUILD_DIR="$BUILD_DIR" ENV LIB_DIR="$LIB_DIR" -WORKDIR /datafed +WORKDIR ${BUILD_DIR} -COPY --from=repo-build /libraries/libboost_program_options.so /libraries/libboost_program_options.so -COPY --from=repo-build /libraries/libboost_filesystem.so /libraries/libboost_filesystem.so -RUN ${BUILD_DIR}/scripts/copy_dependency.sh boost_program_options to -RUN ${BUILD_DIR}/scripts/copy_dependency.sh boost_filesystem to +COPY --from=repo-build --chown=datafed:root ${DATAFED_DEPENDENCIES_ROOT}/scripts ${DATAFED_DEPENDENCIES_ROOT}/scripts +COPY --from=repo-build /usr/lib/x86_64-linux-gnu/libboost_program_options.so /usr/lib/x86_64-linux-gnu/libboost_program_options.so +COPY --from=repo-build /usr/lib/x86_64-linux-gnu/libboost_filesystem.so /usr/lib/x86_64-linux-gnu/libboost_filesystem.so RUN ldconfig USER datafed -COPY --chown=datafed:root ./scripts/generate_datafed.sh ${DATAFED_DIR}/scripts/generate_datafed.sh -COPY --chown=datafed:root ./scripts/generate_repo_config.sh ${DATAFED_DIR}/scripts/generate_repo_config.sh -COPY --chown=datafed:root ./scripts/install_repo.sh ${DATAFED_DIR}/scripts/install_repo.sh -COPY --chown=datafed:root ./cmake/Version.cmake ${DATAFED_DIR}/cmake/Version.cmake -COPY --chown=datafed:root ./repository/docker/entrypoint_repo.sh ${BUILD_DIR}/repository/entrypoint.sh +COPY --chown=datafed:root ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/generate_datafed.sh +COPY --chown=datafed:root ./scripts/generate_repo_config.sh ${BUILD_DIR}/scripts/generate_repo_config.sh +COPY --chown=datafed:root ./scripts/install_repo.sh ${BUILD_DIR}/scripts/install_repo.sh +COPY --chown=datafed:root ./cmake/Version.cmake ${BUILD_DIR}/cmake/Version.cmake +COPY --chown=datafed:root ./repository/docker/entrypoint_repo.sh ${BUILD_DIR}/repository/docker/entrypoint.sh COPY --from=repo-build --chown=datafed:root ${DATAFED_INSTALL_PATH}/repo/datafed-repo ${DATAFED_INSTALL_PATH}/repo/datafed-repo USER root -RUN chown -R datafed:root /datafed -RUN chown -R datafed:root /opt +RUN chown -R datafed:root /datafed /opt \ + ${DATAFED_DEPENDENCIES_ROOT} && \ + find ${DATAFED_DEPENDENCIES_ROOT} -type d -exec chmod 0774 {} + -ENTRYPOINT [ "/datafed/source/repository/entrypoint.sh", "/opt/datafed/repo/datafed-repo","--cfg","/opt/datafed/repo/datafed-repo.cfg"] +ENTRYPOINT [ "/datafed/source/repository/docker/entrypoint.sh", "/opt/datafed/repo/datafed-repo","--cfg","/opt/datafed/repo/datafed-repo.cfg"] diff --git a/repository/docker/Dockerfile.gcs b/repository/docker/Dockerfile.gcs index 09d2ee4cf..41521c7f9 100644 --- a/repository/docker/Dockerfile.gcs +++ b/repository/docker/Dockerfile.gcs @@ -1,7 +1,5 @@ # NOTE this image must be built with respect to the base of the project i.e. -# cd ${PROJECT_ROOT} or cd DataFed -# docker build -f repository/docker/Dockerfile.gcs . -ARG BUILD_BASE="ubuntu:focal" +ARG BUILD_BASE="debian:bookworm-slim" ARG DEPENDENCIES="dependencies" ARG RUNTIME="runtime" ARG DATAFED_DIR="/datafed" @@ -13,15 +11,76 @@ ARG NVM_DIR="$DATAFED_DIR/.nvm" ARG NVM_INC="$DATAFED_DIR/.nvm/versions/node/v13.14.0/include/node" ARG NVM_BIN="$DATAFED_DIR/.nvm/versions/node/v13.14.0/bin" ARG LIB_DIR="/usr/local/lib" +ARG DATAFED_DEPENDENCIES_ROOT="$BUILD_DIR/external/DataFedDependencies" FROM ${DEPENDENCIES} AS dependencies +ARG DATAFED_DIR +ARG BUILD_DIR +ARG DATAFED_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT +ARG LIB_DIR + +ENV DATAFED_DEPENDENCIES_INSTALL_PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH" +ENV DATAFED_GCS_COLLECTION_BASE_PATH="/mnt/datafed" +ENV DATAFED_GCS_COLLECTION_ROOT_PATH="/mnt/datafed" +ENV DATAFED_GLOBUS_CRED_FILE_PATH=/opt/datafed/globus/client_cred.json +ENV DATAFED_INSTALL_PATH="$DATAFED_INSTALL_PATH" +ENV DATAFED_DIR="$DATAFED_DIR" +ENV BUILD_DIR="$BUILD_DIR" +ENV LIB_DIR="$LIB_DIR" +ENV DATAFED_GLOBUS_REPO_USER="datafed" +ENV DATAFED_DEFAULT_LOG_PATH="$DATAFED_INSTALL_PATH/logs" +ENV DATAFED_DEPENDENCIES_ROOT="$DATAFED_DEPENDENCIES_ROOT" + +RUN mkdir -p ${DATAFED_DEPENDENCIES_ROOT}/scripts/ && \ + mv ./scripts/dependency_versions.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/ && \ + mv ./scripts/utils.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/ && \ + mv ./scripts/generate_dependencies_config.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/ + +COPY --chown=datafed:root ./scripts/generate_authz_config.sh ${BUILD_DIR}/scripts/generate_authz_config.sh +COPY --chown=datafed:root ./CMakeLists.txt ${BUILD_DIR} +COPY --chown=datafed:root ./cmake ${BUILD_DIR}/cmake +COPY --chown=datafed:root ./repository/CMakeLists.txt ${BUILD_DIR}/repository/CMakeLists.txt +COPY --chown=datafed:root ./repository/gridftp/CMakeLists.txt ${BUILD_DIR}/repository/gridftp/CMakeLists.txt +COPY --chown=datafed:root ./scripts/globus/setup_globus.sh ${BUILD_DIR}/scripts/globus/setup_globus.sh +COPY --chown=datafed:root ./scripts/globus/clean_globus.sh ${BUILD_DIR}/scripts/globus/clean_globus.sh +COPY --chown=datafed:root ./scripts/globus/generate_repo_form.sh ${BUILD_DIR}/scripts/globus/generate_repo_form.sh +COPY --chown=datafed:root ./repository/docker/entrypoint_authz.sh ${BUILD_DIR}/repository/docker/entrypoint_authz.sh +COPY --chown=datafed:root ./common ${BUILD_DIR}/common +COPY --chown=datafed:root ./repository/gridftp/globus5 ${BUILD_DIR}/repository/gridftp/globus5 +COPY --chown=datafed:root ./scripts/generate_gsi-authz_config.sh ${BUILD_DIR}/scripts/generate_gsi-authz_config.sh +COPY --chown=datafed:root ./scripts/globus/create_guest_collection.py ${BUILD_DIR}/scripts/globus/create_guest_collection.py +COPY --chown=datafed:root ./scripts/globus/utils.py ${BUILD_DIR}/scripts/globus/utils.py +COPY --chown=datafed:root ./scripts/globus/__init__.py ${BUILD_DIR}/scripts/globus/__init__.py +COPY --chown=datafed:root ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/ + +RUN ${BUILD_DIR}/scripts/generate_datafed.sh +RUN ${BUILD_DIR}/scripts/generate_gsi-authz_config.sh +# Don't build with syslog the container does not seem to support syslog +RUN ${DATAFED_DEPENDENCIES_ROOT}/scripts/generate_dependencies_config.sh && \ + ${BUILD_DIR}/scripts/generate_authz_config.sh && \ + ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake -S. -B build \ + -DBUILD_REPO_SERVER=False \ + -DBUILD_AUTHZ_TESTS=True \ + -DBUILD_AUTHZ=True \ + -DBUILD_AUTHZ_WITH_SYSLOG=False \ + -DBUILD_CORE_SERVER=False \ + -DBUILD_WEB_SERVER=False \ + -DBUILD_DOCS=False \ + -DBUILD_PYTHON_CLIENT=False \ + -DBUILD_FOXX=False +RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build -j 8 +RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build --target install + FROM ${GCS_IMAGE} ARG DATAFED_DIR ARG BUILD_DIR ARG DATAFED_INSTALL_PATH ARG DATAFED_DEPENDENCIES_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT ARG LIB_DIR ENV DATAFED_DEPENDENCIES_INSTALL_PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH" @@ -34,6 +93,7 @@ ENV BUILD_DIR="$BUILD_DIR" ENV LIB_DIR="$LIB_DIR" ENV DATAFED_GLOBUS_REPO_USER="datafed" ENV DATAFED_DEFAULT_LOG_PATH="$DATAFED_INSTALL_PATH/logs" +ENV DATAFED_DEPENDENCIES_ROOT="$DATAFED_DEPENDENCIES_ROOT" # Value needed so tput command doesn't crash ENV TERM="xterm" ENV DATAFED_GCS_IP="" @@ -46,6 +106,19 @@ RUN mkdir -p ${BUILD_DIR}/common/proto RUN mkdir -p ${DATAFED_INSTALL_PATH}/authz RUN mkdir -p /mnt/datafed +# This is necessary for curl, which is used the entrypoint script +COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib64/libssl.so ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib64/libssl.so +COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib64/libssl.so.3 ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib64/libssl.so.3 +COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib64/libcrypto.so ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib64/libcrypto.so +COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib64/libcrypto.so.3 ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib64/libcrypto.so.3 +COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/python ${DATAFED_DEPENDENCIES_INSTALL_PATH}/python +COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/python3.9 ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/python3.9 +COPY --from=dependencies --chown=datafed:root ${DATAFED_DEPENDENCIES_ROOT}/scripts/ ${DATAFED_DEPENDENCIES_ROOT}/scripts/ + +# Needed for tests +COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake +COPY --from=dependencies ${BUILD_DIR}/build ${BUILD_DIR}/build + # For communicating with public EXPOSE 443 @@ -58,19 +131,7 @@ RUN adduser --disabled-password --gecos "" datafed RUN echo "#!/bin/bash\n\$@" > /usr/bin/sudo && chmod +x /usr/bin/sudo -COPY ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/utils.sh ${BUILD_DIR}/scripts/utils.sh -COPY ./scripts/dependency_install_functions.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/install_authz_dependencies.sh ${BUILD_DIR}/scripts/ -COPY ./scripts/copy_dependency.sh ${BUILD_DIR}/scripts/ - -RUN ${BUILD_DIR}/scripts/generate_datafed.sh -RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC ${BUILD_DIR}/scripts/install_authz_dependencies.sh - -COPY --chown=datafed:root ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ COPY --chown=datafed:root ./scripts/generate_authz_config.sh ${BUILD_DIR}/scripts/generate_authz_config.sh -COPY --chown=datafed:root ./scripts/utils.sh ${BUILD_DIR}/scripts/utils.sh COPY --chown=datafed:root ./CMakeLists.txt ${BUILD_DIR} COPY --chown=datafed:root ./cmake ${BUILD_DIR}/cmake COPY --chown=datafed:root ./repository/CMakeLists.txt ${BUILD_DIR}/repository/CMakeLists.txt @@ -88,52 +149,21 @@ COPY --chown=datafed:root ./scripts/globus/__init__.py ${BUILD_DI # These extra copy statements are necessary as the authz binary is built in the GCS container # and not the dependencies container so we must copy the build dependencies as well as the # runtime depedencies -COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH} ${DATAFED_DEPENDENCIES_INSTALL_PATH} - -COPY --from=dependencies /usr/bin/make /usr/bin/make -COPY --from=dependencies /usr/bin/g++ /usr/bin/g++ -COPY --from=dependencies /usr/bin/gcc /usr/bin/gcc -COPY --from=dependencies /usr/bin/ar /usr/bin/ar -COPY --from=dependencies /usr/bin/as /usr/bin/as -COPY --from=dependencies /usr/bin/ld /usr/bin/ld -COPY --from=dependencies /usr/bin/jq /usr/bin/jq -COPY --from=dependencies /usr/bin/sudo /usr/bin/sudo -COPY --from=dependencies /usr/bin/host /usr/bin/host - -COPY --from=dependencies /etc/sudoers /etc/sudoers - -COPY --from=dependencies /usr/lib/gcc /usr/lib/gcc - -COPY --from=dependencies /lib /lib -COPY --from=dependencies /usr/include /usr/include -COPY --from=dependencies /usr/lib /usr/lib - -COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/libprotobuf.a ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/libprotobuf.a -COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/libprotoc.a ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/libprotoc.a -COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/libzmq.a ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/libzmq.a -COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/libsodium.a ${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/libsodium.a -# Copy python env over -COPY --from=dependencies ${DATAFED_DEPENDENCIES_INSTALL_PATH}/python/datafed ${DATAFED_DEPENDENCIES_INSTALL_PATH}/python/datafed RUN apt update -RUN apt-get install vim wget -y -RUN apt-get reinstall globus-connect-server54 -y +RUN apt-get install wget jq bind9-host build-essential -y +RUN apt-get reinstall globus-connect-server54 libsqlite3-dev -y + +COPY --chown=datafed:root ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/ +RUN ${BUILD_DIR}/scripts/generate_datafed.sh RUN ${BUILD_DIR}/scripts/generate_gsi-authz_config.sh # Don't build with syslog the container does not seem to support syslog -RUN ${BUILD_DIR}/scripts/generate_authz_config.sh && \ - ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake -S. -B build \ - -DBUILD_REPO_SERVER=False \ - -DBUILD_AUTHZ_TESTS=True \ - -DBUILD_AUTHZ=True \ - -DBUILD_AUTHZ_WITH_SYSLOG=False \ - -DBUILD_CORE_SERVER=False \ - -DBUILD_WEB_SERVER=False \ - -DBUILD_DOCS=False \ - -DBUILD_PYTHON_CLIENT=False \ - -DBUILD_FOXX=False -RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build -j 8 -RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build --target install + +COPY --from=dependencies --chown=datafed:root ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/curl ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/curl +COPY --from=dependencies --chown=datafed:root ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/ctest ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/ctest +COPY --from=dependencies --chown=datafed:root ${DATAFED_INSTALL_PATH}/authz/ ${DATAFED_INSTALL_PATH}/authz/ +COPY --from=dependencies --chown=datafed:root ${DATAFED_DEPENDENCIES_INSTALL_PATH}/python/datafed ${DATAFED_DEPENDENCIES_INSTALL_PATH}/python/datafed # Get the file that is not a link and give it the right permissions RUN chmod 755 ${DATAFED_INSTALL_PATH}/authz/$(ls -l /opt/datafed/authz/ | grep -v "^l" | grep libdatafed-authz | awk '{print $9}') @@ -144,6 +174,8 @@ COPY --chown=datafed:root ./repository/docker/entrypoint_authz.sh ${BUILD_DIR}/r USER root +ENV LD_LIBRARY_PATH=/opt/datafed/dependencies/lib/:/opt/datafed/dependencies/lib64/ + # Remove --client-id from command because it was deprecated RUN sed -i '/--client-id/d' /entrypoint.sh diff --git a/repository/docker/entrypoint_authz.sh b/repository/docker/entrypoint_authz.sh index f26be0c33..aace86497 100755 --- a/repository/docker/entrypoint_authz.sh +++ b/repository/docker/entrypoint_authz.sh @@ -9,26 +9,25 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/../..) # Translate datafed env variables to globus env variables -# Do not set DATAFED_GCS_COLLECTION_ROOT_PATH here, it should be defined in +# Do not set DATAFED_GCS_COLLECTION_ROOT_PATH here, it should be defined in # the Dockerfile as an env variable # The env variables below are needed for running globus-connect-server without # interactively logging in -export GCS_CLI_CLIENT_ID=$(jq -r .client < /opt/datafed/globus/client_cred.json) -export GCS_CLI_CLIENT_SECRET=$(jq -r .secret < /opt/datafed/globus/client_cred.json) -export GCS_CLI_ENDPOINT_ID=$(jq -r .client_id < /opt/datafed/globus/deployment-key.json) +export GCS_CLI_CLIENT_ID=$(jq -r .client > /etc/apache2/sites-available/000-default.conf + cat <>/etc/apache2/sites-available/000-default.conf # vim: syntax=apache ts=4 sw=4 sts=4 sr noet # This block is needed if core web services are running on the same machine as @@ -67,15 +66,14 @@ EOF fi if [ -n "$UID" ]; then - echo "Switching datafed user to UID: ${UID}" - usermod -u $UID datafed - # All files should be owned by the datafed user - chown -R datafed:root ${DATAFED_DIR} - chown -R datafed:root ${DATAFED_INSTALL_PATH}/authz + echo "Switching datafed user to UID: ${UID}" + usermod -u $UID datafed + # All files should be owned by the datafed user + chown -R datafed:root ${DATAFED_DIR} + chown -R datafed:root ${DATAFED_INSTALL_PATH}/authz fi -if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub" ] -then +if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub" ]; then echo "datafed-core-key.pub not found, downloading from the core server" wget --no-check-certificate "https://${DATAFED_DOMAIN}/datafed-core-key.pub" -P "${DATAFED_INSTALL_PATH}/keys/" fi @@ -101,7 +99,7 @@ cp "$PROJECT_ROOT/config/datafed-authz.cfg" "${DATAFED_INSTALL_PATH}/authz" # Make sure files did not persist from a previous docker compose run # This code block is used for cleaning up files that might have been cached by -# docker compose. These files are not always appropraitely removed when the +# docker compose. These files are not always appropraitely removed when the # Globus container exits. # # List of files to delete @@ -130,24 +128,22 @@ export NODE_SETUP_ARGS="--ip-address ${DATAFED_GCS_IP}" # Make sure globus-gridftp-server is running before running setup_globus data=$(ps aux | awk '{print $11}' | grep apache2 || true) -while [ -z "${data}" ] -do - data=$(ps aux | awk '{print $11}' | grep apache2 || true) - echo "Waiting for apache2 to start running" - sleep 1 +while [ -z "${data}" ]; do + data=$(ps aux | awk '{print $11}' | grep apache2 || true) + echo "Waiting for apache2 to start running" + sleep 1 done echo "apache2 service found to be running!" # Needs a few seconds -while [ ! -f /run/globus-gridftp-server.pid ] -do +while [ ! -f /run/globus-gridftp-server.pid ]; do echo "Waiting for globus-gridftp-server pid file to be created" sleep 1 done echo "globus-gridftp-server pid file found!" # Need to wait until the domain name is properly registered -DATAFED_GCS_URL=$(jq -r .domain_name < /var/lib/globus-connect-server/info.json) +DATAFED_GCS_URL=$(jq -r .domain_name &1 | tee -a "$log_path/datafed-repo.log" + # Send output to log file + # For this to work all commands must be passed in as a single string + su datafed -c '"$@"' -- argv0 "$@" 2>&1 | tee -a "$log_path/datafed-repo.log" else - echo "Not sending output to datafed-core.log" - # If not do not by default send to log file - su datafed -c '"$@"' -- argv0 "$@" + echo "Not sending output to datafed-core.log" + # If not do not by default send to log file + su datafed -c '"$@"' -- argv0 "$@" fi # Allow the container to exist for a bit in case we need to jump in and look diff --git a/repository/gridftp/globus5/authz/tests/mock/mock_start.sh b/repository/gridftp/globus5/authz/tests/mock/mock_start.sh index acadcd11a..30bf910c1 100755 --- a/repository/gridftp/globus5/authz/tests/mock/mock_start.sh +++ b/repository/gridftp/globus5/authz/tests/mock/mock_start.sh @@ -1,9 +1,8 @@ #!/bin/bash -if [ -f ./mock.log ] -then +if [ -f ./mock.log ]; then rm ./mock.log fi -./datafed-mock-core --gen-keys -./datafed-mock-core > mock.log 2>&1 & +./datafed-mock-core --gen-keys +./datafed-mock-core >mock.log 2>&1 & sleep 2 diff --git a/repository/gridftp/globus5/authz/tests/mock/mock_stop.sh b/repository/gridftp/globus5/authz/tests/mock/mock_stop.sh index 109b3061e..4755e1e89 100755 --- a/repository/gridftp/globus5/authz/tests/mock/mock_stop.sh +++ b/repository/gridftp/globus5/authz/tests/mock/mock_stop.sh @@ -1,4 +1,4 @@ #!/bin/bash echo "Stopping Mock Server" -kill $(cat ./server.pid ) && rm -f ./server.pid +kill $(cat ./server.pid) && rm -f ./server.pid cat ./mock.log diff --git a/scripts/admin_get_user_emails.sh b/scripts/admin_get_user_emails.sh index e5aad24c7..a4c1162c7 100755 --- a/scripts/admin_get_user_emails.sh +++ b/scripts/admin_get_user_emails.sh @@ -1,7 +1,7 @@ #!/bin/bash # Description -# -# This script is designed to query the database and get all user emails and +# +# This script is designed to query the database and get all user emails and # output them to a file. As well as print them to the terminal. # # -e has been removed so that if an error occurs the PASSWORD File is deleted and not left lying around @@ -13,8 +13,7 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/..") source "${PROJECT_ROOT}/config/datafed.sh" -Help() -{ +Help() { echo "$(basename $0) Will set up a configuration file for the core server" echo echo "Syntax: $(basename $0) [-h|u|p|o]" @@ -35,15 +34,13 @@ Help() local_DATABASE_NAME="sdms" local_DATABASE_USER="root" -if [ -z "${DATAFED_DATABASE_PASSWORD}" ] -then +if [ -z "${DATAFED_DATABASE_PASSWORD}" ]; then local_DATAFED_DATABASE_PASSWORD="" else local_DATAFED_DATABASE_PASSWORD=$(printenv DATAFED_DATABASE_PASSWORD) fi -if [ -z "${DATAFED_OUTPUT_FILE}" ] -then +if [ -z "${DATAFED_OUTPUT_FILE}" ]; then local_DATAFED_OUTPUT_FILE="" else local_DATAFED_OUTPUT_FILE=$(printenv DATAFED_OUTPUT_FILE) @@ -51,39 +48,40 @@ fi VALID_ARGS=$(getopt -o hu:p:o: --long 'help',database-user:,database-password:,output-file: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -u | --database-user) - local_DATABASE_USER=$2 - shift 2 - ;; - -p | --database-password) - local_DATAFED_DATABASE_PASSWORD=$2 - shift 2 - ;; - -o | --output-file) - local_DATAFED_OUTPUT_FILE=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -u | --database-user) + local_DATABASE_USER=$2 + shift 2 + ;; + -p | --database-password) + local_DATAFED_DATABASE_PASSWORD=$2 + shift 2 + ;; + -o | --output-file) + local_DATAFED_OUTPUT_FILE=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done ERROR_DETECTED=0 -if [ -z "$local_DATAFED_DATABASE_PASSWORD" ] -then +if [ -z "$local_DATAFED_DATABASE_PASSWORD" ]; then echo "Error DATAFED_DATABASE_PASSWORD is not defined, this is a required argument" echo " This variable can be set using the command line option -p, --database-password" echo " or with the environment variable DATAFED_DATABASE_PASSWORD." @@ -91,14 +89,12 @@ then fi # Check if the variable is empty -if [ -z "$local_DATAFED_OUTPUT_FILE" ] -then +if [ -z "$local_DATAFED_OUTPUT_FILE" ]; then # Variable is empty or not defined local_DATAFED_OUTPUT_FILE="datafed_user_emails.txt" fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi @@ -110,18 +106,16 @@ if [[ ! "$output" =~ .*"sdms".* ]]; then exit 1 fi -data=$(curl -s -X POST --header 'accept: application/json' -u "$local_DATABASE_USER:$local_DATAFED_DATABASE_PASSWORD" http://localhost:8529/_db/sdms/_api/cursor -d "{ \"query\" : \"FOR user1 IN u RETURN user1.email\" }") -emails=$(echo "$data" | jq .result) -emails_cleaned=$(echo "$emails" | sed 's/", "/ /g' | sed 's/\[ "//g' | sed 's/" \]//g') +data=$(curl -s -X POST --header 'accept: application/json' -u "$local_DATABASE_USER:$local_DATAFED_DATABASE_PASSWORD" http://localhost:8529/_db/sdms/_api/cursor -d "{ \"query\" : \"FOR user1 IN u RETURN user1.email\" }") +emails=$(echo "$data" | jq .result) +emails_cleaned=$(echo "$emails" | sed 's/", "/ /g' | sed 's/\[ "//g' | sed 's/" \]//g') -if [ -f "$local_DATAFED_OUTPUT_FILE" ] -then +if [ -f "$local_DATAFED_OUTPUT_FILE" ]; then # Remove file if it exists rm "$local_DATAFED_OUTPUT_FILE" fi -for email in ${emails_cleaned} -do +for email in ${emails_cleaned}; do echo "$email" - echo "$email" >> "$local_DATAFED_OUTPUT_FILE" -done + echo "$email" >>"$local_DATAFED_OUTPUT_FILE" +done diff --git a/scripts/admin_send_email_notification.sh b/scripts/admin_send_email_notification.sh index 8902dd264..e881401a4 100755 --- a/scripts/admin_send_email_notification.sh +++ b/scripts/admin_send_email_notification.sh @@ -1,7 +1,7 @@ #!/bin/bash # Description -# -# This script is designed to query the database and get all user emails and +# +# This script is designed to query the database and get all user emails and # output them to a file. As well as print them to the terminal. # # -e has been removed so that if an error occurs the PASSWORD File is deleted and not left lying around @@ -12,8 +12,7 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) -Help() -{ +Help() { echo "$(basename $0) Will set up a configuration file for the core server" echo echo "Syntax: $(basename $0) [-h|u|n|g]" @@ -31,72 +30,70 @@ Help() VALID_ARGS=$(getopt -o hu:n:g: --long 'help',user-email-address-file:,notification-file:,generate-template-notification: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -u | --user-email-address-file) - local_USER_EMAIL_ADDRESSES=$2 - shift 2 - ;; - -n | --notification-file) - local_NOTIFICATION_FILE=$2 - shift 2 - ;; - -g | --generate-template-notification) - local_GENERATE_TEMPLATE=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -u | --user-email-address-file) + local_USER_EMAIL_ADDRESSES=$2 + shift 2 + ;; + -n | --notification-file) + local_NOTIFICATION_FILE=$2 + shift 2 + ;; + -g | --generate-template-notification) + local_GENERATE_TEMPLATE=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done -if [ ! -z "$local_GENERATE_TEMPLATE" ] -then +if [ ! -z "$local_GENERATE_TEMPLATE" ]; then echo "Generating Template at $local_GENERATE_TEMPLATE" - echo "From: datafed@email.ornl.gov" > "$local_GENERATE_TEMPLATE" - echo "Subject: DataFed Maintenance Notification" >> "$local_GENERATE_TEMPLATE" - echo "" >> "$local_GENERATE_TEMPLATE" - echo "Message Body" >> "$local_GENERATE_TEMPLATE" - echo "" >> "$local_GENERATE_TEMPLATE" - echo "Best," >> "$local_GENERATE_TEMPLATE" - echo "" >> "$local_GENERATE_TEMPLATE" - echo "DataFed Admins" >> "$local_GENERATE_TEMPLATE" + echo "From: datafed@email.ornl.gov" >"$local_GENERATE_TEMPLATE" + echo "Subject: DataFed Maintenance Notification" >>"$local_GENERATE_TEMPLATE" + echo "" >>"$local_GENERATE_TEMPLATE" + echo "Message Body" >>"$local_GENERATE_TEMPLATE" + echo "" >>"$local_GENERATE_TEMPLATE" + echo "Best," >>"$local_GENERATE_TEMPLATE" + echo "" >>"$local_GENERATE_TEMPLATE" + echo "DataFed Admins" >>"$local_GENERATE_TEMPLATE" cat "$local_GENERATE_TEMPLATE" - echo + echo echo "Exiting" exit 0 fi ERROR_DETECTED=0 -if [ -z "$local_USER_EMAIL_ADDRESSES" ] -then +if [ -z "$local_USER_EMAIL_ADDRESSES" ]; then echo "Error Email address file is not defined, this is a required argument" echo " This variable can be set using the command line option -u, --user-email-address-file." ERROR_DETECTED=1 fi # Check if the variable is empty -if [ -z "$local_NOTIFICATION_FILE" ] -then +if [ -z "$local_NOTIFICATION_FILE" ]; then # Variable is empty or not defined echo "Error Notification file is not defined, this is a required argument" echo " This variable can be set using the command line option -n, --notification-file." ERROR_DETECTED=1 fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi @@ -113,16 +110,15 @@ echo "To the following recipients:" IFS=$'\n' count=0 -read -r -d '' -a email_array <<< "$emails" -for email in "${email_array[@]}" -do +read -r -d '' -a email_array <<<"$emails" +for email in "${email_array[@]}"; do sendmail --verbose "$email" < $local_DATAFED_DEFAULT_MESSAGE_FILE + echo "$local_DATAFED_MESSAGE" >$local_DATAFED_DEFAULT_MESSAGE_FILE fi else local_DATAFED_MESSAGE=$(cat "$local_DATAFED_MESSAGE_FILE") fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi @@ -123,7 +118,7 @@ fi output=$(curl --dump - --user $local_DATABASE_USER:$local_DATAFED_DATABASE_PASSWORD http://localhost:8529/_api/database/user) if [[ "$output" =~ .*"sdms".* ]]; then - echo "Verified SDMS exists." + echo "Verified SDMS exists." else echo "Something is wrong, the sdms database is missing!" exit 1 diff --git a/scripts/ci_database_health_check.sh b/scripts/ci_database_health_check.sh index 0591a63f9..a4638ca97 100755 --- a/scripts/ci_database_health_check.sh +++ b/scripts/ci_database_health_check.sh @@ -8,42 +8,37 @@ DATABASE_PORT="8529" DATAFED_DATABASE="sdms" RESPONSE="" -if [ -z "${DATAFED_DATABASE_HOST}" ] -then +if [ -z "${DATAFED_DATABASE_HOST}" ]; then local_DATAFED_DATABASE_HOST="" else local_DATAFED_DATABASE_HOST=$(printenv DATAFED_DATABASE_HOST) fi -if [ -z "${FOXX_MAJOR_API_VERSION}" ] -then - local_FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs ) +if [ -z "${FOXX_MAJOR_API_VERSION}" ]; then + local_FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs) else local_FOXX_MAJOR_API_VERSION=$(printenv FOXX_MAJOR_API_VERSION) fi establish_connection() { - local URL="http://${local_DATAFED_DATABASE_HOST}:${DATABASE_PORT}/_db/${DATAFED_DATABASE}/api/${local_FOXX_MAJOR_API_VERSION}/version" + local URL="http://${local_DATAFED_DATABASE_HOST}:${DATABASE_PORT}/_db/${DATAFED_DATABASE}/api/${local_FOXX_MAJOR_API_VERSION}/version" local CONNECTION="FALSE" local count=0 local max_count=40 - while [ "$CONNECTION" == "FALSE" ] - do + while [ "$CONNECTION" == "FALSE" ]; do echo "Attempt $count - Checking Database Connection at: $URL" RESPONSE=$(curl -s "$URL") local error_code="$?" ((count++)) - if [ "$error_code" = "0" ] - then + if [ "$error_code" = "0" ]; then echo "Connection made" CONNECTION="TRUE" else sleep 5 fi - if [ "$count" -eq "$max_count" ] - then + if [ "$count" -eq "$max_count" ]; then echo "Max attempts made exiting!" exit 1 fi @@ -52,26 +47,23 @@ establish_connection() { foxx_provisioned() { - local URL="http://${local_DATAFED_DATABASE_HOST}:${DATABASE_PORT}/_db/${DATAFED_DATABASE}/api/${local_FOXX_MAJOR_API_VERSION}/version" + local URL="http://${local_DATAFED_DATABASE_HOST}:${DATABASE_PORT}/_db/${DATAFED_DATABASE}/api/${local_FOXX_MAJOR_API_VERSION}/version" local FOXX_PROVISIONED="FALSE" local count=0 local max_count=20 - while [ "$FOXX_PROVISIONED" == "FALSE" ] - do + while [ "$FOXX_PROVISIONED" == "FALSE" ]; do echo "Attempt $count - Checking foxx endpoint exists: $URL" RESPONSE=$(curl -s "$URL") local error=$(echo "$RESPONSE" | jq -r .error) ((count++)) - if [ "$error" == "true" ] - then + if [ "$error" == "true" ]; then sleep 5 else echo "Endpoint exists!" FOXX_PROVISIONED="TRUE" fi - if [ "$count" -eq "$max_count" ] - then + if [ "$count" -eq "$max_count" ]; then echo "Max attempts made exiting!" exit 1 fi diff --git a/scripts/ci_generate_pypirc.sh b/scripts/ci_generate_pypirc.sh index bccde1af3..ef0fb0dc1 100755 --- a/scripts/ci_generate_pypirc.sh +++ b/scripts/ci_generate_pypirc.sh @@ -8,23 +8,19 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) -if [ -z "${TWINE_CONFIG_FILE}" ] -then +if [ -z "${TWINE_CONFIG_FILE}" ]; then local_TWINE_CONFIG_FILE=".pypirc" else local_TWINE_CONFIG_FILE=$(printenv TWINE_CONFIG_FILE) fi - - -if [ -z "${DATAFED_PYPI_REPO_TOKEN}" ] -then +if [ -z "${DATAFED_PYPI_REPO_TOKEN}" ]; then local_DATAFED_PYPI_REPO_TOKEN="" else local_DATAFED_PYPI_REPO_TOKEN=$(printenv DATAFED_PYPI_REPO_TOKEN) fi -cat << EOF > "$local_TWINE_CONFIG_FILE" +cat <"$local_TWINE_CONFIG_FILE" [distutils] index-servers = pypi diff --git a/scripts/ci_harbor_artifact_count.sh b/scripts/ci_harbor_artifact_count.sh index 2c2ea5501..0232f961a 100755 --- a/scripts/ci_harbor_artifact_count.sh +++ b/scripts/ci_harbor_artifact_count.sh @@ -1,9 +1,8 @@ #!/bin/bash -set -euf +set -euf -Help() -{ +Help() { echo "$(basename ${BASH_SOURCE[0]}) Will check to make sure that the selected" echo " docker image has been uploaded to the registry." echo @@ -21,45 +20,44 @@ for var in "${vars[@]}"; do eval "local_${var}=\${${var}:-\"\"}" done - VALID_ARGS=$(getopt -o hr: --long 'help',repository: -- "$@") if [[ $? -ne 0 ]]; then - exit 2; + exit 2 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -r | --repository) - local_DATAFED_HARBOR_REPOSITORY=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -r | --repository) + local_DATAFED_HARBOR_REPOSITORY=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done # This script is created to determine if a harbor image exists in the repository # It will print the number of artifacts that exist for a particualar image. LOG_FILE="harbor_check.log" -echo "CI Harbor Check Log File" > "$LOG_FILE" +echo "CI Harbor Check Log File" >"$LOG_FILE" -if [ -z "${DATAFED_HARBOR_PROJECT:-}" ] -then +if [ -z "${DATAFED_HARBOR_PROJECT:-}" ]; then local_DATAFED_HARBOR_PROJECT="datafed" else local_DATAFED_HARBOR_PROJECT=$(printenv DATAFED_HARBOR_PROJECT) fi -if [ -z "${DATAFED_HARBOR_IMAGE_TAG:-}" ] -then +if [ -z "${DATAFED_HARBOR_IMAGE_TAG:-}" ]; then local_DATAFED_HARBOR_IMAGE_TAG="latest" else local_DATAFED_HARBOR_IMAGE_TAG=$(printenv DATAFED_HARBOR_IMAGE_TAG) @@ -69,7 +67,7 @@ fi for var in "${vars[@]}"; do local_var="local_${var}" if [ -z "${!local_var}" ]; then - echo "The ${var} has not been defined." >> "$LOG_FILE" + echo "The ${var} has not been defined." >>"$LOG_FILE" exit 1 fi done @@ -84,11 +82,11 @@ local_DATAFED_HARBOR_URL="https://$local_DATAFED_HARBOR_REGISTRY" # local_DATAFED_HARBOR_PROJECT="datafed" # local_DATAFED_HARBOR_REPOSITORY="core-devel" URL="$local_DATAFED_HARBOR_URL/api/v2.0/projects/$local_DATAFED_HARBOR_PROJECT/repositories/$local_DATAFED_HARBOR_REPOSITORY/artifacts" -echo "${URL}?with_tag=$local_DATAFED_HARBOR_IMAGE_TAG" >> "$LOG_FILE" +echo "${URL}?with_tag=$local_DATAFED_HARBOR_IMAGE_TAG" >>"$LOG_FILE" # This requires artifact permissions for the token -data=$(curl -u "$local_DATAFED_HARBOR_USERNAME:$local_DATAFED_HARBOR_PASSWORD" -s "${URL}?with_tag=$local_DATAFED_HARBOR_IMAGE_TAG" ) +data=$(curl -u "$local_DATAFED_HARBOR_USERNAME:$local_DATAFED_HARBOR_PASSWORD" -s "${URL}?with_tag=$local_DATAFED_HARBOR_IMAGE_TAG") -echo "$data" >> "$LOG_FILE" +echo "$data" >>"$LOG_FILE" # In the case that an image has not yet been uploaded the server will return # a json object of the following format # @@ -121,56 +119,48 @@ echo "$data" >> "$LOG_FILE" # "message": "forbidden" # } # ] -# } +# } error_code=$(echo $?) -if [ "$error_code" != "0" ] -then - echo "Something went wrong when communicating with harbor registry" >> "$LOG_FILE" - - echo "$URL with tag $local_DATAFED_HARBOR_IMAGE_TAG" >> "$LOG_FILE" - if [ "$error_code" == "6" ] - then - echo "cURL error code 6, could not resolve host, make sure the domain is correct $local_DATAFED_HARBOR_URL, and that the network is open, and that the site is up." >> "$LOG_FILE" - elif [ "$error_code" == "1" ] - then - echo "cURL error code 1, generic error code detected, make sure the password username combination is correct." >> "$LOG_FILE" - fi +if [ "$error_code" != "0" ]; then + echo "Something went wrong when communicating with harbor registry" >>"$LOG_FILE" + + echo "$URL with tag $local_DATAFED_HARBOR_IMAGE_TAG" >>"$LOG_FILE" + if [ "$error_code" == "6" ]; then + echo "cURL error code 6, could not resolve host, make sure the domain is correct $local_DATAFED_HARBOR_URL, and that the network is open, and that the site is up." >>"$LOG_FILE" + elif [ "$error_code" == "1" ]; then + echo "cURL error code 1, generic error code detected, make sure the password username combination is correct." >>"$LOG_FILE" + fi fi # if it is an object, this is not the expected result because we expect an # array if successful interaction with the API is_obj=$(echo "$data" | jq 'type == "object"') -if [ "$is_obj" == "true" ] -then - echo "$data" | jq >> "$LOG_FILE" +if [ "$is_obj" == "true" ]; then + echo "$data" | jq >>"$LOG_FILE" fi number_of_artifacts=$(echo "$data" | jq ' . | length') # Make sure the response doesn't contain an error code before assumptions are made -if [ "$number_of_artifacts" != "0" ] -then +if [ "$number_of_artifacts" != "0" ]; then # Can only check for errors with .errors if it is an object not if it is an # array - if [ "$is_obj" == "true" ] - then + if [ "$is_obj" == "true" ]; then ERROR_FOUND=$(echo "$data" | jq -r 'if .errors and (.errors | length > 0) then "TRUE" else "FALSE" end') - if [ "$ERROR_FOUND" == "TRUE" ] - then + if [ "$ERROR_FOUND" == "TRUE" ]; then ERROR_CODE=$(echo "$data" | jq -r '.errors[0].code') - if [ "$ERROR_CODE" == "NOT_FOUND" ] - then + if [ "$ERROR_CODE" == "NOT_FOUND" ]; then echo "0" exit 0 else - echo "Aborting unhandled error $ERROR_CODE" >> "$LOG_FILE" + echo "Aborting unhandled error $ERROR_CODE" >>"$LOG_FILE" exit 1 fi fi fi fi -echo "Number of artifacts found: $number_of_artifacts" >> "$LOG_FILE" +echo "Number of artifacts found: $number_of_artifacts" >>"$LOG_FILE" # Otherwise we assume the object contains the list of objects echo "$number_of_artifacts" diff --git a/scripts/ci_pipeline_serializer.sh b/scripts/ci_pipeline_serializer.sh index 46124ef11..668c1cfd3 100755 --- a/scripts/ci_pipeline_serializer.sh +++ b/scripts/ci_pipeline_serializer.sh @@ -2,8 +2,7 @@ set -eu -Help() -{ +Help() { echo "$(basename $0) Will check to make sure that there are currently" echo " no other running pipelines before proceeding. This must" echo " be used in conjunction with a job with a resource group." @@ -16,8 +15,7 @@ Help() } GITLAB_DATAFED_REPO_API_TOKEN=$(printenv GITLAB_DATAFED_REPO_API_TOKEN || true) -if [ -z "$GITLAB_DATAFED_REPO_API_TOKEN" ] -then +if [ -z "$GITLAB_DATAFED_REPO_API_TOKEN" ]; then local_GITLAB_DATAFED_REPO_API_TOKEN="" else local_GITLAB_DATAFED_REPO_API_TOKEN="$GITLAB_DATAFED_REPO_API_TOKEN" @@ -25,30 +23,31 @@ fi VALID_ARGS=$(getopt -o ha: --long 'help',gitlab-api-token: -- "$@") if [[ $? -ne 0 ]]; then - exit 2; + exit 2 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -a | --gitlab-api-token) - local_GITLAB_DATAFED_REPO_API_TOKEN=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -a | --gitlab-api-token) + local_GITLAB_DATAFED_REPO_API_TOKEN=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done -if [ -z "$local_GITLAB_DATAFED_REPO_API_TOKEN" ] -then +if [ -z "$local_GITLAB_DATAFED_REPO_API_TOKEN" ]; then echo "The GitLab token for accessing the API of the DataFed repo is missing." echo "It is a required parameter." exit 2 @@ -61,31 +60,28 @@ fi # Example # # get_pipelines "status" -get_pipelines() -{ +get_pipelines() { status=$1 pipelines=$(curl --silent --noproxy '*' --header "PRIVATE-TOKEN:$local_GITLAB_DATAFED_REPO_API_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines?status=$status") echo $pipelines } # Will count all of the pipelines with the "running" status and the "pending" status -get_pipelines_count() -{ +get_pipelines_count() { pipelines=$(get_pipelines running) active_count=$(echo $pipelines | jq '. | length') pending_jobs=$(get_pending_jobs_count) - result=$(($active_count+$pending_jobs)) + result=$(($active_count + $pending_jobs)) echo $result } -get_pending_jobs_count() -{ +get_pending_jobs_count() { pending_pipelines=$(get_pipelines pending) jobs_count=0 echo "$pending_pipelines" | jq '.[].id' | while read -r pipeline_id; do finished_jobs_len=$(curl --silent --noproxy '*' --header "PRIVATE-TOKEN:$local_GITLAB_DATAFED_REPO_API_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$pipeline_id/jobs?scope[]=failed&scope[]=success" | jq '. | length') - if [ $finished_jobs_len -gt 0 ]; then ((jobs_count=jobs_count+1)); fi + if [ $finished_jobs_len -gt 0 ]; then ((jobs_count = jobs_count + 1)); fi done echo $jobs_count @@ -94,19 +90,18 @@ get_pending_jobs_count() start_time=$(date +%s) pipelines_count=$(get_pipelines_count) -# Code execution will loop here until there is only one running pipeline... this one. At which point the job +# Code execution will loop here until there is only one running pipeline... this one. At which point the job # should proceed and thus release the resource group. printf "Currently $pipelines_count active pipeline$([ $pipelines_count -gt 1 ] && echo "s were" || echo " was") found\n" -until [ $pipelines_count -eq 1 ] -do +until [ $pipelines_count -eq 1 ]; do printf '.' pipelines_count=$(get_pipelines_count) sleep 5 done end_time=$(date +%s) -total_time=$(( end_time - start_time )) +total_time=$((end_time - start_time)) minutes=$((total_time / 60)) -seconds=$((total_time - 60*minutes)) +seconds=$((total_time - 60 * minutes)) final_time=$(echo "$([ $minutes -ne 0 ] && echo "$minutes minutes, " || echo "")$seconds seconds") printf "\nLooks like it's only 1 active pipeline at this moment. Proceeding after $final_time\n" diff --git a/scripts/ci_pipeline_setup.sh b/scripts/ci_pipeline_setup.sh index 94ffd3be9..5c6ec5e17 100755 --- a/scripts/ci_pipeline_setup.sh +++ b/scripts/ci_pipeline_setup.sh @@ -2,8 +2,7 @@ set -eu -Help() -{ +Help() { echo "$(basename $0) Will determine if a Open Stack VM exists if not it will" echo " will exit with an error code 1. If some other problem exists will exit" echo " with error code 2. It requires that you provide the Open Stack VM ID" @@ -29,16 +28,14 @@ Help() GITLAB_PROJECT_ID="10830" OS_APP_ID=$(printenv OS_APP_ID || true) -if [ -z "$OS_APP_ID" ] -then +if [ -z "$OS_APP_ID" ]; then local_OS_APP_ID="" else local_OS_APP_ID="$OS_APP_ID" fi OS_APP_SECRET=$(printenv OS_APP_SECRET || true) -if [ -z "$OS_APP_SECRET" ] -then +if [ -z "$OS_APP_SECRET" ]; then # This is the port that is open and listening on" # the core server." local_OS_APP_SECRET="" @@ -47,8 +44,7 @@ else fi GITLAB_DATAFEDCI_REPO_API_TOKEN=$(printenv GITLAB_DATAFEDCI_REPO_API_TOKEN || true) -if [ -z "$GITLAB_DATAFEDCI_REPO_API_TOKEN" ] -then +if [ -z "$GITLAB_DATAFEDCI_REPO_API_TOKEN" ]; then local_GITLAB_DATAFEDCI_REPO_API_TOKEN="" else local_GITLAB_DATAFEDCI_REPO_API_TOKEN="$GITLAB_DATAFEDCI_REPO_API_TOKEN" @@ -62,69 +58,67 @@ COMPUTE_ID_PROVIDED="FALSE" VALID_ARGS=$(getopt -o hi:s:c:a:n: --long 'help',app-credential-id:,app-credential-secret:,compute-instance-id:,gitlab-api-token:,compute-instance-name: -- "$@") if [[ $? -ne 0 ]]; then - exit 2; + exit 2 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -i | --app-credential-id) - local_OS_APP_ID=$2 - shift 2 - ;; - -s | --app-credential-secret) - local_OS_APP_SECRET=$2 - shift 2 - ;; - -c | --compute-instance-id) - COMPUTE_INSTANCE_ID=$2 - COMPUTE_ID_PROVIDED="TRUE" - shift 2 - ;; - -n | --compute-instance-name) - COMPUTE_INSTANCE_NAME=$2 - COMPUTE_NAME_PROVIDED="TRUE" - shift 2 - ;; - -a | --gitlab-api-token) - local_GITLAB_DATAFEDCI_REPO_API_TOKEN=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -i | --app-credential-id) + local_OS_APP_ID=$2 + shift 2 + ;; + -s | --app-credential-secret) + local_OS_APP_SECRET=$2 + shift 2 + ;; + -c | --compute-instance-id) + COMPUTE_INSTANCE_ID=$2 + COMPUTE_ID_PROVIDED="TRUE" + shift 2 + ;; + -n | --compute-instance-name) + COMPUTE_INSTANCE_NAME=$2 + COMPUTE_NAME_PROVIDED="TRUE" + shift 2 + ;; + -a | --gitlab-api-token) + local_GITLAB_DATAFEDCI_REPO_API_TOKEN=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done -if [ -z "$local_OS_APP_ID" ] -then +if [ -z "$local_OS_APP_ID" ]; then echo "The open stack application credential id has not been defined this is" echo " a required parameter." exit 2 fi -if [ -z "$local_OS_APP_SECRET" ] -then +if [ -z "$local_OS_APP_SECRET" ]; then echo "The open stack application credential secret has not been defined this is" echo " a required parameter." exit 2 fi -if [[ -z "$COMPUTE_INSTANCE_ID" && -z "$COMPUTE_INSTANCE_NAME" ]] -then +if [[ -z "$COMPUTE_INSTANCE_ID" && -z "$COMPUTE_INSTANCE_NAME" ]]; then echo "The open stack compute instance id or name has not been defined, at " echo "least one is required." exit 2 fi -if [ -z "$local_GITLAB_DATAFEDCI_REPO_API_TOKEN" ] -then +if [ -z "$local_GITLAB_DATAFEDCI_REPO_API_TOKEN" ]; then echo "The GitLab token for accessing the API of the DataFed ci repo is missing." echo "It is a required parameter." exit 2 @@ -143,10 +137,9 @@ data=$(curl -s --retry 5 -i -X POST \ } } }" \ - https://orc-open.ornl.gov:13000/v3/auth/tokens) + https://orc-open.ornl.gov:13000/v3/auth/tokens) error_code="$?" -if [ "$error_code" == "6" ] -then +if [ "$error_code" == "6" ]; then echo "Unable to connect to Open Stack API endpoints, make sure you are" echo "connected to the network" exit 2 @@ -154,30 +147,30 @@ fi # Make sure jq is installed jq_path=$(which jq || true) -if [ -z "$jq_path" ] -then +if [ -z "$jq_path" ]; then echo "jq command not found exiting!" exit 2 fi wait_for_running_infrastructure_pipelines_to_finish() { local GITLAB_REPO_API_TOKEN="$1" - local all_other_pipelines=$(curl -s --header "PRIVATE-TOKEN: ${GITLAB_REPO_API_TOKEN}" "https://code.ornl.gov/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines?status=running" | jq '.[]') - if [ -z "$all_other_pipelines" ] - then + local all_other_pipelines=$(curl -s --header "PRIVATE-TOKEN: ${GITLAB_REPO_API_TOKEN}" "https://code.ornl.gov/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines?status=running" | jq '.[]') + if [ -z "$all_other_pipelines" ]; then echo "No other running infrastructure provisioning pipelines detected!" fi - if [[ "$all_other_pipelines" == *"invalid_token"* ]] - then + if [[ "$all_other_pipelines" == *"invalid_token"* ]]; then echo "Error detected with GITLAB_DATAFEDCI_REPO_API_TOKEN" echo "$all_other_pipelines" exit 2 + elif [[ "$all_other_pipelines" == *"Unauthorized"* ]]; then + echo "Error detected with GITLAB_DATAFEDCI_REPO_API_TOKEN" + echo "$all_other_pipelines" + exit 3 fi local count=0 - while [ ! -z "$all_other_pipelines" ] - do + while [ ! -z "$all_other_pipelines" ]; do echo "Attempt $count, Other running infrastructure provisioning pipelines detected... waiting for them to complete." echo echo "Running Pipelines Are:" @@ -198,8 +191,7 @@ find_orc_instance_by_id() { compute_instances=$(curl -s --retry 5 -H "X-Auth-Token: $SANITIZED_TOKEN" "$SANITIZED_URL/servers/detail" | jq) local instance_id=$(echo "$compute_instances" | jq --arg COMPUTE_INSTANCE_ID "$COMPUTE_INSTANCE_ID" '.servers[] | select(.id==$COMPUTE_INSTANCE_ID) | .id' | sed 's/\"//g') local instance_name=$(echo "$compute_instances" | jq --arg COMPUTE_INSTANCE_ID "$COMPUTE_INSTANCE_ID" '.servers[] | select(.id==$COMPUTE_INSTANCE_ID) | .name' | sed 's/\"//g') - if [ "$instance_id" == "$COMPUTE_INSTANCE_ID" ] - then + if [ "$instance_id" == "$COMPUTE_INSTANCE_ID" ]; then found_vm_id="TRUE" compute_id="$COMPUTE_INSTANCE_ID" compute_name="$COMPUTE_INSTANCE_NAME" @@ -212,9 +204,8 @@ find_orc_instance_by_name() { local SANITIZED_URL="$2" local COMPUTE_INSTANCE_NAME="$3" compute_instances=$(curl -s --retry 5 -H "X-Auth-Token: $SANITIZED_TOKEN" "$SANITIZED_URL/servers/detail" | jq) - instance_id=$(echo "$compute_instances" | jq --arg COMPUTE_INSTANCE_NAME "$COMPUTE_INSTANCE_NAME" '.servers[] | select (.name==$COMPUTE_INSTANCE_NAME) | .id ' | sed 's/\"//g') - if [ -z "$instance_id" ] - then + instance_id=$(echo "$compute_instances" | jq --arg COMPUTE_INSTANCE_NAME "$COMPUTE_INSTANCE_NAME" '.servers[] | select (.name==$COMPUTE_INSTANCE_NAME) | .id ' | sed 's/\"//g') + if [ -z "$instance_id" ]; then echo "Missing: $COMPUTE_INSTANCE_NAME" found_vm_id="FALSE" compute_name="$COMPUTE_INSTANCE_NAME" @@ -227,16 +218,16 @@ find_orc_instance_by_name() { } body=$(echo "$data" | sed -n 's/^\({\".*\)/\1/p') -if jq -e 'has("error")' <<< "$body" > /dev/null; then - echo "Error Detected!" - echo "$body" | jq - exit 2 +if jq -e 'has("error")' <<<"$body" >/dev/null; then + echo "Error Detected!" + echo "$body" | jq + exit 2 fi compute_url=$(echo "$body" | jq '.token.catalog[] | select(.name=="nova") |.endpoints[] | select(.interface=="public") | .url ') sanitize_compute_url=$(echo $compute_url | sed 's/\"//g') header=$(echo "$data" | sed 's/{\"token.*//') -subject_token=$(echo "$data" | grep "X-Subject-Token" | awk '{print $2}' ) +subject_token=$(echo "$data" | grep "X-Subject-Token" | awk '{print $2}') sanitize_subject_token=${subject_token:0:268} ################################################################################ @@ -252,20 +243,17 @@ wait_for_running_infrastructure_pipelines_to_finish "${local_GITLAB_DATAFEDCI_RE compute_id="" compute_name="" found_vm_id="FALSE" -if [ "$COMPUTE_ID_PROVIDED" == "TRUE" ] -then +if [ "$COMPUTE_ID_PROVIDED" == "TRUE" ]; then find_orc_instance_by_id "$sanitize_subject_token" "$sanitize_compute_url" "$COMPUTE_INSTANCE_ID" fi -if [[ "$found_vm_id" == "FALSE" && "$COMPUTE_NAME_PROVIDED" ]] -then +if [[ "$found_vm_id" == "FALSE" && "$COMPUTE_NAME_PROVIDED" ]]; then find_orc_instance_by_name "$sanitize_subject_token" "$sanitize_compute_url" "$COMPUTE_INSTANCE_NAME" fi pipeline_id="" -if [ "$found_vm_id" == "FALSE" ] -then - echo "VM ID: $compute_id Name: $compute_name is Unhealthy, does not exist, triggering pipeline." - exit 1 +if [ "$found_vm_id" == "FALSE" ]; then + echo "VM ID: $compute_id Name: $compute_name is Unhealthy, does not exist, triggering pipeline." + exit 1 fi ################################################################################ @@ -279,49 +267,43 @@ INSTANCE_STATUS_SANITIZED=$(echo "$INSTANCE_STATUS" | sed 's/\"//g') # If the status is not ACTIVE trigger the GitLab pipeline VM_IS_ACTIVE="TRUE" -if [[ "$INSTANCE_STATUS_SANITIZED" != "ACTIVE" ]] -then +if [[ "$INSTANCE_STATUS_SANITIZED" != "ACTIVE" ]]; then VM_IS_ACTIVE="FALSE" fi # Only trigger the pipeline here if it was not triggered before -if [[ "$VM_IS_ACTIVE" == "FALSE" && -z "$pipeline_id" ]] -then +if [[ "$VM_IS_ACTIVE" == "FALSE" && -z "$pipeline_id" ]]; then echo "VM ID: $compute_id Name: $compute_name is unhealthy triggering pipeline." exit 1 fi # If the pipeline is defined check the status of the VMs -if [ ! -z "$pipeline_id" ] -then - MAX_COUNT=40 - count=0 - while [ "$VM_IS_ACTIVE" == "FALSE" ] - do - - printf "Attempt $count, Waiting for pipeline to start VM ... " - sleep 30s - compute_instances=$(curl -s --retry 5 -H "X-Auth-Token: $sanitize_subject_token" "$sanitize_compute_url/servers/detail" | jq) - INSTANCE_STATUS=$(echo "$compute_instances" | jq --arg compute_id "$compute_id" '.servers[] | select(.id==$compute_id) | .status ') - INSTANCE_STATUS_SANITIZED=$(echo "$INSTANCE_STATUS" | sed 's/\"//g') - - # If the status is not ACTIVE trigger the GitLab pipeline - VM_IS_ACTIVE="TRUE" - if [[ "$INSTANCE_STATUS_SANITIZED" != "ACTIVE" ]] - then - echo "$compute_name is still down." - VM_IS_ACTIVE="FALSE" - else - echo "$compute_name is up." - fi - count=$(($count + 1)) - - if [ "$count" == "$MAX_COUNT" ] - then - echo "Exceeded time limit!" - exit 2 - fi - done +if [ ! -z "$pipeline_id" ]; then + MAX_COUNT=40 + count=0 + while [ "$VM_IS_ACTIVE" == "FALSE" ]; do + + printf "Attempt $count, Waiting for pipeline to start VM ... " + sleep 30s + compute_instances=$(curl -s --retry 5 -H "X-Auth-Token: $sanitize_subject_token" "$sanitize_compute_url/servers/detail" | jq) + INSTANCE_STATUS=$(echo "$compute_instances" | jq --arg compute_id "$compute_id" '.servers[] | select(.id==$compute_id) | .status ') + INSTANCE_STATUS_SANITIZED=$(echo "$INSTANCE_STATUS" | sed 's/\"//g') + + # If the status is not ACTIVE trigger the GitLab pipeline + VM_IS_ACTIVE="TRUE" + if [[ "$INSTANCE_STATUS_SANITIZED" != "ACTIVE" ]]; then + echo "$compute_name is still down." + VM_IS_ACTIVE="FALSE" + else + echo "$compute_name is up." + fi + count=$(($count + 1)) + + if [ "$count" == "$MAX_COUNT" ]; then + echo "Exceeded time limit!" + exit 2 + fi + done else echo "VM ID: $compute_id Name: $compute_name is Healthy." @@ -333,32 +315,27 @@ fi ################################################################################ # If the pipeline is defined check to see if the pipeline completed else wait # until it finished before proceeding -if [ ! -z "$pipeline_id" ] -then +if [ ! -z "$pipeline_id" ]; then count=0 - KEEP_RUNNING="TRUE" - while [ "$KEEP_RUNNING" == "TRUE" ] - do + KEEP_RUNNING="TRUE" + while [ "$KEEP_RUNNING" == "TRUE" ]; do pipeline_status=$(curl -s --header "PRIVATE-TOKEN: ${local_GITLAB_DATAFEDCI_REPO_API_TOKEN}" "https://code.ornl.gov/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines/$pipeline_id" | jq .status | sed 's/\"//g') printf "Attempt $count, Waiting for triggered infrastructure provisioning pipeline: ${pipeline_id} to complete ... " - if [ "$pipeline_status" == "failed" ] - then + if [ "$pipeline_status" == "failed" ]; then echo "Infrastructure triggered pipeline has failed unable to execute CI. STATUS: $pipeline_status" exit 2 - elif [ "$pipeline_status" == "success" ] - then + elif [ "$pipeline_status" == "success" ]; then echo "Infrastructure triggered pipeline has passed. STATUS: $pipeline_status" exit 0 - elif [ "$pipeline_status" == "canceled" ] - then + elif [ "$pipeline_status" == "canceled" ]; then echo "Infrastructure triggered pipeline has failed unable to execute CI. STATUS: $pipeline_status" exit 2 else echo "STATUS: $pipeline_status" fi - + sleep 30s count=$(($count + 1)) diff --git a/scripts/ci_purge_images.sh b/scripts/ci_purge_images.sh index 5a7ae0d41..a7fe7a6e1 100755 --- a/scripts/ci_purge_images.sh +++ b/scripts/ci_purge_images.sh @@ -1,14 +1,13 @@ #!/bin/bash set -euf -# The purpose of this script is to prevent the number of images built on a +# The purpose of this script is to prevent the number of images built on a # VM from taking over to much storage, here we can set the number of GB, that # we will allow to be stored on the VM, after which we will start deleting # the oldest one # Max allowed size of all images in GB -if [ -z "${DATAFED_CI_PURGE_THRESHOLD:-}" ] -then +if [ -z "${DATAFED_CI_PURGE_THRESHOLD:-}" ]; then local_DATAFED_CI_PURGE_THRESHOLD="15" else local_DATAFED_CI_PURGE_THRESHOLD=$(printenv DATAFED_CI_PURGE_THRESHOLD) @@ -18,45 +17,40 @@ echo "Docker Purge Threshold set to: $local_DATAFED_CI_PURGE_THRESHOLD" get_size_of_all_images_in_GB() { declare -g total_image_size_number="0" - docker_size_stats=$(docker system df --format "{{.Type}} {{.Size}}") - total_image_size=$(echo "${docker_size_stats}" | head -1 | awk '{print $2}' ) + docker_size_stats=$(docker system df --format "{{.Type}} {{.Size}}") + total_image_size=$(echo "${docker_size_stats}" | head -1 | awk '{print $2}') echo "Image size is $total_image_size" - if [ ! -z "${total_image_size}" ] - then - if [ "${total_image_size: -2}" = "GB" ] - then + if [ ! -z "${total_image_size}" ]; then + if [ "${total_image_size: -2}" = "GB" ]; then # Removes GB postfix total_image_size_number="${total_image_size%??}" # Removes any floating point pieces i.e. 2.4 = 2 so that it is interpreted # as an integer total_image_size_number="${total_image_size_number%%.*}" - elif [ "${total_image_size: -2}" = "MB" ] - then + elif [ "${total_image_size: -2}" = "MB" ]; then # Removes MB postfix total_image_size_number="${total_image_size%??}" # Removes any floating point pieces i.e. 2.4 = 2 so that it is interpreted # as an integer total_image_size_number="${total_image_size_number%%.*}" # Convert to GB - total_image_size_number=$(( "$total_image_size_number" / 1024)) - elif [ "${total_image_size: -2}" = "kB" ] - then + total_image_size_number=$(("$total_image_size_number" / 1024)) + elif [ "${total_image_size: -2}" = "kB" ]; then # Removes kB postfix total_image_size_number="${total_image_size%??}" # Removes any floating point pieces i.e. 2.4 = 2 so that it is interpreted # as an integer total_image_size_number="${total_image_size_number%%.*}" # Convert to GB - total_image_size_number=$(( "$total_image_size_number" / 1048576)) - elif [ "${total_image_size: -1}" = "B" ] - then + total_image_size_number=$(("$total_image_size_number" / 1048576)) + elif [ "${total_image_size: -1}" = "B" ]; then # Removes B postfix total_image_size_number="${total_image_size%?}" # Removes any floating point pieces i.e. 2.4 = 2 so that it is interpreted # as an integer total_image_size_number="${total_image_size_number%%.*}" # Convert to GB - total_image_size_number=$(( "$total_image_size_number" / 1073741824)) + total_image_size_number=$(("$total_image_size_number" / 1073741824)) else echo "Size reported by 'docker system df --format {{.Type}} {{.Size}}' is" echo "given in unsupported format $docker_size_stats" @@ -73,9 +67,7 @@ purge_oldest_image() { get_size_of_all_images_in_GB -while [ "$total_image_size_number" -gt "$local_DATAFED_CI_PURGE_THRESHOLD" ] -do +while [ "$total_image_size_number" -gt "$local_DATAFED_CI_PURGE_THRESHOLD" ]; do purge_oldest_image get_size_of_all_images_in_GB done - diff --git a/scripts/ci_setup_web_certs.sh b/scripts/ci_setup_web_certs.sh index aa7c1f8db..12b0a6066 100755 --- a/scripts/ci_setup_web_certs.sh +++ b/scripts/ci_setup_web_certs.sh @@ -1,17 +1,13 @@ #!/bin/bash -if [ ! -e "$DATAFED_WEB_CERT_PATH" ] || [ ! -e "$DATAFED_WEB_KEY_PATH" ] -then - if [ -e "$DATAFED_WEB_CERT_PATH" ] - then +if [ ! -e "$DATAFED_WEB_CERT_PATH" ] || [ ! -e "$DATAFED_WEB_KEY_PATH" ]; then + if [ -e "$DATAFED_WEB_CERT_PATH" ]; then rm "${DATAFED_WEB_CERT_PATH}" fi - if [ -e "$DATAFED_WEB_KEY_PATH" ] - then + if [ -e "$DATAFED_WEB_KEY_PATH" ]; then rm "${DATAFED_WEB_KEY_PATH}" fi - if [ -e "$DATAFED_WEB_CSR_PATH" ] - then + if [ -e "$DATAFED_WEB_CSR_PATH" ]; then rm "${DATAFED_WEB_CSR_PATH}" fi openssl genrsa -out "$DATAFED_WEB_KEY_PATH" 2048 @@ -19,8 +15,7 @@ then -out "${DATAFED_WEB_CSR_PATH}" \ -subj "/C=US/ST=TN/L=Oak Ridge/O=ORNL/OU=DLT/CN=${DI_DATAFED_DOMAIN}" openssl x509 -req -days 3650 \ - -in "${DATAFED_WEB_CSR_PATH}" \ - -signkey "$DATAFED_WEB_KEY_PATH" \ - -out "$DATAFED_WEB_CERT_PATH" + -in "${DATAFED_WEB_CSR_PATH}" \ + -signkey "$DATAFED_WEB_KEY_PATH" \ + -out "$DATAFED_WEB_CERT_PATH" fi - diff --git a/scripts/clear_db.sh b/scripts/clear_db.sh index 2d4931508..0e40703ff 100755 --- a/scripts/clear_db.sh +++ b/scripts/clear_db.sh @@ -9,40 +9,29 @@ set -euf local_DATABASE_NAME="sdms" local_DATABASE_USER="root" -if [ -z "${DATAFED_DATABASE_PASSWORD:-}" ] -then +if [ -z "${DATAFED_DATABASE_PASSWORD:-}" ]; then local_DATAFED_DATABASE_PASSWORD="" else local_DATAFED_DATABASE_PASSWORD=$(printenv DATAFED_DATABASE_PASSWORD) fi -if [ -z "${DATAFED_ZEROMQ_SYSTEM_SECRET:-}" ] -then - local_DATAFED_ZEROMQ_SYSTEM_SECRET="" -else - local_DATAFED_ZEROMQ_SYSTEM_SECRET=$(printenv DATAFED_ZEROMQ_SYSTEM_SECRET) -fi - -if [ -z "${DATAFED_DATABASE_HOST:-}" ] -then +if [ -z "${DATAFED_DATABASE_HOST:-}" ]; then local_DATAFED_DATABASE_HOST="localhost" else local_DATAFED_DATABASE_HOST=$(printenv DATAFED_DATABASE_HOST) fi -if [ -z "${DATAFED_DATABASE_PORT:-}" ] -then +if [ -z "${DATAFED_DATABASE_PORT:-}" ]; then local_DATAFED_DATABASE_PORT="8529" else local_DATAFED_DATABASE_PORT=$(printenv DATAFED_DATABASE_PORT) fi # Delete database and API from arangodb -if command -v arangosh &> /dev/null -then +if command -v arangosh &>/dev/null; then echo "arangosh --server.endpoint http+tcp://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}" - echo " --server.username $local_DATABASE_USER" - echo " --server.password $local_DATAFED_DATABASE_PASSWORD" + echo " --server.username $local_DATABASE_USER" + echo " --server.password $local_DATAFED_DATABASE_PASSWORD" echo " --javascript.execute-string \"print(db._databases().includes('$local_DATABASE_NAME'))\"" echo " --log.use-json-format true" @@ -50,11 +39,12 @@ then # produce inconsistent results. The output was found to not always be # sent to the variable 'output=$(arangosh ... "console.log(db._da...)) # using print in the javascript is found to be much more reliable. - exists=$(arangosh --server.endpoint "http+tcp://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}" \ - --server.username "$local_DATABASE_USER" \ - --server.password "$local_DATAFED_DATABASE_PASSWORD" \ - --javascript.execute-string "print(db._databases().includes('$local_DATABASE_NAME'))" \ - --log.use-json-format true + exists=$( + arangosh --server.endpoint "http+tcp://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}" \ + --server.username "$local_DATABASE_USER" \ + --server.password "$local_DATAFED_DATABASE_PASSWORD" \ + --javascript.execute-string "print(db._databases().includes('$local_DATABASE_NAME'))" \ + --log.use-json-format true ) if [[ "$exists" == "true" ]]; then @@ -69,12 +59,12 @@ then echo "Does it exist $exists" if [ "$exists" = "true" ]; then - arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}" \ + arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}" \ --server.password "${local_DATAFED_DATABASE_PASSWORD}" \ --server.username "${local_DATABASE_USER}" \ --javascript.execute-string "db._dropDatabase('$local_DATABASE_NAME');" else - echo "Database $local_DATABASE_NAME does not exist." + echo "Database $local_DATABASE_NAME does not exist." fi fi diff --git a/scripts/compose_build_images.sh b/scripts/compose_build_images.sh index 2d5eb5d5d..1536367b7 100755 --- a/scripts/compose_build_images.sh +++ b/scripts/compose_build_images.sh @@ -6,8 +6,7 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../") -Help() -{ +Help() { echo "$(basename $0) Build images for compose run by default will build all." echo echo "Syntax: $(basename $0) [-h|r|m|b]" @@ -29,28 +28,30 @@ BASE_IMAGE="" eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -r | --repo-images) - BUILD_METADATA="FALSE" - shift 1 - ;; - -m | --metadata-images) - BUILD_REPO="FALSE" - shift 1 - ;; - -b | --base-image) - BASE_IMAGE="$2" - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -r | --repo-images) + BUILD_METADATA="FALSE" + shift 1 + ;; + -m | --metadata-images) + BUILD_REPO="FALSE" + shift 1 + ;; + -b | --base-image) + BASE_IMAGE="$2" + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done @@ -58,24 +59,14 @@ echo "BASE_IMAGE: $BASE_IMAGE" echo "BUILD_METADATA: $BUILD_METADATA" echo "BUILD_REPO: $BUILD_REPO" -if [[ "$BUILD_METADATA" == "TRUE" ]] -then - if [ "$BASE_IMAGE" == "" ] - then - docker build \ - -f "${PROJECT_ROOT}/docker/Dockerfile.dependencies" \ - "${PROJECT_ROOT}" \ - -t datafed-dependencies:latest +if [[ "$BUILD_METADATA" == "TRUE" ]]; then + "${PROJECT_ROOT}"/external/DataFedDependencies/scripts/build_image.sh --base-image "$BASE_IMAGE" + if [ "$BASE_IMAGE" == "" ]; then docker build \ -f "${PROJECT_ROOT}/docker/Dockerfile.runtime" \ "${PROJECT_ROOT}" \ -t datafed-runtime:latest else - docker build \ - -f "${PROJECT_ROOT}/docker/Dockerfile.dependencies" \ - "${PROJECT_ROOT}" \ - --build-arg BASE_IMAGE=$BASE_IMAGE \ - -t datafed-dependencies:latest docker build \ -f "${PROJECT_ROOT}/docker/Dockerfile.runtime" \ "${PROJECT_ROOT}" \ @@ -109,29 +100,19 @@ then -t datafed-foxx:latest fi -if [[ "$BUILD_REPO" == "TRUE" ]] -then - source "${PROJECT_ROOT}/scripts/dependency_versions.sh" +if [[ "$BUILD_REPO" == "TRUE" ]]; then + source "${PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_versions.sh" cd "${PROJECT_ROOT}/external/globus-connect-server-deploy/docker" git checkout "$DATAFED_GCS_SUBMODULE_VERSION" - docker build --progress plain --tag "gcs-ubuntu-base:latest" - < "./docker-files/Dockerfile.ubuntu-20.04" + docker build --progress plain --tag "gcs-ubuntu-base:latest" - <"./docker-files/Dockerfile.debian-12" cd "${PROJECT_ROOT}" - if [ "$BASE_IMAGE" == "" ] - then - docker build \ - -f "${PROJECT_ROOT}/docker/Dockerfile.dependencies" \ - "${PROJECT_ROOT}" \ - -t datafed-dependencies:latest + "${PROJECT_ROOT}"/external/DataFedDependencies/scripts/build_image.sh --base-image "$BASE_IMAGE" + if [ "$BASE_IMAGE" == "" ]; then docker build \ -f "${PROJECT_ROOT}/docker/Dockerfile.runtime" \ "${PROJECT_ROOT}" \ -t datafed-runtime:latest else - docker build \ - -f "${PROJECT_ROOT}/docker/Dockerfile.dependencies" \ - "${PROJECT_ROOT}" \ - --build-arg BASE_IMAGE=$BASE_IMAGE \ - -t datafed-dependencies:latest docker build \ -f "${PROJECT_ROOT}/docker/Dockerfile.runtime" \ "${PROJECT_ROOT}" \ diff --git a/scripts/compose_cleanup_globus_files.sh b/scripts/compose_cleanup_globus_files.sh index b01cf592f..30b35956a 100755 --- a/scripts/compose_cleanup_globus_files.sh +++ b/scripts/compose_cleanup_globus_files.sh @@ -3,12 +3,11 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/..") -source "${SOURCE}/dependency_versions.sh" +source "${PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_versions.sh" # This script should be run after generating the .env file as it will pull # values from the .env file -Help() -{ +Help() { echo "$(basename $0) cleanup globus files. Note the .env file must exist." echo " in the specified directory." echo @@ -24,30 +23,30 @@ DIRECTORY="" eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -d | --directory) - DIRECTORY="$2" - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -d | --directory) + DIRECTORY="$2" + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done -if [ ! -d "${DIRECTORY}" ] -then +if [ ! -d "${DIRECTORY}" ]; then echo "The provided directory does not seem to exist: ${DIRECTORY}" fi -if [ ! -f "${DIRECTORY}/.env" ] -then +if [ ! -f "${DIRECTORY}/.env" ]; then echo "Missing . ${DIRECTORY}/.env file. This file needs to be" echo "created first" exit 1 @@ -58,18 +57,16 @@ fi export DATAFED_GLOBUS_DEPLOYMENT_KEY_PATH="$DATAFED_HOST_DEPLOYMENT_KEY_PATH" export DATAFED_GLOBUS_CRED_FILE_PATH="$DATAFED_HOST_CRED_FILE_PATH" -if [ -f "$DATAFED_HOST_CRED_FILE_PATH" ] -then - export GCS_CLI_CLIENT_ID=$(jq -r .client < "${DATAFED_HOST_CRED_FILE_PATH}") - export GCS_CLI_CLIENT_SECRET=$(jq -r .secret < "${DATAFED_HOST_CRED_FILE_PATH}") +if [ -f "$DATAFED_HOST_CRED_FILE_PATH" ]; then + export GCS_CLI_CLIENT_ID=$(jq -r .client <"${DATAFED_HOST_CRED_FILE_PATH}") + export GCS_CLI_CLIENT_SECRET=$(jq -r .secret <"${DATAFED_HOST_CRED_FILE_PATH}") fi -if [ -f "$DATAFED_GLOBUS_DEPLOYMENT_KEY_PATH" ] -then - export GCS_CLI_ENDPOINT_ID=$(jq -r .client_id < "${DATAFED_GLOBUS_DEPLOYMENT_KEY_PATH}") +if [ -f "$DATAFED_GLOBUS_DEPLOYMENT_KEY_PATH" ]; then + export GCS_CLI_ENDPOINT_ID=$(jq -r .client_id <"${DATAFED_GLOBUS_DEPLOYMENT_KEY_PATH}") fi sudo globus-connect-server node cleanup DATAFED_GCS_ROOT_NAME="$DATAFED_GCS_ROOT_NAME" \ -"python${DATAFED_PYTHON_VERSION}" "${PROJECT_ROOT}/scripts/globus/globus_cleanup.py" + "python${DATAFED_PYTHON_VERSION}" "${PROJECT_ROOT}/scripts/globus/globus_cleanup.py" diff --git a/scripts/compose_generate_env.sh b/scripts/compose_generate_env.sh index 93d99ee5a..5504c52d1 100755 --- a/scripts/compose_generate_env.sh +++ b/scripts/compose_generate_env.sh @@ -3,340 +3,352 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/..") -Help() -{ +Help() { echo "$(basename $0) Build .env file for compose." echo - echo "Syntax: $(basename $0) [-h|d|r|m]" + echo "Syntax: $(basename $0) [-h|d|r|m|c|f|a]" echo "options:" echo "-h, --help Print this help message" echo "-d, --directory Directory where .env will be created." echo "-r, --repo-images Create .env for just repo services." echo "-m, --metadata-images Create .env for just metadata services" + echo "-c, --no-overwrite-certs Do not overwrite existing certificates" + echo "-f, --force Force overwrite existing .env file" + echo "-a, --arango-use-ssl Install certificates and use HTTPS for ArangoDB (default: HTTP)" } -VALID_ARGS=$(getopt -o hd:mr --long 'help',directory:,repo-images,metadata-images -- "$@") +VALID_ARGS=$(getopt -o hd:mrfca --long 'help',directory:,repo-images,metadata-images,force,no-overwrite-certs,arango-use-ssl -- "$@") BUILD_REPO="TRUE" BUILD_METADATA="TRUE" COMPOSE_ENV_DIR="" +OVERWRITE_CERTS="TRUE" +FORCE_OVERWRITE="FALSE" +ARANGO_USE_SSL="FALSE" eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -d | --directory) - COMPOSE_ENV_DIR="$2" - shift 2 - ;; - -r | --repo-images) - BUILD_METADATA="FALSE" - shift 1 - ;; - -m | --metadata-images) - BUILD_REPO="FALSE" - shift 1 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -d | --directory) + COMPOSE_ENV_DIR="$2" + shift 2 + ;; + -r | --repo-images) + BUILD_METADATA="FALSE" + shift 1 + ;; + -m | --metadata-images) + BUILD_REPO="FALSE" + shift 1 + ;; + -c | --no-overwrite-certs) + OVERWRITE_CERTS="FALSE" + shift 1 + ;; + -f | --force) + FORCE_OVERWRITE="TRUE" + shift 1 + ;; + -a | --arango-use-ssl) + ARANGO_USE_SSL="TRUE" + shift 1 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "ERROR - Invalid command line flag detected." + exit + ;; esac done -if [ ! -d "${COMPOSE_ENV_DIR}" ] -then - echo "Invalid folder for .env file specified ${COMPOSE_ENV_DIR}" +if [ ! -d "${COMPOSE_ENV_DIR}" ]; then + echo "ERROR - Invalid folder for .env file specified ${COMPOSE_ENV_DIR}" exit 1 fi -if [ -f "${COMPOSE_ENV_DIR}/.env" ] -then - echo "${COMPOSE_ENV_DIR}/.env already exist! Will not overwrite!" - exit 1 -fi - -local_DATAFED_WEB_KEY_DIR="${COMPOSE_ENV_DIR}/keys" -if [ ! -d "$local_DATAFED_WEB_KEY_DIR" ] -then - mkdir -p "$local_DATAFED_WEB_KEY_DIR" -fi - -if [ -z "${DATAFED_COMPOSE_DOMAIN}" ] -then - local_DATAFED_COMPOSE_DOMAIN="localhost" -else - local_DATAFED_COMPOSE_DOMAIN=$(printenv DATAFED_COMPOSE_DOMAIN) -fi +# Function to read existing .env file values +read_existing_env() { + local env_file="$1" + if [ -f "$env_file" ]; then + echo "INFO - Reading existing values from $env_file" + # Source the .env file to load existing values + set -a # automatically export all variables + source "$env_file" + set +a # turn off automatic export + fi +} -local_DATAFED_WEB_CERT_NAME="cert.crt" -local_DATAFED_WEB_KEY_NAME="cert.key" +# Function to get value with fallback priority: existing .env -> environment -> default +get_env_value() { + local var_name="$1" + local default_value="$2" + local existing_value="" -local_DATAFED_WEB_CERT_PATH="${local_DATAFED_WEB_KEY_DIR}/${local_DATAFED_WEB_CERT_NAME}" -local_DATAFED_WEB_CSR_PATH="${local_DATAFED_WEB_KEY_DIR}/cert.csr" -local_DATAFED_WEB_KEY_PATH="${local_DATAFED_WEB_KEY_DIR}/${local_DATAFED_WEB_KEY_NAME}" + # Get existing value from sourced .env file + existing_value=$(eval echo "\$${var_name}") -if [ ! -e "$local_DATAFED_WEB_CERT_PATH" ] || [ ! -e "$local_DATAFED_WEB_KEY_PATH" ] -then - if [ -e "$local_DATAFED_WEB_CERT_PATH" ] - then - rm "${local_DATAFED_WEB_CERT_PATH}" - fi - if [ -e "$local_DATAFED_WEB_KEY_PATH" ] - then - rm "${local_DATAFED_WEB_KEY_PATH}" - fi - if [ -e "$local_DATAFED_WEB_CSR_PATH" ] - then - rm "${local_DATAFED_WEB_CSR_PATH}" + # Priority: existing .env value -> environment variable -> default + if [ -n "$existing_value" ]; then + echo "$existing_value" + elif [ -n "$(printenv "$var_name")" ]; then + printenv "$var_name" + else + echo "$default_value" fi - openssl genrsa -out "$local_DATAFED_WEB_KEY_PATH" 2048 - openssl req -new -key "$local_DATAFED_WEB_KEY_PATH" \ - -out "${local_DATAFED_WEB_CSR_PATH}" \ - -subj "/C=US/ST=TN/L=Oak Ridge/O=ORNL/OU=DLT/CN=${local_DATAFED_COMPOSE_DOMAIN}" - openssl x509 -req -days 3650 \ - -in "${local_DATAFED_WEB_CSR_PATH}" \ - -signkey "$local_DATAFED_WEB_KEY_PATH" \ - -out "$local_DATAFED_WEB_CERT_PATH" -fi - -if [ -z "${DATAFED_COMPOSE_USER89_PASSWORD}" ] -then - local_DATAFED_COMPOSE_USER89_PASSWORD="" # For End to end testing -else - local_DATAFED_COMPOSE_USER89_PASSWORD=$(printenv DATAFED_COMPOSE_USER89_PASSWORD) -fi +} -if [ -z "${DATAFED_COMPOSE_REPO_DOMAIN}" ] -then +ENV_FILE_PATH="${COMPOSE_ENV_DIR}/.env" - # Make the repo domain equivalent to the COMPOSE DOMAIN unless REPO_DOMAIN is - # specified explicitly, and it is not localhost, communication between the - # core container and the repo container will not resolve using localhost. - if [ "${local_DATAFED_COMPOSE_DOMAIN}" = "localhost" ] - then - local_DATAFED_COMPOSE_REPO_DOMAIN="" +# Check if .env file exists and handle accordingly +if [ -f "$ENV_FILE_PATH" ]; then + if [ "$FORCE_OVERWRITE" = "FALSE" ]; then + echo "INFO - Found existing .env file at $ENV_FILE_PATH" + echo "INFO - Reading existing values and updating with any new environment variables..." + read_existing_env "$ENV_FILE_PATH" else - local_DATAFED_COMPOSE_REPO_DOMAIN="${local_DATAFED_COMPOSE_DOMAIN}" + echo "INFO - Force overwrite enabled. Existing .env file will be replaced." fi else - local_DATAFED_COMPOSE_REPO_DOMAIN=$(printenv DATAFED_COMPOSE_REPO_DOMAIN) + echo "INFO - Creating new .env file at $ENV_FILE_PATH" fi -if [ -z "${DATAFED_COMPOSE_REPO_FORM_PATH}" ] -then - local_DATAFED_COMPOSE_REPO_FORM_PATH="" # Where the repo form is located also needed for testing -else - local_DATAFED_COMPOSE_REPO_FORM_PATH=$(printenv DATAFED_COMPOSE_REPO_FORM_PATH) +local_DATAFED_KEY_DIR="${COMPOSE_ENV_DIR}/keys" +if [ ! -d "$local_DATAFED_KEY_DIR" ]; then + mkdir -p "$local_DATAFED_KEY_DIR" fi -if [ -z "${DATAFED_COMPOSE_GLOBUS_APP_SECRET}" ] -then - local_DATAFED_COMPOSE_GLOBUS_APP_SECRET="" -else - local_DATAFED_COMPOSE_GLOBUS_APP_SECRET=$(printenv DATAFED_COMPOSE_GLOBUS_APP_SECRET) -fi -if [ -z "${DATAFED_COMPOSE_GLOBUS_APP_ID}" ] -then - local_DATAFED_COMPOSE_GLOBUS_APP_ID="" -else - local_DATAFED_COMPOSE_GLOBUS_APP_ID=$(printenv DATAFED_COMPOSE_GLOBUS_APP_ID) -fi -if [ -z "${DATAFED_GLOBUS_KEY_DIR}" ] -then - local_DATAFED_GLOBUS_KEY_DIR="${COMPOSE_ENV_DIR}/globus" -else - local_DATAFED_GLOBUS_KEY_DIR=$(printenv DATAFED_GLOBUS_KEY_DIR) -fi -if [ -z "${DATAFED_COMPOSE_ZEROMQ_SESSION_SECRET}" ] -then - local_DATAFED_COMPOSE_ZEROMQ_SESSION_SECRET="" -else - local_DATAFED_COMPOSE_ZEROMQ_SESSION_SECRET=$(printenv DATAFED_COMPOSE_ZEROMQ_SESSION_SECRET) -fi -if [ -z "${DATAFED_COMPOSE_ZEROMQ_SYSTEM_SECRET}" ] -then - local_DATAFED_COMPOSE_ZEROMQ_SYSTEM_SECRET="" -else - local_DATAFED_COMPOSE_ZEROMQ_SYSTEM_SECRET=$(printenv DATAFED_COMPOSE_ZEROMQ_SYSTEM_SECRET) -fi -if [ -z "${DATAFED_COMPOSE_HTTPS_SERVER_PORT}" ] -then - local_DATAFED_COMPOSE_HTTPS_SERVER_PORT="443" -else - local_DATAFED_COMPOSE_HTTPS_SERVER_PORT=$(printenv DATAFED_COMPOSE_HTTPS_SERVER_PORT) -fi -if [ -z "${DATAFED_COMPOSE_CONTAINER_LOG_PATH}" ] -then - local_DATAFED_COMPOSE_CONTAINER_LOG_PATH="/opt/datafed/logs" -else - local_DATAFED_COMPOSE_CONTAINER_LOG_PATH=$(printenv DATAFED_COMPOSE_CONTAINER_LOG_PATH) -fi -if [ -z "${DATAFED_COMPOSE_DATABASE_PASSWORD}" ] -then - local_DATAFED_COMPOSE_DATABASE_PASSWORD="butterscotch" -else - local_DATAFED_COMPOSE_DATABASE_PASSWORD=$(printenv DATAFED_COMPOSE_DATABASE_PASSWORD) -fi +# Use the new function to get values with proper fallback +local_DATAFED_DOMAIN=$(get_env_value "DATAFED_DOMAIN" "localhost") +local_DATAFED_WEB_CERT_NAME="cert.crt" +local_DATAFED_WEB_KEY_NAME="cert.key" -if [ -z "${DATAFED_COMPOSE_DATABASE_IP_ADDRESS}" ] -then - local_DATAFED_COMPOSE_DATABASE_IP_ADDRESS="http://arango" +local_DATAFED_ARANGO_CERT_NAME="datafed-arango.crt" +local_DATAFED_ARANGO_KEY_NAME="datafed-arango.key" +local_DATAFED_ARANGO_PEM_NAME="datafed-arango.pem" + +local_DATAFED_WEB_CERT_PATH=$(get_env_value "DATAFED_WEB_CERT_PATH" "${local_DATAFED_KEY_DIR}/${local_DATAFED_WEB_CERT_NAME}") +local_DATAFED_WEB_CSR_PATH=$(get_env_value "DATAFED_WEB_CSR_PATH" "${local_DATAFED_KEY_DIR}/cert.csr") +local_DATAFED_WEB_KEY_PATH=$(get_env_value "DATAFED_WEB_KEY_PATH" "${local_DATAFED_KEY_DIR}/${local_DATAFED_WEB_KEY_NAME}") +local_DATAFED_ARANGO_CERT_PATH=$(get_env_value "DATAFED_ARANGO_CERT_PATH" "") +local_DATAFED_ARANGO_CSR_PATH=$(get_env_value "DATAFED_ARANGO_CSR_PATH" "") +local_DATAFED_ARANGO_KEY_PATH=$(get_env_value "DATAFED_ARANGO_KEY_PATH" "") +local_DATAFED_ARANGO_PEM_PATH=$(get_env_value "DATAFED_ARANGO_PEM_PATH" "") + +# Get all values using the new function +local_DATAFED_UID=$(get_env_value "DATAFED_UID" "$(id -u)") +local_DATAFED_USER89_PASSWORD=$(get_env_value "DATAFED_USER89_PASSWORD" "") +local_DATAFED_REPO_FORM_PATH=$(get_env_value "DATAFED_REPO_FORM_PATH" "") +local_DATAFED_GLOBUS_APP_SECRET=$(get_env_value "DATAFED_GLOBUS_APP_SECRET" "") +local_DATAFED_GLOBUS_APP_ID=$(get_env_value "DATAFED_GLOBUS_APP_ID" "") +local_DATAFED_GLOBUS_KEY_DIR=$(get_env_value "DATAFED_GLOBUS_KEY_DIR" "${COMPOSE_ENV_DIR}/globus") +local_DATAFED_ZEROMQ_SESSION_SECRET=$(get_env_value "DATAFED_ZEROMQ_SESSION_SECRET" "") +local_DATAFED_HTTPS_SERVER_PORT=$(get_env_value "DATAFED_HTTPS_SERVER_PORT" "443") +local_DATAFED_CONTAINER_LOG_PATH=$(get_env_value "DATAFED_CONTAINER_LOG_PATH" "/opt/datafed/logs") +local_DATAFED_DATABASE_PASSWORD=$(get_env_value "DATAFED_DATABASE_PASSWORD" "butterscotch") +local_DATAFED_DATABASE_IP_ADDRESS=$(get_env_value "DATAFED_DATABASE_IP_ADDRESS" "http://arango") +local_DATAFED_ENABLE_FOXX_TESTS=$(get_env_value "DATAFED_ENABLE_FOXX_TESTS" "FALSE") +local_DATAFED_DATABASE_PORT=$(get_env_value "DATAFED_DATABASE_PORT" "8529") +local_DATAFED_GCS_ROOT_NAME=$(get_env_value "DATAFED_GCS_ROOT_NAME" "DataFed_Compose") +local_DATAFED_GCS_IP=$(get_env_value "DATAFED_GCS_IP" "") +local_DATAFED_REPO_ID_AND_DIR=$(get_env_value "DATAFED_REPO_ID_AND_DIR" "datafed-repo") +local_DATAFED_HOST_COLLECTION_MOUNT=$(get_env_value "DATAFED_HOST_COLLECTION_MOUNT" "$HOME/compose_collection") +local_DATAFED_HOST_DEPLOYMENT_KEY_PATH=$(get_env_value "DATAFED_HOST_DEPLOYMENT_KEY_PATH" "${local_DATAFED_GLOBUS_KEY_DIR}/deployment-key.json") +local_DATAFED_HOST_CRED_FILE_PATH=$(get_env_value "DATAFED_HOST_CRED_FILE_PATH" "${local_DATAFED_GLOBUS_KEY_DIR}/client_cred.json") +local_DATAFED_GCS_COLLECTION_BASE_PATH=$(get_env_value "DATAFED_GCS_COLLECTION_BASE_PATH" "/") +local_DATAFED_GCS_COLLECTION_ROOT_PATH=$(get_env_value "DATAFED_GCS_COLLECTION_ROOT_PATH" "/mnt/datafed") +local_DATAFED_GLOBUS_CONTROL_PORT=$(get_env_value "DATAFED_GLOBUS_CONTROL_PORT" "443") +local_DATAFED_GLOBUS_SUBSCRIPTION=$(get_env_value "DATAFED_GLOBUS_SUBSCRIPTION" "") +local_DATAFED_CORE_LOG_LEVEL=$(get_env_value "DATAFED_CORE_LOG_LEVEL" "3") + +need_web_certs="FALSE" +# Check if we need to generate certificates +if [ "$OVERWRITE_CERTS" = "TRUE" ]; then + echo "INFO - Overwrite certs flag enabled. Regenerating SSL certificates..." + need_web_certs="TRUE" +elif [ ! -e "$local_DATAFED_WEB_CERT_PATH" ] || [ ! -e "$local_DATAFED_WEB_KEY_PATH" ]; then + echo "INFO - SSL certificates not found. Generating new certificates..." + need_web_certs="TRUE" else - local_DATAFED_COMPOSE_DATABASE_IP_ADDRESS=$(printenv DATAFED_COMPOSE_DATABASE_IP_ADDRESS) + echo "INFO - Using existing SSL certificates" fi -if [ -z "${DATAFED_ENABLE_FOXX_TESTS}" ] -then - local_DATAFED_ENABLE_FOXX_TESTS="FALSE" -else - local_DATAFED_ENABLE_FOXX_TESTS=$(printenv DATAFED_ENABLE_FOXX_TESTS) -fi +need_arango_certs="FALSE" +# Decide if Arango certs need to be generated +if [ "$ARANGO_USE_SSL" = "TRUE" ]; then + if [ "$OVERWRITE_CERTS" = "TRUE" ] || [ ! -e "$local_DATAFED_ARANGO_CERT_PATH" ] || [ ! -e "$local_DATAFED_ARANGO_KEY_PATH" ]; then + echo "INFO - Generating SSL certificates for ArangoDB..." + need_arango_certs="TRUE" + else + echo "Using existing ArangoDB SSL certificates" + fi -if [ -z "${DATAFED_COMPOSE_DATABASE_PORT}" ] -then - local_DATAFED_COMPOSE_DATABASE_PORT="8529" -else - local_DATAFED_COMPOSE_DATABASE_PORT=$(printenv DATAFED_COMPOSE_DATABASE_PORT) -fi + [ -z "$local_DATAFED_ARANGO_CERT_PATH" ] && + local_DATAFED_ARANGO_CERT_PATH="${local_DATAFED_KEY_DIR}/${local_DATAFED_ARANGO_CERT_NAME}" -if [ -z "${DATAFED_COMPOSE_GCS_IP}" ] -then - local_DATAFED_COMPOSE_GCS_IP="" -else - local_DATAFED_COMPOSE_GCS_IP=$(printenv DATAFED_COMPOSE_GCS_IP) -fi + [ -z "$local_DATAFED_ARANGO_CSR_PATH" ] && + local_DATAFED_ARANGO_CSR_PATH="${local_DATAFED_KEY_DIR}/datafed-arango.csr" -if [ -z "${DATAFED_COMPOSE_HOST_COLLECTION_MOUNT}" ] -then - local_DATAFED_HOST_COLLECTION_MOUNT="$HOME/compose_collection" -else - local_DATAFED_HOST_COLLECTION_MOUNT=$(printenv DATAFED_COMPOSE_HOST_COLLECTION_MOUNT) -fi + [ -z "$local_DATAFED_ARANGO_KEY_PATH" ] && + local_DATAFED_ARANGO_KEY_PATH="${local_DATAFED_KEY_DIR}/${local_DATAFED_ARANGO_KEY_NAME}" -if [ -z "${DATAFED_COMPOSE_HOST_DEPLOYMENT_KEY_PATH}" ] -then - local_DATAFED_COMPOSE_HOST_DEPLOYMENT_KEY_PATH="${local_DATAFED_GLOBUS_KEY_DIR}/deployment-key.json" -else - local_DATAFED_COMPOSE_HOST_DEPLOYMENT_KEY_PATH=$(printenv DATAFED_COMPOSE_HOST_DEPLOYMENT_KEY_PATH) -fi + [ -z "$local_DATAFED_ARANGO_PEM_PATH" ] && + local_DATAFED_ARANGO_PEM_PATH="${local_DATAFED_KEY_DIR}/${local_DATAFED_ARANGO_PEM_NAME}" -if [ -z "${DATAFED_COMPOSE_HOST_CRED_FILE_PATH}" ] -then - local_DATAFED_HOST_CRED_FILE_PATH="${local_DATAFED_GLOBUS_KEY_DIR}/client_cred.json" + if [ "$local_DATAFED_DATABASE_IP_ADDRESS" == "http://arango" ]; then + echo "WARNING - Switching http://arango to https://arango" + local_DATAFED_DATABASE_IP_ADDRESS="https://arango" + fi else - local_DATAFED_HOST_CRED_FILE_PATH=$(printenv DATAFED_COMPOSE_HOST_CRED_FILE_PATH) + found_arango_certs="FALSE" + for file in \ + "${local_DATAFED_KEY_DIR}/${local_DATAFED_ARANGO_KEY_NAME}" \ + "${local_DATAFED_KEY_DIR}/${local_DATAFED_ARANGO_PEM_NAME}" \ + "${local_DATAFED_KEY_DIR}/${local_DATAFED_ARANGO_CERT_NAME}"; do + [ -f "$file" ] && found_arango_certs="TRUE" + done + + if [ "$found_arango_certs" == "TRUE" ]; then + echo "WARNING - Found arango certificate files in ${local_DATAFED_KEY_DIR}" + echo " if you do not intend to build with https they will need to be removed!" + fi fi -if [ -z "${DATAFED_GCS_COLLECTION_BASE_PATH}" ] -then - local_DATAFED_GCS_COLLECTION_BASE_PATH="/" -else - local_DATAFED_GCS_COLLECTION_BASE_PATH=$(printenv DATAFED_GCS_COLLECTION_BASE_PATH) -fi +if [ "$need_web_certs" = "TRUE" ]; then + for file in \ + "$local_DATAFED_WEB_CERT_PATH" \ + "$local_DATAFED_WEB_KEY_PATH" \ + "$local_DATAFED_WEB_CSR_PATH"; do + [ -e "$file" ] && rm "$file" + done -if [ -z "${DATAFED_GCS_COLLECTION_ROOT_PATH}" ] -then - local_DATAFED_GCS_COLLECTION_ROOT_PATH="/mnt/datafed" -else - local_DATAFED_GCS_COLLECTION_ROOT_PATH=$(printenv DATAFED_GCS_COLLECTION_ROOT_PATH) -fi + openssl genrsa -out "$local_DATAFED_WEB_KEY_PATH" 2048 + openssl req -new -key "$local_DATAFED_WEB_KEY_PATH" \ + -out "${local_DATAFED_WEB_CSR_PATH}" \ + -subj "/C=US/ST=TN/L=DataFed/O=DataFed/OU=DataFed/CN=${local_DATAFED_DOMAIN}" + openssl x509 -req -days 3650 \ + -in "${local_DATAFED_WEB_CSR_PATH}" \ + -signkey "$local_DATAFED_WEB_KEY_PATH" \ + -out "$local_DATAFED_WEB_CERT_PATH" +fi + +if [ "$need_arango_certs" = "TRUE" ]; then + for file in \ + "$local_DATAFED_ARANGO_CERT_PATH" \ + "$local_DATAFED_ARANGO_KEY_PATH" \ + "$local_DATAFED_ARANGO_CSR_PATH" \ + "$local_DATAFED_ARANGO_PEM_PATH"; do + [ -e "$file" ] && rm "$file" + done + + openssl genrsa -out "$local_DATAFED_ARANGO_KEY_PATH" 2048 + openssl req -new -key "$local_DATAFED_ARANGO_KEY_PATH" \ + -out "${local_DATAFED_ARANGO_CSR_PATH}" \ + -subj "/C=US/ST=TN/L=DataFed/O=DataFed/OU=DataFed/CN=arango" + openssl x509 -req -days 3650 \ + -in "${local_DATAFED_ARANGO_CSR_PATH}" \ + -signkey "$local_DATAFED_ARANGO_KEY_PATH" \ + -out "$local_DATAFED_ARANGO_CERT_PATH" -if [ -z "${DATAFED_GLOBUS_CONTROL_PORT}" ] -then - # For compose will set by default to run on a port other than 443 because - # the core metadata services use 443 for the web server 7510 - local_DATAFED_GLOBUS_CONTROL_PORT="443" -else - local_DATAFED_GLOBUS_CONTROL_PORT=$(printenv DATAFED_GLOBUS_CONTROL_PORT) + cat "$local_DATAFED_ARANGO_CERT_PATH" "$local_DATAFED_ARANGO_KEY_PATH" >"$local_DATAFED_ARANGO_PEM_PATH" fi -if [ -z "${DATAFED_GLOBUS_SUBSCRIPTION}" ] -then - # For compose will set by default to run on a port other than 443 because - # the core metadata services use 443 for the web server - local_DATAFED_GLOBUS_SUBSCRIPTION="" +if [ -f "${local_DATAFED_ARANGO_CERT_PATH}" ]; then + if [ ${local_DATAFED_DATABASE_IP_ADDRESS} == "http://arango" ]; then + echo "WARNING - Discovered that Arango is set to use certificate: $local_DATAFED_ARANGO_CERT_PATH" + echo " switching DATAFED_DATABASE_IP_ADDRESS from http://arango to https://arango" + local_DATAFED_DATABASE_IP_ADDRESS="https://arango" + fi else - local_DATAFED_GLOBUS_SUBSCRIPTION=$(printenv DATAFED_GLOBUS_SUBSCRIPTION) + if [ ${local_DATAFED_DATABASE_IP_ADDRESS} == "https://arango" ]; then + echo "WARNING - Discovered that Arango certs are not defined." + echo " switching DATAFED_DATABASE_IP_ADDRESS from https://arango to http://arango" + local_DATAFED_DATABASE_IP_ADDRESS="http://arango" + fi fi -if [ -z "${DATAFED_CORE_LOG_LEVEL}" ] -then - local_DATAFED_CORE_LOG_LEVEL=3 +# Handle repo domain logic +if [ -z "$(get_env_value "DATAFED_REPO_DOMAIN" "")" ]; then + if [ "${local_DATAFED_DOMAIN}" = "localhost" ]; then + local_DATAFED_REPO_DOMAIN="" + else + local_DATAFED_REPO_DOMAIN="${local_DATAFED_DOMAIN}" + fi else - local_DATAFED_CORE_LOG_LEVEL=$(printenv DATAFED_CORE_LOG_LEVEL) + local_DATAFED_REPO_DOMAIN=$(get_env_value "DATAFED_REPO_DOMAIN" "") fi # Make the logs folder if it doesn't exist mkdir -p "${COMPOSE_ENV_DIR}/logs" -if [ -f "${COMPOSE_ENV_DIR}/.env" ] -then - rm "${COMPOSE_ENV_DIR}/.env" +# Remove existing .env file +if [ -f "$ENV_FILE_PATH" ]; then + rm "$ENV_FILE_PATH" fi -touch "${COMPOSE_ENV_DIR}/.env" +touch "$ENV_FILE_PATH" # Do not put " around anything and do not add comments in the .env file -if [ "${BUILD_METADATA}" == "TRUE" ] || [ "${BUILD_REPO}" == "TRUE" ] -then +if [ "${BUILD_METADATA}" == "TRUE" ] || [ "${BUILD_REPO}" == "TRUE" ]; then -cat << EOF >> "${COMPOSE_ENV_DIR}/.env" -DATAFED_HTTPS_SERVER_PORT=${local_DATAFED_COMPOSE_HTTPS_SERVER_PORT} -DATAFED_DOMAIN=${local_DATAFED_COMPOSE_DOMAIN} -DATAFED_UID=$(id -u) -DATAFED_CONTAINER_LOG_PATH=${local_DATAFED_COMPOSE_CONTAINER_LOG_PATH} + cat <>"$ENV_FILE_PATH" +DATAFED_HTTPS_SERVER_PORT=${local_DATAFED_HTTPS_SERVER_PORT} +DATAFED_DOMAIN=${local_DATAFED_DOMAIN} +DATAFED_UID=${local_DATAFED_UID} +DATAFED_CONTAINER_LOG_PATH=${local_DATAFED_CONTAINER_LOG_PATH} DATAFED_CORE_LOG_LEVEL=${local_DATAFED_CORE_LOG_LEVEL} EOF fi -if [ "${BUILD_METADATA}" == "TRUE" ] -then -cat << EOF >> "${COMPOSE_ENV_DIR}/.env" -DATAFED_GLOBUS_APP_SECRET=${local_DATAFED_COMPOSE_GLOBUS_APP_SECRET} -DATAFED_GLOBUS_APP_ID=${local_DATAFED_COMPOSE_GLOBUS_APP_ID} -DATAFED_ZEROMQ_SESSION_SECRET=${local_DATAFED_COMPOSE_ZEROMQ_SESSION_SECRET} -DATAFED_ZEROMQ_SYSTEM_SECRET=${local_DATAFED_COMPOSE_ZEROMQ_SYSTEM_SECRET} -DATAFED_WEB_CERT_PATH=/opt/datafed/keys/${local_DATAFED_WEB_CERT_NAME} -DATAFED_WEB_KEY_PATH=/opt/datafed/keys/${local_DATAFED_WEB_KEY_NAME} -DATAFED_DATABASE_PASSWORD=${local_DATAFED_COMPOSE_DATABASE_PASSWORD} -DATAFED_DATABASE_IP_ADDRESS=${local_DATAFED_COMPOSE_DATABASE_IP_ADDRESS} -DATAFED_DATABASE_PORT=${local_DATAFED_COMPOSE_DATABASE_PORT} +if [ "${BUILD_METADATA}" == "TRUE" ]; then + cat <>"$ENV_FILE_PATH" +DATAFED_GLOBUS_APP_SECRET=${local_DATAFED_GLOBUS_APP_SECRET} +DATAFED_GLOBUS_APP_ID=${local_DATAFED_GLOBUS_APP_ID} +DATAFED_ZEROMQ_SESSION_SECRET=${local_DATAFED_ZEROMQ_SESSION_SECRET} +DATAFED_WEB_CERT_PATH=${local_DATAFED_WEB_CERT_PATH} +DATAFED_WEB_KEY_PATH=${local_DATAFED_WEB_KEY_PATH} +DATAFED_ARANGO_CERT_PATH=${local_DATAFED_ARANGO_CERT_PATH} +DATAFED_ARANGO_KEY_PATH=${local_DATAFED_ARANGO_KEY_PATH} +DATAFED_ARANGO_PEM_PATH=${local_DATAFED_ARANGO_PEM_PATH} +DATAFED_DATABASE_PASSWORD=${local_DATAFED_DATABASE_PASSWORD} +DATAFED_DATABASE_IP_ADDRESS=${local_DATAFED_DATABASE_IP_ADDRESS} +DATAFED_DATABASE_PORT=${local_DATAFED_DATABASE_PORT} DATAFED_ENABLE_FOXX_TESTS=${local_DATAFED_ENABLE_FOXX_TESTS} EOF fi -if [ "${BUILD_REPO}" == "TRUE" ] -then -cat << EOF >> "${COMPOSE_ENV_DIR}/.env" -DATAFED_REPO_USER=datafed -DATAFED_GCS_ROOT_NAME=DataFed_Compose -DATAFED_GCS_IP=${local_DATAFED_COMPOSE_GCS_IP} -DATAFED_REPO_ID_AND_DIR=compose-home +if [ "${BUILD_REPO}" == "TRUE" ]; then + cat <>"$ENV_FILE_PATH" +DATAFED_GCS_ROOT_NAME=${local_DATAFED_GCS_ROOT_NAME} +DATAFED_GCS_IP=${local_DATAFED_GCS_IP} +DATAFED_REPO_ID_AND_DIR=${local_DATAFED_REPO_ID_AND_DIR} DATAFED_HOST_COLLECTION_MOUNT=${local_DATAFED_HOST_COLLECTION_MOUNT} -DATAFED_HOST_DEPLOYMENT_KEY_PATH=${local_DATAFED_COMPOSE_HOST_DEPLOYMENT_KEY_PATH} +DATAFED_HOST_DEPLOYMENT_KEY_PATH=${local_DATAFED_HOST_DEPLOYMENT_KEY_PATH} DATAFED_HOST_CRED_FILE_PATH=${local_DATAFED_HOST_CRED_FILE_PATH} DATAFED_GLOBUS_CONTROL_PORT=${local_DATAFED_GLOBUS_CONTROL_PORT} DATAFED_GLOBUS_SUBSCRIPTION=${local_DATAFED_GLOBUS_SUBSCRIPTION} -DATAFED_REPO_DOMAIN=${local_DATAFED_COMPOSE_REPO_DOMAIN} +DATAFED_REPO_DOMAIN=${local_DATAFED_REPO_DOMAIN} DATAFED_GCS_COLLECTION_BASE_PATH=${local_DATAFED_GCS_COLLECTION_BASE_PATH} DATAFED_GCS_COLLECTION_ROOT_PATH=${local_DATAFED_GCS_COLLECTION_ROOT_PATH} EOF fi unset_env_file_name="${COMPOSE_ENV_DIR}/unset_env.sh" -echo "#!/bin/bash" > "${unset_env_file_name}" -echo "# Was auto generated by $SCRIPT" >> "${unset_env_file_name}" +echo "#!/bin/bash" >"${unset_env_file_name}" +echo "# Was auto generated by $SCRIPT" >>"${unset_env_file_name}" while IFS='=' read -r key value; do - # Check if the line contains the '=' sign - if [ -n "$value" ]; then - # Print the content before the '=' sign - echo "unset $key" >> "${unset_env_file_name}" - fi -done < "${COMPOSE_ENV_DIR}/.env" + # Check if the line contains the '=' sign + if [ -n "$value" ]; then + # Print the content before the '=' sign + echo "unset $key" >>"${unset_env_file_name}" + fi +done <"$ENV_FILE_PATH" chmod +x "$unset_env_file_name" + +echo "INFO - Successfully created/updated .env file at: $ENV_FILE_PATH" diff --git a/scripts/compose_generate_globus_files.sh b/scripts/compose_generate_globus_files.sh index 17f2e8f3b..85d8fafd6 100755 --- a/scripts/compose_generate_globus_files.sh +++ b/scripts/compose_generate_globus_files.sh @@ -3,12 +3,11 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/..") -source "${SOURCE}/dependency_versions.sh" +source "${PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_versions.sh" # This script should be run after generating the .env file as it will pull # values from the .env file -Help() -{ +Help() { echo "$(basename $0) generate globus files. Note the .env file must exist." echo " in the specified directory." echo @@ -25,50 +24,46 @@ DIRECTORY="" eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -d | --directory) - DIRECTORY="$2" - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -d | --directory) + DIRECTORY="$2" + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done -if [ ! -d "${DIRECTORY}" ] -then +if [ ! -d "${DIRECTORY}" ]; then echo "The provided directory does not seem to exist: ${DIRECTORY}" fi -if [ ! -f "${DIRECTORY}/.env" ] -then +if [ ! -f "${DIRECTORY}/.env" ]; then echo "Missing . ${DIRECTORY}/.env file. This file needs to be" echo "created first" exit 1 fi - - # This script should be run after generating the .env file as it will pull # values from the .env file -if [ ! -f "${DIRECTORY}/.env" ] -then +if [ ! -f "${DIRECTORY}/.env" ]; then echo "Missing . ${DIRECTORY}/.env file. This file needs to be" echo "created first" exit 1 fi local_DATAFED_GLOBUS_KEY_DIR="${DIRECTORY}/globus" -if [ ! -d "$local_DATAFED_GLOBUS_KEY_DIR" ] -then +if [ ! -d "$local_DATAFED_GLOBUS_KEY_DIR" ]; then mkdir -p "$local_DATAFED_GLOBUS_KEY_DIR" fi @@ -87,8 +82,8 @@ sed -i 's/=\([^"]*\)/="\1"/' "${DIRECTORY}/.env_shell" rm "${DIRECTORY}/.env_shell" DATAFED_GLOBUS_DEPLOYMENT_KEY_PATH="$DATAFED_HOST_DEPLOYMENT_KEY_PATH" \ -DATAFED_GLOBUS_CRED_FILE_PATH="$DATAFED_HOST_CRED_FILE_PATH" \ -DATAFED_GLOBUS_CONTROL_PORT="$DATAFED_GLOBUS_CONTROL_PORT" \ -DATAFED_GLOBUS_SUBSCRIPTION="$DATAFED_GLOBUS_SUBSCRIPTION" \ -DATAFED_GCS_ROOT_NAME="$DATAFED_GCS_ROOT_NAME" \ - "python${DATAFED_PYTHON_VERSION}" "${PROJECT_ROOT}/scripts/globus/initialize_globus_endpoint.py" + DATAFED_GLOBUS_CRED_FILE_PATH="$DATAFED_HOST_CRED_FILE_PATH" \ + DATAFED_GLOBUS_CONTROL_PORT="$DATAFED_GLOBUS_CONTROL_PORT" \ + DATAFED_GLOBUS_SUBSCRIPTION="$DATAFED_GLOBUS_SUBSCRIPTION" \ + DATAFED_GCS_ROOT_NAME="$DATAFED_GCS_ROOT_NAME" \ + "python${DATAFED_PYTHON_VERSION}" "${PROJECT_ROOT}/scripts/globus/initialize_globus_endpoint.py" diff --git a/scripts/container_run_test.sh b/scripts/container_run_test.sh index 576b6fae8..92f4ddf36 100755 --- a/scripts/container_run_test.sh +++ b/scripts/container_run_test.sh @@ -10,8 +10,7 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) -Help() -{ +Help() { echo "$(basename $0) Will stop containers." echo echo "Syntax: $(basename $0) [-h|n|c|e|t]" @@ -26,8 +25,8 @@ Help() echo "-c, --count Expected number of containers that should be running" echo " only really makes sense when testing on the image tag." echo "-e, --error-throw Throw a non 0 exit code if specified container(s) are not running." - echo "-t, --tag Check if containers are running with the particular image tag." -} + echo "-t, --tag Check if containers are running with the particular image tag." +} # Defaults local_CONTAINER_COUNT="1" @@ -37,57 +36,55 @@ local_TAG_FLAG_DETECTED="0" VALID_ARGS=$(getopt -o hn:c:et: --long 'help',name:,count:,error-throw,tag: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -n | --name) - local_CONTAINER_NAME=$2 - local_NAME_FLAG_DETECTED="1" - shift 2 - ;; - -c | --count) - local_CONTAINER_COUNT=$2 - shift 2 - ;; - -e | --error-throw) - local_ERROR_THROW="1" - shift - ;; - -t | --tag) - local_CONTAINER_TAG=$2 - local_TAG_FLAG_DETECTED="1" - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -n | --name) + local_CONTAINER_NAME=$2 + local_NAME_FLAG_DETECTED="1" + shift 2 + ;; + -c | --count) + local_CONTAINER_COUNT=$2 + shift 2 + ;; + -e | --error-throw) + local_ERROR_THROW="1" + shift + ;; + -t | --tag) + local_CONTAINER_TAG=$2 + local_TAG_FLAG_DETECTED="1" + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done -if [ "$local_TAG_FLAG_DETECTED" == "1" ] && [ "$local_NAME_FLAG_DETECTED" == "1" ] -then +if [ "$local_TAG_FLAG_DETECTED" == "1" ] && [ "$local_NAME_FLAG_DETECTED" == "1" ]; then echo "ERROR can only specify -t or -n cannot specify both" exit 1 fi -if [ "$local_TAG_FLAG_DETECTED" == "0" ] && [ "$local_NAME_FLAG_DETECTED" == "0" ] -then +if [ "$local_TAG_FLAG_DETECTED" == "0" ] && [ "$local_NAME_FLAG_DETECTED" == "0" ]; then echo "ERROR must specify an image tag with '-t' or a name '-n' cannot run without" exit 1 fi - -if [ "$local_TAG_FLAG_DETECTED" == "1" ] -then +if [ "$local_TAG_FLAG_DETECTED" == "1" ]; then # Get all container ids with that tag and convert to bash array CONTAINER_IDS=($(docker container ls --format "{{.ID}}")) CONTAINER_IMAGES=($(docker container ls --format "{{.Image}}")) @@ -95,27 +92,23 @@ then CONTAINER_STATES=($(docker container ls --format "{{ .State }}")) local_count=0 - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do IMAGE="${CONTAINER_IMAGES[$i]}" - if [ "$IMAGE" == "$local_CONTAINER_TAG" ] - then - if [ "${CONTAINER_STATES[$i]}" == "running" ] - then - local_count=$(( $local_count + 1 )) + if [ "$IMAGE" == "$local_CONTAINER_TAG" ]; then + if [ "${CONTAINER_STATES[$i]}" == "running" ]; then + local_count=$(($local_count + 1)) fi fi done - if [ ! "$local_count" == "$local_CONTAINER_COUNT" ] - then + if [ ! "$local_count" == "$local_CONTAINER_COUNT" ]; then echo "ERROR expected $local_CONTAINER_COUNT containers to be running with container image_tag:$local_CONTAINER_TAG but $local_count found instead." echo - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do echo "${CONTAINER_IDS[$i]} ${CONTAINER_IMAGES[$i]} ${CONTAINER_NAMES[$i]} ${CONTAINER_STATES[$i]}" done - if [ "$local_ERROR_THROW" == "1" ] - then + if [ "$local_ERROR_THROW" == "1" ]; then exit 1 else exit 0 @@ -124,8 +117,7 @@ then echo "Success: $local_CONTAINER_COUNT instances of container image_tag:$local_CONTAINER_TAG found running" -elif [ "$local_NAME_FLAG_DETECTED" == "1" ] -then +elif [ "$local_NAME_FLAG_DETECTED" == "1" ]; then # Get all container ids with that tag and convert to bash array CONTAINER_IDS=($(docker container ls --format "{{.ID}}")) @@ -134,27 +126,23 @@ then CONTAINER_STATES=($(docker container ls --format "{{ .State }}")) local_count=0 - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do NAME="${CONTAINER_NAMES[$i]}" - if [ "$NAME" == "$local_CONTAINER_NAME" ] - then - if [ "${CONTAINER_STATES[$i]}" == "running" ] - then - local_count=$(( $local_count + 1 )) + if [ "$NAME" == "$local_CONTAINER_NAME" ]; then + if [ "${CONTAINER_STATES[$i]}" == "running" ]; then + local_count=$(($local_count + 1)) fi fi done - if [ ! "$local_count" == "$local_CONTAINER_COUNT" ] - then + if [ ! "$local_count" == "$local_CONTAINER_COUNT" ]; then echo "ERROR expected $local_CONTAINER_COUNT containers to be running with container name:$local_CONTAINER_NAME but $local_count found instead." echo - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do echo "${CONTAINER_IDS[$i]} ${CONTAINER_IMAGES[$i]} ${CONTAINER_NAMES[$i]} ${CONTAINER_STATES[$i]}" done - if [ "$local_ERROR_THROW" == "1" ] - then + if [ "$local_ERROR_THROW" == "1" ]; then exit 1 else exit 0 @@ -163,4 +151,3 @@ then echo "Success: $local_CONTAINER_COUNT instances of container name:$local_CONTAINER_NAME found running" fi - diff --git a/scripts/container_stop.sh b/scripts/container_stop.sh index 308485af2..6f4660657 100755 --- a/scripts/container_stop.sh +++ b/scripts/container_stop.sh @@ -7,8 +7,7 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) -Help() -{ +Help() { echo "$(basename $0) Will stop containers." echo echo "Syntax: $(basename $0) [-h|n|t|p]" @@ -22,7 +21,7 @@ Help() echo "-t, --tag Remove all containers with this particular image" echo "-p, --prefix Only require the prefix to match and not" echo " an exact match" -} +} local_NAME_FLAG_DETECTED="0" local_TAG_FLAG_DETECTED="0" @@ -32,40 +31,41 @@ SLEEP_TIME=30 VALID_ARGS=$(getopt -o hn:t:p --long 'help',name:,tag:,prefix -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -n | --name) - local_CONTAINER_NAME=$2 - local_NAME_FLAG_DETECTED="1" - shift 2 - ;; - -t | --tag) - local_CONTAINER_TAG=$2 - local_TAG_FLAG_DETECTED="1" - shift 2 - ;; - -p | --prefix) - local_EXACT_MATCH="FALSE" - shift 1 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -n | --name) + local_CONTAINER_NAME=$2 + local_NAME_FLAG_DETECTED="1" + shift 2 + ;; + -t | --tag) + local_CONTAINER_TAG=$2 + local_TAG_FLAG_DETECTED="1" + shift 2 + ;; + -p | --prefix) + local_EXACT_MATCH="FALSE" + shift 1 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done -if [ "$local_TAG_FLAG_DETECTED" == "1" ] && [ "$local_NAME_FLAG_DETECTED" == "1" ] -then +if [ "$local_TAG_FLAG_DETECTED" == "1" ] && [ "$local_NAME_FLAG_DETECTED" == "1" ]; then echo "ERROR can only specify -t or -n cannot specify both" exit 1 fi @@ -75,42 +75,34 @@ CONTAINER_IDS=($(docker container ls --format "{{.ID}}")) CONTAINER_IMAGES=($(docker container ls --format "{{.Image}}")) CONTAINER_NAMES=($(docker container ls --format "{{.Names}}")) -if [ "$local_TAG_FLAG_DETECTED" == "1" ] -then +if [ "$local_TAG_FLAG_DETECTED" == "1" ]; then - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do IMAGE="${CONTAINER_IMAGES[$i]}" - if [ "${local_EXACT_MATCH}" == "TRUE" ] - then - if [ "$IMAGE" == "$local_CONTAINER_TAG" ] - then + if [ "${local_EXACT_MATCH}" == "TRUE" ]; then + if [ "$IMAGE" == "$local_CONTAINER_TAG" ]; then echo "Stopping ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} $IMAGE" docker container stop --time "$SLEEP_TIME" "${CONTAINER_IDS[$i]}" fi else - if [[ "$IMAGE" == "$local_CONTAINER_TAG"* ]] - then + if [[ "$IMAGE" == "$local_CONTAINER_TAG"* ]]; then echo "Stopping ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} $IMAGE" docker container stop --time "$SLEEP_TIME" "${CONTAINER_IDS[$i]}" fi fi done -elif [ "$local_NAME_FLAG_DETECTED" == "1" ] -then +elif [ "$local_NAME_FLAG_DETECTED" == "1" ]; then - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do NAME="${CONTAINER_NAMES[$i]}" - if [ "${local_EXACT_MATCH}" == "TRUE" ] - then - if [ "$NAME" == "$local_CONTAINER_NAME" ] - then + if [ "${local_EXACT_MATCH}" == "TRUE" ]; then + if [ "$NAME" == "$local_CONTAINER_NAME" ]; then echo "Stopping ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} ${CONTAINER_IMAGES[$i]}" docker container stop --time "$SLEEP_TIME" "${CONTAINER_IDS[$i]}" fi else - if [[ "$NAME" == "$local_CONTAINER_NAME"* ]] - then + if [[ "$NAME" == "$local_CONTAINER_NAME"* ]]; then echo "Stopping ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} ${CONTAINER_IMAGES[$i]}" docker container stop --time "$SLEEP_TIME" "${CONTAINER_IDS[$i]}" fi @@ -119,15 +111,14 @@ then else - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do echo "Stopping ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} ${CONTAINER_IMAGES[$i]}" docker container stop --time "$SLEEP_TIME" "${CONTAINER_IDS[$i]}" done fi -if [ ! "${#CONTAINER_IDS[@]}" == "0" ] -then +if [ ! "${#CONTAINER_IDS[@]}" == "0" ]; then sleep "$SLEEP_TIME" fi @@ -136,42 +127,34 @@ CONTAINER_IDS=($(docker container ls --format "{{.ID}}")) CONTAINER_IMAGES=($(docker container ls --format "{{.Image}}")) CONTAINER_NAMES=($(docker container ls --format "{{.Names}}")) -if [ "$local_TAG_FLAG_DETECTED" == "1" ] -then +if [ "$local_TAG_FLAG_DETECTED" == "1" ]; then - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do IMAGE="${CONTAINER_IMAGES[$i]}" - if [ "${local_EXACT_MATCH}" == "TRUE" ] - then - if [ "$IMAGE" == "$local_CONTAINER_TAG" ] - then + if [ "${local_EXACT_MATCH}" == "TRUE" ]; then + if [ "$IMAGE" == "$local_CONTAINER_TAG" ]; then echo "ERROR still running ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} $IMAGE" exit 1 fi else - if [[ "$IMAGE" == "$local_CONTAINER_TAG"* ]] - then + if [[ "$IMAGE" == "$local_CONTAINER_TAG"* ]]; then echo "ERROR still running ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} $IMAGE" exit 1 fi fi done -elif [ "$local_NAME_FLAG_DETECTED" == "1" ] -then +elif [ "$local_NAME_FLAG_DETECTED" == "1" ]; then - for (( i=0; i<${#CONTAINER_IDS[@]}; i++)); do + for ((i = 0; i < ${#CONTAINER_IDS[@]}; i++)); do NAME="${CONTAINER_NAMES[$i]}" - if [ "${local_EXACT_MATCH}" == "TRUE" ] - then - if [ "$NAME" == "$local_CONTAINER_NAME" ] - then + if [ "${local_EXACT_MATCH}" == "TRUE" ]; then + if [ "$NAME" == "$local_CONTAINER_NAME" ]; then echo "ERROR still running ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} ${CONTAINER_IMAGES[$i]}" exit 1 fi else - if [[ "$NAME" == "$local_CONTAINER_NAME"* ]] - then + if [[ "$NAME" == "$local_CONTAINER_NAME"* ]]; then echo "ERROR still running ${CONTAINER_IDS[$i]} ${CONTAINER_NAMES[$i]} ${CONTAINER_IMAGES[$i]}" exit 1 fi @@ -180,8 +163,7 @@ then else - if [ ! "${#CONTAINER_IDS[@]}" == "0" ] - then + if [ ! "${#CONTAINER_IDS[@]}" == "0" ]; then docker container ls exit 1 fi diff --git a/scripts/copy_dependency.sh b/scripts/copy_dependency.sh deleted file mode 100755 index d4ce4aa67..000000000 --- a/scripts/copy_dependency.sh +++ /dev/null @@ -1,114 +0,0 @@ -#!/bin/bash -# This script is used to rename the dependency libraries that DataFed uses to make them easier to copy between containers by reading the dependency_versions.sh script and renaming them accordingly. -# credit to chatgpt for this script - -source "$BUILD_DIR/scripts/dependency_versions.sh" - -# Define the list of supported libraries and their environment variable names -supported_libraries=("protobuf" \ - "protoc" \ - "libsodium" \ - "libzmq" \ - "boost_program_options" \ - "boost_filesystem") - -library_env_variables=("DATAFED_DYNAMIC_LIBRARY_PROTOBUF_VERSION" \ - "DATAFED_DYNAMIC_LIBRARY_PROTOBUF_VERSION" \ - "DATAFED_LIB_LIBSODIUM_VERSION" \ - "DATAFED_LIB_LIBZMQ_VERSION" \ - "DATAFED_BOOST" \ - "DATAFED_BOOST") - -library_names=("libprotobuf.a" \ - "libprotoc.a" \ - "libsodium.a" \ - "libzmq.a" \ - "libboost_program_options.so" \ - "libboost_filesystem.so") - -library_locations=("$LIB_DIR" "$LIB_DIR" "$LIB_DIR" "$LIB_DIR" "/lib/x86_64-linux-gnu" "/lib/x86_64-linux-gnu") - -LIBRARIES_BASE_PATH="/libraries" - -# Function to print the list of supported libraries -print_supported_libraries() { - echo "Supported libraries:" - for library in "${supported_libraries[@]}"; do - echo " $library" - done -} - -# Check the number of arguments -if [ "$#" -ne 2 ]; then - echo "Usage: $0 library_name (to/from)" - print_supported_libraries - exit 1 -fi - -library_name="$1" -direction="$2" - -# Check if the provided library name is in the list of supported libraries -if [[ ! " ${supported_libraries[@]} " =~ " ${library_name} " ]]; then - echo "Unsupported library: $library_name" - exit 1 -fi - -# Find the index of the library name in the array -index=0 -for ((i = 0; i < ${#supported_libraries[@]}; i++)); do - if [ "${supported_libraries[i]}" == "$library_name" ]; then - index=$i - break - fi -done - -# Get the library version from the corresponding environment variable -library_version="${!library_env_variables[index]}" -library_name="${library_names[index]}" -library_location="${library_locations[index]}" - -# Define source and destination filenames -source_filename="" -destination_filename="" - -if [ "$direction" == "from" ]; then - # Copy from versioned to generic filename - source_filename="$library_location/$library_name" - destination_filename="$LIBRARIES_BASE_PATH/$library_name" - if [[ "$library_name" == *".so" ]]; then - source_filename="$source_filename.$library_version" - fi -elif [ "$direction" == "to" ]; then - # Copy from generic to versioned filename - source_filename="$LIBRARIES_BASE_PATH/$library_name" - destination_filename="$LIB_DIR/$library_name" - if [[ "$library_name" == *".so" ]]; then - destination_filename="$destination_filename.$library_version" - fi -else - echo "Invalid direction. Use 'to' or 'from'." - exit 1 -fi - -# Check if the source file exists -if [ ! -e "$source_filename" ]; then - echo "Source file '$source_filename' not found." - exit 1 -fi - -# Copy the file -cp "$source_filename" "$destination_filename" -if [ $? -eq 0 ]; then - echo "Successfully copied '$source_filename' to '$destination_filename'." -else - echo "Failed to copy '$source_filename' to '$destination_filename'." -fi - -if [ "$direction" == "to" ]; then - major_version=$(echo "$library_version" | awk -F'.' '{ print $1 }') - ln -s "$LIB_DIR/$library_name.$library_version" "$LIB_DIR/$library_name.$major_version" - ln -s "$LIB_DIR/$library_name.$library_version" "$LIB_DIR/$library_name" - echo "linking $LIB_DIR/$library_name.$major_version -> $LIB_DIR/$library_name.$library_version" - echo "linking $LIB_DIR/$library_name -> $LIB_DIR/$library_name.$library_version" -fi diff --git a/scripts/dependency_install_functions.sh b/scripts/dependency_install_functions.sh deleted file mode 100644 index 1c00b9637..000000000 --- a/scripts/dependency_install_functions.sh +++ /dev/null @@ -1,689 +0,0 @@ -#!/bin/bash -SCRIPT=$(realpath "$BASH_SOURCE[0]") -SOURCE=$(dirname "$SCRIPT") -source "${SOURCE}/dependency_versions.sh" -PROJECT_ROOT=$(realpath "${SOURCE}/..") -source "${SOURCE}/utils.sh" - -sudo_command -# these are the dependencies to be installed by apt -export apt_file_path="${PROJECT_ROOT}/tmp/apt_deps" -export pip_file_path="${PROJECT_ROOT}/tmp/pip_deps" -# these are the dependencies to be installed and built via cmake -export ext_file_path="${PROJECT_ROOT}/tmp/ext_deps" - -if [ ! -d "${PROJECT_ROOT}/tmp" ]; then - mkdir -p "${PROJECT_ROOT}/tmp" -fi - -if [ ! -e "${PROJECT_ROOT}/config/datafed.sh" ] -then - echo "Please run generate_datafed.sh before installing dependencies" - exit 1 -fi - -source "${PROJECT_ROOT}/config/datafed.sh" - -if [ ! -e "$DATAFED_DEPENDENCIES_INSTALL_PATH" ] || [ ! -d "$DATAFED_DEPENDENCIES_INSTALL_PATH" ]; then - parent_dir=$(dirname "${DATAFED_DEPENDENCIES_INSTALL_PATH}") - if [ -w "${parent_dir}" ]; then - mkdir -p "$DATAFED_DEPENDENCIES_INSTALL_PATH" - else - echo "Sudo command $SUDO_CMD" - "$SUDO_CMD" mkdir -p "$DATAFED_DEPENDENCIES_INSTALL_PATH" - user=$(whoami) - "$SUDO_CMD" chown "$user" "$DATAFED_DEPENDENCIES_INSTALL_PATH" - fi -fi - -# NOTE - LD_LIBRARY_PATH must not be a variable for this to work. You cannot -# replace ! -v LD_LIBRARY_PATH with ! -v ${LD_LIBRARY_PATH} because this is -# checking if the variable even exists. -if [[ ! -v LD_LIBRARY_PATH ]]; then - LD_LIBRARY_PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH/lib" -else - if [[ -n "$LD_LIBRARY_PATH" ]]; then - LD_LIBRARY_PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH/lib:$LD_LIBRARY_PATH" - else - LD_LIBRARY_PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH/lib" - fi -fi - -# WARNING: overwriting PATH can be very dangerous -# In Docker builds this must follow the pattern: -# PATH=":$PATH" -# Curly braces around PATH, like ${PATH} may pull from the host's PATH -# Please see StackOverflow answer: https://stackoverflow.com/a/38742545 -if [[ ! -v PATH ]]; then - PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH/bin" -else - if [[ -n "$PATH" ]]; then - PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH/bin:$PATH" - else - PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH/bin" - fi -fi - -# Function to clean up multiple installation flag files with a given prefix -clean_install_flags() { - local install_path="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - local prefix="$1" # The first argument is now the prefix - - # Validate that a prefix was provided - if [ -z "$prefix" ]; then - echo "Error: No prefix provided for clean_install_flags." >&2 - return 1 # Indicate an error - fi - - # Count files matching the pattern - local count=$(find "${install_path}" -maxdepth 1 -type f -name "${prefix}*" 2>/dev/null | wc -l) - - if [ "${count}" -gt 1 ]; then - echo "Warning: Found ${count} installation flag files with prefix '${prefix}'. Cleaning up..." - # Remove all files matching the pattern - find "${install_path}" -maxdepth 1 -type f -name "${prefix}*" -delete - echo "Removed all existing installation flag files with prefix '${prefix}'." - fi -} - -install_python() { - - local PYTHON_FLAG_PREFIX=".python_installed-" - clean_install_flags "$PYTHON_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${PYTHON_FLAG_PREFIX}${DATAFED_PYTHON_VERSION}" ]; then - # Check if the deadsnakes repository has already been added to avoid issues with gpg - if ! grep -qr '^deb .\+deadsnakes' /etc/apt/sources.list.d/; then - "$SUDO_CMD" apt update - "$SUDO_CMD" apt install -y software-properties-common - "$SUDO_CMD" add-apt-repository -y ppa:deadsnakes/ppa - "$SUDO_CMD" apt update - fi - - "$SUDO_CMD" apt install -y "python${DATAFED_PYTHON_VERSION}" "python${DATAFED_PYTHON_VERSION}-dev" "python${DATAFED_PYTHON_VERSION}-venv" "python${DATAFED_PYTHON_VERSION}-distutils" - - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${PYTHON_FLAG_PREFIX}${DATAFED_PYTHON_VERSION}" - fi -} - -init_python() { - - if [[ ! -v DATAFED_PYTHON_DEPENDENCIES_DIR ]]; then - echo "DATAFED_PYTHON_DEPENDENCIES_DIR is not defined please make sure it is defined in the ${PROJECT_ROOT}/config/datafed.sh file." - exit 1 - else - if [[ -z "$DATAFED_PYTHON_DEPENDENCIES_DIR" ]]; then - echo "DATAFED_PYTHON_DEPENDENCIES_DIR is defined but is empty please make sure it is defined in ${PROJECT_ROOT}/config/datafed.sh file." - exit 1 - fi - fi - - if [ ! -e "$DATAFED_DEPENDENCIES_INSTALL_PATH" ] || [ ! -d "$DATAFED_PYTHON_DEPENDENCIES_DIR" ]; then - mkdir -p "$DATAFED_PYTHON_DEPENDENCIES_DIR" - fi - "python${DATAFED_PYTHON_VERSION}" -m venv "${DATAFED_PYTHON_ENV}" - # Make sure that pip is installed and upgraded - "python${DATAFED_PYTHON_VERSION}" -m ensurepip --upgrade -} - -install_cmake() { - - local CMAKE_FLAG_PREFIX=".cmake_installed-" - clean_install_flags "$CMAKE_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${CMAKE_FLAG_PREFIX}${DATAFED_CMAKE_VERSION}" ]; then - # Version 3.20 of cmake and onwards starting using all lower case in the package names, previos versions use a - # a capital L in the name. - wget https://github.com/Kitware/CMake/releases/download/v${DATAFED_CMAKE_VERSION}/cmake-${DATAFED_CMAKE_VERSION}-linux-x86_64.tar.gz - tar -xzvf "cmake-${DATAFED_CMAKE_VERSION}-linux-x86_64.tar.gz" >/dev/null 2>&1 - cp -r "cmake-${DATAFED_CMAKE_VERSION}-linux-x86_64/bin" "${DATAFED_DEPENDENCIES_INSTALL_PATH}" - cp -r "cmake-${DATAFED_CMAKE_VERSION}-linux-x86_64/share" "${DATAFED_DEPENDENCIES_INSTALL_PATH}" - - # Cleanup - rm -rf "cmake-${DATAFED_CMAKE_VERSION}-linux-x86_64" - rm -rf "cmake-${DATAFED_CMAKE_VERSION}-linux-x86_64.tar.gz" - - # Mark cmake as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${CMAKE_FLAG_PREFIX}${DATAFED_CMAKE_VERSION}" - fi - # WARNING: overwriting PATH can be very dangerous - # In Docker builds this must follow the pattern: - # PATH=":$PATH" - # Curly braces around PATH, like ${PATH} may pull from the host's PATH - # Please see StackOverflow answer: https://stackoverflow.com/a/38742545 - export PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin:$PATH" -} - -install_protobuf() { - local PROTOBUF_FLAG_PREFIX=".protobuf_installed-" - clean_install_flags "$PROTOBUF_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${PROTOBUF_FLAG_PREFIX}${DATAFED_PROTOBUF_VERSION}" ]; then - local original_dir=$(pwd) - cd "${PROJECT_ROOT}" - if [ -d "${PROJECT_ROOT}/external/protobuf" ] - then - # sudo required because of egg file - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/protobuf" - fi - # Here we are using clone instead of submodule update, because submodule - # requires the .git folder exist and the current folder be considered a repo - # this creates problems in docker because each time a commit is made the - # .git folder contents are changed causing a fresh rebuild of all containers - git clone "https://github.com/protocolbuffers/protobuf.git" \ - "${PROJECT_ROOT}/external/protobuf" - - cd "${PROJECT_ROOT}/external/protobuf" - git checkout "v${DATAFED_PROTOBUF_VERSION}" - git submodule update --init --recursive - # Build static library, cannot build shared library at same time apparently - # there cannot be a shared libsodium file in the - # DATAFED_DEPENDENCIES_INSTALL_PREFIX if you want to have everything static - # libzmq picks up any shared file regardless of whether you have told it to - # only use static libraries or not. - # NOTE - static libraries must be built first - cmake -S . -B build \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DBUILD_SHARED_LIBS=OFF \ - -Dprotobuf_BUILD_TESTS=OFF \ - -DABSL_PROPAGATE_CXX_STD=ON \ - -DCMAKE_INSTALL_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - cmake --build build -j 8 - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - cmake --build build --target install - else - "$SUDO_CMD" cmake --build build --target install - fi - # Build Shared library - # Don't build shared, it messes up the static library linking because the - # cmake file installed are not compatible - # WARNING - static library will break if build with shared options on - - cd python - init_python - source "${DATAFED_PYTHON_ENV}/bin/activate" - LD_LIBRARY_PATH="$LD_LIBRARY_PATH" PATH="$PATH" python${DATAFED_PYTHON_VERSION} -m pip install numpy tzdata - LD_LIBRARY_PATH="$LD_LIBRARY_PATH" PATH="$PATH" python${DATAFED_PYTHON_VERSION} setup.py build - LD_LIBRARY_PATH="$LD_LIBRARY_PATH" PATH="$PATH" python${DATAFED_PYTHON_VERSION} setup.py test - # Because we have activaited a venv we don't want to use the --user flag - # with the install command - LD_LIBRARY_PATH="$LD_LIBRARY_PATH" PATH="$PATH" "python${DATAFED_PYTHON_VERSION}" setup.py install - cd ../ - # Cleanup build file with root ownership - if [ -f build/install_manifest.txt ] - then - "$SUDO_CMD" rm build/install_manifest.txt - fi - cd "${PROJECT_ROOT}" - - # Mark protobuf as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${PROTOBUF_FLAG_PREFIX}${DATAFED_PROTOBUF_VERSION}" - cd "$original_dir" - fi -} - -install_libsodium() { - local LIBSODIUM_FLAG_PREFIX=".libsodium_installed-" - clean_install_flags "$LIBSODIUM_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${LIBSODIUM_FLAG_PREFIX}${DATAFED_LIBSODIUM_VERSION}" ]; then - local original_dir=$(pwd) - if [ -d "${PROJECT_ROOT}/external/libsodium" ] - then - # sudo required because of egg file - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/libsodium" - fi - # Official documentation for libsodium indicates this is the preferred way to build libsodium. - # Using the git repo directly results in build instability because of additional network calls when running - # autogen.sh. - wget "https://download.libsodium.org/libsodium/releases/libsodium-${DATAFED_LIBSODIUM_VERSION}.tar.gz" -P "${PROJECT_ROOT}/external" - tar -xvzf "${PROJECT_ROOT}/external/libsodium-${DATAFED_LIBSODIUM_VERSION}.tar.gz" -C "${PROJECT_ROOT}/external/" - cd "${PROJECT_ROOT}/external/libsodium-${DATAFED_LIBSODIUM_VERSION}" - # Build static ONLY!!!! - # Note if zmq detects a shared sodium library it will grab it no matter what - # --enable-shared=no must be set here - SODIUM_STATIC=1 ./configure --enable-static=yes --enable-shared=no --with-pic=yes --prefix="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - make -j 8 - make check - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - make install - else - "$SUDO_CMD" make install - fi - - # Mark libsodium as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${LIBSODIUM_FLAG_PREFIX}${DATAFED_LIBSODIUM_VERSION}" - cd "$original_dir" - fi -} - -install_libzmq() { - local LIBZMQ_FLAG_PREFIX=".libzmq_installed-" - clean_install_flags "$LIBZMQ_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${LIBZMQ_FLAG_PREFIX}${DATAFED_LIBZMQ_VERSION}" ]; then - local original_dir=$(pwd) - if [ -d "${PROJECT_ROOT}/external/libzmq" ] - then - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/libzmq" - fi - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.libsodium_installed-${DATAFED_LIBSODIUM_VERSION}" ]; then - echo "You must first install libsodium before installing libzmq" - exit 1 - fi - # Here we are using clone instead of submodule update, because submodule - # requires the .git folder exist and the current folder be considered a repo - # this creates problems in docker because each time a commit is made the - # .git folder contents are changed causing a fresh rebuild of all containers - git clone https://github.com/zeromq/libzmq.git "${PROJECT_ROOT}/external/libzmq" - cd "${PROJECT_ROOT}/external/libzmq" - git checkout "v${DATAFED_LIBZMQ_VERSION}" - # Build static only - cmake -S. -B build \ - -DBUILD_STATIC=ON \ - -DBUILD_SHARED_LIBS=OFF \ - -DBUILD_SHARED=OFF \ - -DWITH_LIBSODIUM_STATIC=ON \ - -DBUILD_TESTS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_PREFIX_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib" \ - -DCMAKE_INSTALL_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - cmake --build build -j 8 - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - cmake --build build --target install - else - "$SUDO_CMD" cmake --build build --target install - fi - - if [ -d "${PROJECT_ROOT}/external/cppzmq" ] - then - # sudo required because of egg file - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/cppzmq" - fi - git clone https://github.com/zeromq/cppzmq.git "${PROJECT_ROOT}/external/cppzmq" - cd "${PROJECT_ROOT}/external/cppzmq" - git checkout v"${DATAFED_LIB_ZMQCPP_VERSION}" - # Will will not build the unit tests because there are not enough controls - # to link to the correct static library. - # NOTE - static libraries must be built first - cmake -S. -B build \ - -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCPPZMQ_BUILD_TESTS=OFF \ - -DCMAKE_INSTALL_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - cmake --build build -j 8 - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - cmake --build build --target install - else - "$SUDO_CMD" cmake --build build --target install - fi - - cd "$original_dir" - # Mark libzmq as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${LIBZMQ_FLAG_PREFIX}${DATAFED_LIBZMQ_VERSION}" - fi -} - -install_nlohmann_json() { - local NLOHMANN_FLAG_PREFIX=".nlohmann_json_installed-" - clean_install_flags "$NLOHMANN_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${NLOHMANN_FLAG_PREFIX}${DATAFED_NLOHMANN_JSON_VERSION}" ]; then - local original_dir=$(pwd) - if [ -d "${PROJECT_ROOT}/external/json" ] - then - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/json" - fi - git clone https://github.com/nlohmann/json.git "${PROJECT_ROOT}/external/json" - cd "${PROJECT_ROOT}/external/json" - git checkout v${DATAFED_NLOHMANN_JSON_VERSION} - echo "FILE STRUCTURE $(ls)" - # Build static - cmake -S . -B build \ - -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_INSTALL_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - cmake --build build -j 8 - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - cmake --build build --target install - else - "$SUDO_CMD" cmake --build build --target install - fi - # Build shared - cmake -S . -B build \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_INSTALL_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - cmake --build build -j 8 - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - cmake --build build --target install - else - "$SUDO_CMD" cmake --build build --target install - fi - - # Mark nlohmann_json as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${NLOHMANN_FLAG_PREFIX}${DATAFED_NLOHMANN_JSON_VERSION}" - cd "$original_dir" - fi -} - -install_json_schema_validator() { - local NLOHMANN_SCHEMA_FLAG_PREFIX=".nlohmann_schema_validator_installed-" - clean_install_flags "$NLOHMANN_SCHEMA_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${NLOHMANN_SCHEMA_FLAG_PREFIX}${DATAFED_JSON_SCHEMA_VALIDATOR_VERSION}" ]; then - local original_dir=$(pwd) - if [ -d "${PROJECT_ROOT}/external/json-schema-validator" ] - then - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/json-schema-validator" - fi - git clone https://github.com/pboettch/json-schema-validator "${PROJECT_ROOT}/external/json-schema-validator" - cd "${PROJECT_ROOT}/external/json-schema-validator" - git checkout ${DATAFED_JSON_SCHEMA_VALIDATOR_VERSION} - # Build static - cmake -S . -B build \ - -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ - -DCMAKE_INSTALL_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - cmake --build build -j 8 - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - cmake --build build --target install - else - "$SUDO_CMD" cmake --build build --target install - fi - # WARNING building shared library will overwrite cmake file for static - # library, does not appear to support both targets at the same time, similar - # to protobuf - # Mark json-schema-validator as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${NLOHMANN_SCHEMA_FLAG_PREFIX}${DATAFED_JSON_SCHEMA_VALIDATOR_VERSION}" - cd "$original_dir" - fi -} - -install_gcs() { - local GCS_FLAG_PREFIX=".gcs_installed-" - clean_install_flags "$GCS_FLAG_PREFIX" - if [ ! -e "${GCS_FLAG_PREFIX}${DATAFED_GLOBUS_VERSION}" ]; then - "$SUDO_CMD" apt update - "$SUDO_CMD" apt install -y curl git gnupg - curl -LOs \ - "https://downloads.globus.org/globus-connect-server/stable/installers/repo/deb/globus-repo_${DATAFED_GLOBUS_VERSION}_all.deb" - "$SUDO_CMD" dpkg -i "globus-repo_${DATAFED_GLOBUS_VERSION}_all.deb" - "$SUDO_CMD" apt-key add /usr/share/globus-repo/RPM-GPG-KEY-Globus - # Need a second update command after adding the globus GPG key - "$SUDO_CMD" apt update - "$SUDO_CMD" apt-get install globus-connect-server54 -y - - # Mark gcs as installed - touch "${GCS_FLAG_PREFIX}${DATAFED_GLOBUS_VERSION}" - fi -} - -install_nvm() { - local NVM_FLAG_PREFIX=".nvm_installed-" - clean_install_flags "$NVM_FLAG_PREFIX" - # By default this will place NVM in $HOME/.nvm - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${NVM_FLAG_PREFIX}${DATAFED_NVM_VERSION}" ]; then - # By setting NVM_DIR beforehand when the scirpt is run it - # will use it to set the install path - export NVM_DIR="${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm" - mkdir -p "${NVM_DIR}" - curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/${DATAFED_NVM_VERSION}/install.sh" | bash - # Mark nvm as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${NVM_FLAG_PREFIX}${DATAFED_NVM_VERSION}" - else - export NVM_DIR="${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm" - fi -} - -install_ws_node_packages() { - - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.nvm_installed-${DATAFED_NVM_VERSION}" ]; then - echo "You must first install nvm before installing ws node packages." - exit 1 - fi - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.node_installed-${DATAFED_NODE_VERSION}" ]; then - echo "You must first install node before installing ws node packages" - exit 1 - fi - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.cmake_installed-${DATAFED_CMAKE_VERSION}" ]; then - echo "You must first install cmake before installing ws node packages" - exit 1 - fi - - # Configure the package.json.in file -> package.json - cmake -P "${PROJECT_ROOT}/cmake/Web.cmake" - export NVM_DIR="${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm" - export NODE_VERSION="$DATAFED_NODE_VERSION" - "$NVM_DIR/nvm-exec" npm --prefix "${PROJECT_ROOT}/web" install "${PROJECT_ROOT}/web" -} - - -install_node() { - local NODE_FLAG_PREFIX=".node_installed-" - clean_install_flags "$NODE_FLAG_PREFIX" - # By default this will place NVM in $HOME/.nvm - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${NODE_FLAG_PREFIX}${DATAFED_NODE_VERSION}" ]; then - local original_dir=$(pwd) - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.nvm_installed-${DATAFED_NVM_VERSION}" ]; then - echo "You must first install nvm before installing node." - exit 1 - fi - - export NVM_DIR="${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm" - - [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm - nvm install "$DATAFED_NODE_VERSION" - nvm use "$DATAFED_NODE_VERSION" - # Mark node as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${NODE_FLAG_PREFIX}${DATAFED_NODE_VERSION}" - cd "$original_dir" - else - export NVM_DIR="${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm" - # Used by nvm - export NODE_VERSION="$DATAFED_NODE_VERSION" - [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm - nvm use "$DATAFED_NODE_VERSION" - fi -} - -install_foxx_cli() { - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.nvm_installed-${DATAFED_NVM_VERSION}" ]; then - echo "You must first install nvm before installing foxx_cli." - exit 1 - fi - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.node_installed-${DATAFED_NODE_VERSION}" ]; then - echo "You must first install node before installing foxx_cli" - exit 1 - fi - local FOXX_FLAG_PREFIX=".foxx_cli_installed-" - clean_install_flags "$FOXX_FLAG_PREFIX" - # By default this will place NVM in $HOME/.nvm - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${FOXX_FLAG_PREFIX}" ]; then - local original_dir=$(pwd) - export NVM_DIR="${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm" - [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm - export NODE_VERSION="$DATAFED_NODE_VERSION" - "$NVM_DIR/nvm-exec" npm install --global foxx-cli --prefix "${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm" - # Mark foxx_cli as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${FOXX_FLAG_PREFIX}" - cd "$original_dir" - else - export NVM_DIR="${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm" - [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm - export NODE_VERSION="$DATAFED_NODE_VERSION" - - # check that foxx can be found - if [ ! -d "${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm" ] - then - echo "Something went wrong Foxx is supposed to be installed i.e. " - echo "(${DATAFED_DEPENDENCIES_INSTALL_PATH}/.foxx_cli_installed) " - echo "exists. But there is no npm folder in: ${DATAFED_DEPENDENCIES_INSTALL_PATH}" - exit 1 - fi - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/foxx" ] - then - echo "Something went wrong Foxx is supposed to be installed i.e. " - echo "(${DATAFED_DEPENDENCIES_INSTALL_PATH}/.foxx_cli_installed) " - echo "exists. But there is no foxx binary here: ${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/foxx" - exit 1 - fi - fi -} - -install_arangodb() { - curl -OL https://download.arangodb.com/arangodb312/DEBIAN/Release.key - "$SUDO_CMD" apt-key add - < Release.key - echo 'deb https://download.arangodb.com/arangodb312/DEBIAN/ /' | "$SUDO_CMD" tee /etc/apt/sources.list.d/arangodb.list - "$SUDO_CMD" apt-get install apt-transport-https - "$SUDO_CMD" apt-get update - "$SUDO_CMD" apt-get install arangodb3 -} - -install_openssl() { - local OPENSSL_FLAG_PREFIX=".openssl_installed-" - clean_install_flags "$OPENSSL_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${OPENSSL_FLAG_PREFIX}${DATAFED_OPENSSL}" ]; then - local original_dir=$(pwd) - if [ -d "${PROJECT_ROOT}/external/openssl" ] - then - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/openssl" - fi - git clone https://github.com/openssl/openssl "${PROJECT_ROOT}/external/openssl" - cd "${PROJECT_ROOT}/external/openssl" - git checkout "$DATAFED_OPENSSL_COMMIT" - ./config --prefix="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - make -j 8 - - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - make install - else - "$SUDO_CMD" make install - fi - # Mark openssl as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${OPENSSL_FLAG_PREFIX}${DATAFED_OPENSSL}" - cd "$original_dir" - fi -} - -install_libcurl() { - local CURL_FLAG_PREFIX=".libcurl_installed-" - clean_install_flags "$CURL_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${CURL_FLAG_PREFIX}${DATAFED_LIBCURL}" ]; then - local original_dir=$(pwd) - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.zlib_installed-${DATAFED_ZLIB_VERSION}" ]; then - echo "You must first install zlib before installing libcurl packages" - exit 1 - fi - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/.openssl_installed-${DATAFED_OPENSSL}" ]; then - echo "You must first install OpenSSL before installing libcurl packages" - exit 1 - fi - if [ -d "${PROJECT_ROOT}/external/libcurl" ] - then - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/libcurl" - fi - wget "${DATAFED_LIBCURL_URL}" - mkdir -p "${PROJECT_ROOT}/external/libcurl" - tar -xf "curl-${DATAFED_LIBCURL}.tar.gz" -C "${PROJECT_ROOT}/external/libcurl" - cd "${PROJECT_ROOT}/external/libcurl/curl-${DATAFED_LIBCURL}" - - # Making third party features and dependencies explicit - # OpenSSL is needed for HTTPS encryption - # File - allows caching requires libc - # GNUTLS - HTTPS support session management certificate verification etc - # NOTE: NSS - Network Security Services for HTTP support is deprecated - # NOTE: metalink - is no longer supported and not a valid argument - PKG_CONFIG_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/pkgconfig" \ - ./configure --with-ssl="${DATAFED_DEPENDENCIES_INSTALL_PATH}" --with-gnutls --with-zlib \ - --enable-file --disable-shared \ - --disable-ldap --disable-ldaps --disable-rtsp --disable-dict \ - --disable-telnet --disable-tftp --disable-pop3 --disable-imap \ - --disable-smtp --disable-gopher --disable-smb --disable-ftp \ - --disable-file --disable-sspi --without-zstd --without-libidn2 --without-librtmp \ - --without-winidn --without-libpsl \ - --without-libssh2 --without-nghttp2 --without-brotli \ - --without-libidn --without-libbrotli \ - --prefix="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - make -j 8 - - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - make install - else - "$SUDO_CMD" make install - fi - - # Mark libcurl as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${CURL_FLAG_PREFIX}${DATAFED_LIBCURL}" - cd "$original_dir" - fi -} - -install_zlib() { - local ZLIB_FLAG_PREFIX=".zlib_installed-" - clean_install_flags "$ZLIB_FLAG_PREFIX" - if [ ! -e "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${ZLIB_FLAG_PREFIX}${DATAFED_ZLIB_VERSION}" ]; then - local original_dir=$(pwd) - if [ -d "${PROJECT_ROOT}/external/zlib" ] - then - "$SUDO_CMD" rm -rf "${PROJECT_ROOT}/external/zlib" - fi - wget "${DATAFED_ZLIB_URL}" - mkdir -p "${PROJECT_ROOT}/external/zlib" - tar -xf "zlib-${DATAFED_ZLIB_VERSION}.tar.gz" -C "${PROJECT_ROOT}/external/zlib" - cd "${PROJECT_ROOT}/external/zlib/zlib-${DATAFED_ZLIB_VERSION}" - PKG_CONFIG_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}/lib/pkgconfig" ./configure --prefix="${DATAFED_DEPENDENCIES_INSTALL_PATH}" - make -j 8 - - if [ -w "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then - make install - else - "$SUDO_CMD" make install - fi - - # Mark libcurl as installed - touch "${DATAFED_DEPENDENCIES_INSTALL_PATH}/${ZLIB_FLAG_PREFIX}${DATAFED_ZLIB_VERSION}" - cd "$original_dir" - fi -} - -install_dep_by_name() { - case "$1" in - "cmake") - install_cmake - ;; - "foxx") - install_foxx_cli - ;; - "protobuf") - install_protobuf - ;; - "nlohmann_json") - install_nlohmann_json - ;; - "json_schema_validator") - install_json_schema_validator - ;; - "gcs") - install_gcs - ;; - "libsodium") - install_libsodium - ;; - "libzmq") - install_libzmq - ;; - "libopenssl") - install_openssl - ;; - "libcurl") - install_libcurl - ;; - "zlib") - install_zlib - ;; - "nvm") - install_nvm - ;; - "node") - install_node - ;; - "ws_node_packages") - install_ws_node_packages - ;; - esac - cd ~ -} diff --git a/scripts/dependency_versions.sh b/scripts/dependency_versions.sh index 0ed936fa5..72f3eab85 100644 --- a/scripts/dependency_versions.sh +++ b/scripts/dependency_versions.sh @@ -1,4 +1,3 @@ - # Versions DATAFED_CMAKE_VERSION="3.31.6" DATAFED_GLOBUS_VERSION="6.0.31-1" @@ -11,10 +10,11 @@ DATAFED_LIBZMQ_VERSION="4.3.4" # this version is different from above due to the fact libzmq names its shared library diffrently than the actual api version DATAFED_LIB_LIBZMQ_VERSION="5.2.4" DATAFED_LIB_ZMQCPP_VERSION="4.10.0" -DATAFED_NVM_VERSION="v0.39.7" -DATAFED_NODE_VERSION="v14.21.3" -DATAFED_NVM_VERSION="v0.39.7" +# we cannot use node 22 even though it is the currently highest supported LTS version, due to a currently unsolved build error +DATAFED_NODE_VERSION="v20.18.2" +DATAFED_NVM_VERSION="v0.40.1" DATAFED_PYTHON_VERSION="3.9" +DATAFED_PYTHON_VERSION_FULL="3.9.22" # Git tag DATAFED_PROTOBUF_VERSION="25.7" # Dynamic library extension .so.{DATAFED_FULL_PROTOBUF_VERSION} @@ -25,7 +25,7 @@ DATAFED_LIBCURL="8.11.0" DATAFED_LIBCURL_URL="https://github.com/curl/curl/releases/download/curl-8_11_0/curl-8.11.0.tar.gz" DATAFED_OPENSSL="1.1.1" DATAFED_OPENSSL_COMMIT="e04bd34" -DATAFED_BOOST="1.71.0" +DATAFED_BOOST="1.74.0" DATAFED_ZLIB_VERSION="1.3.1" DATAFED_ZLIB_URL="https://zlib.net/zlib-1.3.1.tar.gz" -DATAFED_GCS_SUBMODULE_VERSION="v2.8.0" +DATAFED_GCS_SUBMODULE_VERSION="ff7167860345e9b994110dfabdb251fe4dea8c00" diff --git a/scripts/export_dependency_version.sh b/scripts/export_dependency_version.sh index 60335144f..6e6b6dbb1 100755 --- a/scripts/export_dependency_version.sh +++ b/scripts/export_dependency_version.sh @@ -1,9 +1,9 @@ #!/bin/bash # Assumes sourcing not running -SCRIPT=$( realpath "${BASH_SOURCE[0]}" ) -SCRIPT_DIR=$( dirname "${SCRIPT}" ) +SCRIPT=$(realpath "${BASH_SOURCE[0]}") +SCRIPT_DIR=$(dirname "${SCRIPT}") PROJECT_ROOT=$(realpath "${SCRIPT_DIR}/..") -. "${PROJECT_ROOT}/scripts/utils.sh" +. "${PROJECT_ROOT}/external/DataFedDependencies/scripts/utils.sh" # WARNING # For this script to work it must be called with source # source export_dependency_version_numbers diff --git a/scripts/generate_authz_config.sh b/scripts/generate_authz_config.sh index f8018a59e..9dbb7bb60 100755 --- a/scripts/generate_authz_config.sh +++ b/scripts/generate_authz_config.sh @@ -8,8 +8,7 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) source ${PROJECT_ROOT}/config/datafed.sh -Help() -{ +Help() { echo "$(basename $0) Will set up a configuration file for the repo server" echo echo "Syntax: $(basename $0) [-h|r|d|p]" @@ -30,22 +29,19 @@ Help() REPO_ID="datafed-home" -if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ] -then +if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ]; then local_DATAFED_LOG_PATH="/var/log/datafed" else local_DATAFED_LOG_PATH=$(printenv DATAFED_DEFAULT_LOG_PATH) fi -if [ -z "DATAFED_DOMAIN" ] -then +if [ -z "DATAFED_DOMAIN" ]; then local_DATAFED_DOMAIN="datafed.ornl.gov" else local_DATAFED_DOMAIN=$(printenv DATAFED_DOMAIN) fi -if [ -z "DATAFED_SERVER_PORT" ] -then +if [ -z "DATAFED_SERVER_PORT" ]; then # This is the port that is open and listening on" # the core server." local_DATAFED_SERVER_PORT="7512" @@ -53,70 +49,69 @@ else local_DATAFED_SERVER_PORT=$(printenv DATAFED_SERVER_PORT) fi -if [ -z "${DATAFED_GCS_COLLECTION_BASE_PATH}" ] -then +if [ -z "${DATAFED_GCS_COLLECTION_BASE_PATH}" ]; then local_DATAFED_GCS_COLLECTION_BASE_PATH="/mnt/datafed-repo/mapped" else local_DATAFED_GCS_COLLECTION_BASE_PATH=$(printenv DATAFED_GCS_COLLECTION_BASE_PATH) fi -if [ -z "${DATAFED_GLOBUS_REPO_USER}" ] -then +if [ -z "${DATAFED_GLOBUS_REPO_USER}" ]; then local_DATAFED_AUTHZ_USER="$DATAFED_GLOBUS_REPO_USER" else local_DATAFED_AUTHZ_USER=$(printenv DATAFED_GLOBUS_REPO_USER) fi - VALID_ARGS=$(getopt -o hr:d:g: --long 'help',repo-id:,user:,domain:,globus-collection-path -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -r | --repo-id) - echo "Processing 'repo id' option. Input argument is '$2'" - REPO_ID=$2 - shift 2 - ;; - -d | --domain) - echo "Processing 'DataFed domain' option. Input argument is '$2'" - local_DATAFED_DOMAIN=$2 - shift 2 - ;; - -p | --port) - echo "Processing 'DataFed port' option. Input argument is '$2'" - local_DATAFED_SERVER_PORT=$2 - shift 2 - ;; - -u | --user) - echo "Processing 'DataFed user' option. Input argument is '$2'" - local_DATAFED_AUTHZ_USER=$2 - shift 2 - ;; - -g | --globus-collection-base-path) - echo "Processing 'Globus Collection Base Path' option. Input argument is '$2'" - local_DATAFED_GCS_COLLECTION_BASE_PATH=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -r | --repo-id) + echo "Processing 'repo id' option. Input argument is '$2'" + REPO_ID=$2 + shift 2 + ;; + -d | --domain) + echo "Processing 'DataFed domain' option. Input argument is '$2'" + local_DATAFED_DOMAIN=$2 + shift 2 + ;; + -p | --port) + echo "Processing 'DataFed port' option. Input argument is '$2'" + local_DATAFED_SERVER_PORT=$2 + shift 2 + ;; + -u | --user) + echo "Processing 'DataFed user' option. Input argument is '$2'" + local_DATAFED_AUTHZ_USER=$2 + shift 2 + ;; + -g | --globus-collection-base-path) + echo "Processing 'Globus Collection Base Path' option. Input argument is '$2'" + local_DATAFED_GCS_COLLECTION_BASE_PATH=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done PATH_TO_CONFIG_DIR=$(realpath "$SOURCE/../config") CONFIG_FILE_NAME="datafed-authz.cfg" -cat << EOF > "$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" +cat <"$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" server_address=tcp://${local_DATAFED_DOMAIN}:${local_DATAFED_SERVER_PORT} server_key=${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub repo_id=repo/$DATAFED_REPO_ID_AND_DIR @@ -131,8 +126,6 @@ echo echo "Config file is being placed here: $PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" echo echo "Contents are:" -echo +echo cat "$PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" # Configuration for GridFTP DataFed AuthZ callout module (dll) - - diff --git a/scripts/generate_certificate_refresh_script.sh b/scripts/generate_certificate_refresh_script.sh index 2ef521140..a2cedd18e 100755 --- a/scripts/generate_certificate_refresh_script.sh +++ b/scripts/generate_certificate_refresh_script.sh @@ -13,33 +13,29 @@ VERSION="1.0.1" echo "$FILE_NAME $VERSION" ERROR_DETECTED=0 -if [ -z "$DATAFED_INSTALL_PATH" ] -then +if [ -z "$DATAFED_INSTALL_PATH" ]; then echo "Error DATAFED_INSTALL_PATH is not defined in config/datafed.sh, this is" echo " a required argument." ERROR_DETECTED=1 fi -if [ -z "$DATAFED_LEGO_EMAIL" ] -then +if [ -z "$DATAFED_LEGO_EMAIL" ]; then echo "Error DATAFED_LEGO_EMAIL is not defined in config/datafed.sh, this is" echo " a required argument." ERROR_DETECTED=1 fi -if [ -z "$DATAFED_DOMAIN" ] -then +if [ -z "$DATAFED_DOMAIN" ]; then echo "Error DATAFED_DOMAIN is not defined in config/datafed.sh, this is" echo " a required argument." ERROR_DETECTED=1 fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi -cat << OUTER_EOF > "$PROJECT_ROOT/scripts/admin_refresh_certs.sh" +cat <"$PROJECT_ROOT/scripts/admin_refresh_certs.sh" #!/bin/bash # NOTE this script is generated by $SCRIPT, to recreate it change @@ -80,4 +76,4 @@ DataFed has updated the web certificates. EOF OUTER_EOF -chmod 755 "$PROJECT_ROOT/scripts/admin_refresh_certs.sh" +chmod 755 "$PROJECT_ROOT/scripts/admin_refresh_certs.sh" diff --git a/scripts/generate_core_config.sh b/scripts/generate_core_config.sh index 3c20305fe..04e22e931 100755 --- a/scripts/generate_core_config.sh +++ b/scripts/generate_core_config.sh @@ -10,8 +10,7 @@ PROJECT_ROOT=$(realpath ${SOURCE}/..) source ${PROJECT_ROOT}/config/datafed.sh echo "SOURCE Is $SOURCE" -Help() -{ +Help() { echo "$(basename $0) Will set up a configuration file for the core server" echo echo "Syntax: $(basename $0) [-h|t|c|f|s|i|a|u|p]" @@ -47,58 +46,50 @@ Help() } # Set defaults use environment variables by default -if [ -z "${DATAFED_CORE_CLIENT_THREADS}" ] -then +if [ -z "${DATAFED_CORE_CLIENT_THREADS}" ]; then local_DATAFED_CORE_CLIENT_THREADS="2" else local_DATAFED_CORE_CLIENT_THREADS=$(printenv DATAFED_CORE_CLIENT_THREADS) fi -if [ -z "${DATAFED_CORE_TASK_THREADS}" ] -then +if [ -z "${DATAFED_CORE_TASK_THREADS}" ]; then local_DATAFED_CORE_TASK_THREADS="2" else local_DATAFED_CORE_TASK_THREADS=$(printenv DATAFED_CORE_TASK_THREADS) fi -if [ -z "${DATAFED_CRED_DIR}" ] -then +if [ -z "${DATAFED_CRED_DIR}" ]; then local_DATAFED_CRED_DIR="${DATAFED_INSTALL_PATH}/keys/" else local_DATAFED_CRED_DIR=$(printenv DATAFED_CRED_DIR) fi -if [ -z "${DATAFED_GLOBUS_APP_ID}" ] -then +if [ -z "${DATAFED_GLOBUS_APP_ID}" ]; then local_DATAFED_GLOBUS_APP_ID="" else local_DATAFED_GLOBUS_APP_ID=$(printenv DATAFED_GLOBUS_APP_ID) fi -if [ -z "${DATAFED_GLOBUS_APP_SECRET}" ] -then +if [ -z "${DATAFED_GLOBUS_APP_SECRET}" ]; then local_DATAFED_GLOBUS_APP_SECRET="" else local_DATAFED_GLOBUS_APP_SECRET=$(printenv DATAFED_GLOBUS_APP_SECRET) fi local_DATABASE_USER="root" -if [ -z "${DATAFED_DATABASE_IP_ADDRESS_PORT}" ] -then +if [ -z "${DATAFED_DATABASE_IP_ADDRESS_PORT}" ]; then local_DATAFED_DATABASE_IP_ADDRESS_PORT="http://127.0.0.1:8529" else local_DATAFED_DATABASE_IP_ADDRESS_PORT=$(printenv DATAFED_DATABASE_IP_ADDRESS_PORT) fi -if [ -z "${DATAFED_DATABASE_PASSWORD}" ] -then +if [ -z "${DATAFED_DATABASE_PASSWORD}" ]; then local_DATAFED_DATABASE_PASSWORD="" else local_DATAFED_DATABASE_PASSWORD=$(printenv DATAFED_DATABASE_PASSWORD) fi -if [ -z "${DATAFED_CORE_LOG_LEVEL}" ] -then +if [ -z "${DATAFED_CORE_LOG_LEVEL}" ]; then local_DATAFED_CORE_LOG_LEVEL=3 else local_DATAFED_CORE_LOG_LEVEL=$(printenv DATAFED_CORE_LOG_LEVEL) @@ -106,111 +97,108 @@ fi VALID_ARGS=$(getopt -o ht:c:f:a:s:i:u:p --long 'help',threads-task:,cred-dir:,threads-client:,database-ip-address:,globus-secret:,globus-id:,database-user:,database-password: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do echo "$1" case "$1" in - -h | --help) - Help - exit 0 - ;; - -t | --threads) - echo "Processing 'threads-task' option. Input argument is '$2'" - local_DATAFED_CORE_TASK_THREADS=$2 - shift 2 - ;; - -c | --cred-dir) - echo "Processing 'credential directory' option. Input argument is '$2'" - local_DATAFED_CRED_DIR=$2 - shift 2 - ;; - -f | --threads-client) - echo "Processing 'threads client' option. Input argument is '$2'" - local_DATAFED_CORE_CLIENT_THREADS=$2 - shift 2 - ;; - -s | --globus-secret) - echo "Processing 'DataFed Globus App secret' option. Input argument is '$2'" - local_DATAFED_GLOBUS_APP_SECRET=$2 - shift 2 - ;; - -i | --globus-id) - echo "Processing 'DataFed Globus App client id' option. Input argument is '$2'" - local_DATAFED_GLOBUS_APP_ID=$2 - shift 2 - ;; - -u | --database-user) - echo "Processing 'Database user' option. Input argument is '$2'" - local_DATABASE_USER=$2 - shift 2 - ;; - -p | --database-password) - echo "Processing 'Database password' option. Input argument is '$2'" - local_DATAFED_DATABASE_PASSWORD=$2 - shift 2 - ;; - -a | --database-ip-address) - echo "Processing 'Database IP address' option. Input argument is '$2'" - local_DATAFED_DATABASE_IP_ADDRESS_PORT=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -t | --threads) + echo "Processing 'threads-task' option. Input argument is '$2'" + local_DATAFED_CORE_TASK_THREADS=$2 + shift 2 + ;; + -c | --cred-dir) + echo "Processing 'credential directory' option. Input argument is '$2'" + local_DATAFED_CRED_DIR=$2 + shift 2 + ;; + -f | --threads-client) + echo "Processing 'threads client' option. Input argument is '$2'" + local_DATAFED_CORE_CLIENT_THREADS=$2 + shift 2 + ;; + -s | --globus-secret) + echo "Processing 'DataFed Globus App secret' option. Input argument is '$2'" + local_DATAFED_GLOBUS_APP_SECRET=$2 + shift 2 + ;; + -i | --globus-id) + echo "Processing 'DataFed Globus App client id' option. Input argument is '$2'" + local_DATAFED_GLOBUS_APP_ID=$2 + shift 2 + ;; + -u | --database-user) + echo "Processing 'Database user' option. Input argument is '$2'" + local_DATABASE_USER=$2 + shift 2 + ;; + -p | --database-password) + echo "Processing 'Database password' option. Input argument is '$2'" + local_DATAFED_DATABASE_PASSWORD=$2 + shift 2 + ;; + -a | --database-ip-address) + echo "Processing 'Database IP address' option. Input argument is '$2'" + local_DATAFED_DATABASE_IP_ADDRESS_PORT=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done ERROR_DETECTED=0 -if [ -z "$local_DATAFED_GLOBUS_APP_SECRET" ] -then +if [ -z "$local_DATAFED_GLOBUS_APP_SECRET" ]; then echo "Error DATAFED_GLOBUS_APP_SECRET is not defined, this is a required argument." echo " This variable can be set using the command line option -s, --globus-secret" echo " or with the environment variable DATAFED_GLOBUS_APP_SECRET." ERROR_DETECTED=1 fi -if [ -z "$local_DATAFED_GLOBUS_APP_ID" ] -then +if [ -z "$local_DATAFED_GLOBUS_APP_ID" ]; then echo "Error DATAFED_GLOBUS_APP_ID is not defined, this is a required argument" echo " This variable can be set using the command line option -i, --globus-id" echo " or with the environment variable DATAFED_GLOBUS_APP_ID." ERROR_DETECTED=1 fi -if [ -z "$local_DATAFED_DATABASE_PASSWORD" ] -then +if [ -z "$local_DATAFED_DATABASE_PASSWORD" ]; then echo "Error DATAFED_DATABASE_PASSWORD is not defined, this is a required argument" echo " This variable can be set using the command line option -p, --database-password" echo " or with the environment variable DATAFED_DATABASE_PASSWORD." ERROR_DETECTED=1 fi -if [ -z "$local_DATAFED_DATABASE_IP_ADDRESS_PORT" ] -then +if [ -z "$local_DATAFED_DATABASE_IP_ADDRESS_PORT" ]; then echo "Error DATAFED_DATABASE_IP_ADDRESS_PORT is not defined, this is a required argument" echo " This variable can be set using the command line option -a, --database-ip-address-port" echo " or with the environment variable DATAFED_DATABASE_IP_ADDRESS_PORT. A default variable" echo " should have been defined as http://127.0.0.1:8529 so you are likely overwriting the default." fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi -FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs ) +FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs) local_DATABASE_API_URL="${local_DATAFED_DATABASE_IP_ADDRESS_PORT}/_db/sdms/api/${FOXX_MAJOR_API_VERSION}/" PATH_TO_CONFIG_DIR=$(realpath "$SOURCE/../config") CONFIG_FILE_NAME="datafed-core.cfg" -cat << EOF > "$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" +cat <"$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" # Note this file can be generated with $(basename $0) # Default location to log files cred-dir=$local_DATAFED_CRED_DIR @@ -240,5 +228,5 @@ echo echo "Config file is being placed here: $PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" echo echo "Contents are:" -echo +echo cat "$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" diff --git a/scripts/generate_core_service.sh b/scripts/generate_core_service.sh index 43702c252..5b05f9d1d 100755 --- a/scripts/generate_core_service.sh +++ b/scripts/generate_core_service.sh @@ -14,8 +14,7 @@ SERVICE_FILE_NAME="datafed-core.service" local_DATAFED_LOG_PATH="" -if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ] -then +if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ]; then local_DATAFED_LOG_PATH="/var/log/datafed" else local_DATAFED_LOG_PATH=$(printenv DATAFED_DEFAULT_LOG_PATH) @@ -24,14 +23,13 @@ fi DATAFED_CORE_LOG_FILE_PATH="/$local_DATAFED_LOG_PATH/datafed-core.log" # Remove double forward slashes -DATAFED_CORE_LOG_FILE_PATH=$( echo "$DATAFED_CORE_LOG_FILE_PATH" | sed 's/\/\//\//g') +DATAFED_CORE_LOG_FILE_PATH=$(echo "$DATAFED_CORE_LOG_FILE_PATH" | sed 's/\/\//\//g') -if [ ! -d "$PATH_TO_SERVICE_DIR" ] -then +if [ ! -d "$PATH_TO_SERVICE_DIR" ]; then mkdir -p $PATH_TO_SERVICE_DIR fi -cat << EOF > "$PATH_TO_SERVICE_DIR/$SERVICE_FILE_NAME" +cat <"$PATH_TO_SERVICE_DIR/$SERVICE_FILE_NAME" [Unit] Description=DataFed Core Server Requires=arangodb3.service diff --git a/scripts/generate_datafed.sh b/scripts/generate_datafed.sh index ce0e398d2..65cb9af66 100755 --- a/scripts/generate_datafed.sh +++ b/scripts/generate_datafed.sh @@ -6,13 +6,14 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) +${PROJECT_ROOT}/external/DataFedDependencies/scripts/generate_dependencies_config.sh + CONFIG_FILE_NAME="datafed.sh" PATH_TO_CONFIG_DIR=$(realpath "$PROJECT_ROOT/config") # This is a build config variable local_DATAFED_INSTALL_PATH="" -if [ -z "${DATAFED_INSTALL_PATH}" ] -then +if [ -z "${DATAFED_INSTALL_PATH}" ]; then local_DATAFED_INSTALL_PATH="/opt/datafed" else local_DATAFED_INSTALL_PATH=$(printenv DATAFED_INSTALL_PATH) @@ -21,28 +22,24 @@ fi # This is a build config variable local_DATAFED_DEPENDENCIES_INSTALL_PATH="" -if [ -z "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ] -then +if [ -z "${DATAFED_DEPENDENCIES_INSTALL_PATH}" ]; then local_DATAFED_DEPENDENCIES_INSTALL_PATH="/opt/datafed/dependencies" else local_DATAFED_DEPENDENCIES_INSTALL_PATH=$(printenv DATAFED_DEPENDENCIES_INSTALL_PATH) fi local_DATAFED_DEFAULT_LOG_PATH="" -if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ] -then +if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ]; then local_DATAFED_DEFAULT_LOG_PATH="/var/log/datafed" else local_DATAFED_DEFAULT_LOG_PATH=$(printenv DATAFED_DEFAULT_LOG_PATH) fi local_DATAFED_DATABASE_PASSWORD="" -if [[ ! -v DATAFED_DATABASE_PASSWORD ]] -then +if [[ ! -v DATAFED_DATABASE_PASSWORD ]]; then # Not set local_DATAFED_DATABASE_PASSWORD="" -elif [[ -z "$DATAFED_DATABASE_PASSWORD" ]] -then +elif [[ -z "$DATAFED_DATABASE_PASSWORD" ]]; then # Empty local_DATAFED_DATABASE_PASSWORD="" else @@ -50,182 +47,158 @@ else fi local_DATAFED_DATABASE_HOST="" -if [[ -z "$DATAFED_DATABASE_HOST" ]] -then +if [[ -z "$DATAFED_DATABASE_HOST" ]]; then # Empty local_DATAFED_DATABASE_HOST="localhost" else local_DATAFED_DATABASE_HOST=$(printenv DATAFED_DATABASE_HOST) fi +local_DATAFED_DATABASE_PORT="" +if [[ -z "$DATAFED_DATABASE_PORT" ]]; then + # Empty + local_DATAFED_DATABASE_PORT="8529" +else + local_DATAFED_DATABASE_PORT=$(printenv DATAFED_DATABASE_PORT) +fi local_DATAFED_ZEROMQ_SESSION_SECRET="" -if [ -z "${DATAFED_ZEROMQ_SESSION_SECRET}" ] -then +if [ -z "${DATAFED_ZEROMQ_SESSION_SECRET}" ]; then local_DATAFED_ZEROMQ_SESSION_SECRET="" else local_DATAFED_ZEROMQ_SESSION_SECRET=$(printenv DATAFED_ZEROMQ_SESSION_SECRET) fi -local_DATAFED_ZEROMQ_SYSTEM_SECRET="" -if [ -z "${DATAFED_ZEROMQ_SYSTEM_SECRET}" ] -then - local_DATAFED_ZEROMQ_SYSTEM_SECRET="" -else - local_DATAFED_ZEROMQ_SYSTEM_SECRET=$(printenv DATAFED_ZEROMQ_SYSTEM_SECRET) -fi - local_DATAFED_LEGO_EMAIL="" -if [ -z "${DATAFED_LEGO_EMAIL}" ] -then +if [ -z "${DATAFED_LEGO_EMAIL}" ]; then local_DATAFED_LEGO_EMAIL="" else local_DATAFED_LEGO_EMAIL=$(printenv DATAFED_LEGO_EMAIL) fi local_DATAFED_GLOBUS_APP_ID="" -if [ -z "${DATAFED_GLOBUS_APP_ID}" ] -then +if [ -z "${DATAFED_GLOBUS_APP_ID}" ]; then local_DATAFED_GLOBUS_APP_ID="" else local_DATAFED_GLOBUS_APP_ID=$(printenv DATAFED_GLOBUS_APP_ID) fi local_DATAFED_GLOBUS_APP_SECRET="" -if [ -z "${DATAFED_GLOBUS_APP_SECRET}" ] -then +if [ -z "${DATAFED_GLOBUS_APP_SECRET}" ]; then local_DATAFED_GLOBUS_APP_SECRET="" else local_DATAFED_GLOBUS_APP_SECRET=$(printenv DATAFED_GLOBUS_APP_SECRET) fi local_DATAFED_SERVER_PORT="" -if [ -z "${DATAFED_SERVER_PORT}" ] -then +if [ -z "${DATAFED_SERVER_PORT}" ]; then local_DATAFED_SERVER_PORT="7512" else local_DATAFED_SERVER_PORT=$(printenv DATAFED_SERVER_PORT) fi local_DATAFED_DOMAIN="" -if [ -z "${DATAFED_DOMAIN}" ] -then +if [ -z "${DATAFED_DOMAIN}" ]; then local_DATAFED_DOMAIN="datafed.ornl.gov" else local_DATAFED_DOMAIN=$(printenv DATAFED_DOMAIN) fi local_DATAFED_GCS_ROOT_NAME="" -if [ -z "${DATAFED_GCS_ROOT_NAME}" ] -then +if [ -z "${DATAFED_GCS_ROOT_NAME}" ]; then local_DATAFED_GCS_ROOT_NAME="" else local_DATAFED_GCS_ROOT_NAME=$(printenv DATAFED_GCS_ROOT_NAME) fi local_DATAFED_GCS_COLLECTION_BASE_PATH="" -if [ -z "${DATAFED_GCS_COLLECTION_BASE_PATH}" ] -then +if [ -z "${DATAFED_GCS_COLLECTION_BASE_PATH}" ]; then local_DATAFED_GCS_COLLECTION_BASE_PATH="" else local_DATAFED_GCS_COLLECTION_BASE_PATH=$(printenv DATAFED_GCS_COLLECTION_BASE_PATH) fi local_DATAFED_GCS_COLLECTION_ROOT_PATH="" -if [ -z "${DATAFED_GCS_COLLECTION_ROOT_PATH}" ] -then +if [ -z "${DATAFED_GCS_COLLECTION_ROOT_PATH}" ]; then local_DATAFED_GCS_COLLECTION_ROOT_PATH="" else local_DATAFED_GCS_COLLECTION_ROOT_PATH=$(printenv DATAFED_GCS_COLLECTION_ROOT_PATH) fi local_DATAFED_REPO_ID_AND_DIR="" -if [ -z "${DATAFED_REPO_ID_AND_DIR}" ] -then +if [ -z "${DATAFED_REPO_ID_AND_DIR}" ]; then local_DATAFED_REPO_ID_AND_DIR="" else local_DATAFED_REPO_ID_AND_DIR=$(printenv DATAFED_REPO_ID_AND_DIR) fi local_DATAFED_WEB_CERT_PATH="" -if [ -z "${DATAFED_WEB_CERT_PATH}" ] -then -local_DATAFED_WEB_CERT_PATH="${local_DATAFED_INSTALL_PATH}/keys/${local_DATAFED_DOMAIN}.crt" +if [ -z "${DATAFED_WEB_CERT_PATH}" ]; then + local_DATAFED_WEB_CERT_PATH="${local_DATAFED_INSTALL_PATH}/keys/${local_DATAFED_DOMAIN}.crt" else local_DATAFED_WEB_CERT_PATH=$(printenv DATAFED_WEB_CERT_PATH) fi local_DATAFED_WEB_KEY_PATH="" -if [ -z "${DATAFED_WEB_KEY_PATH}" ] -then +if [ -z "${DATAFED_WEB_KEY_PATH}" ]; then local_DATAFED_WEB_KEY_PATH="${local_DATAFED_INSTALL_PATH}/keys/${local_DATAFED_DOMAIN}.key" else local_DATAFED_WEB_KEY_PATH=$(printenv DATAFED_WEB_KEY_PATH) fi -if [ -z "${DATAFED_CORE_ADDRESS_PORT_INTERNAL}" ] -then +if [ -z "${DATAFED_CORE_ADDRESS_PORT_INTERNAL}" ]; then local_DATAFED_CORE_ADDRESS_PORT_INTERNAL="${local_DATAFED_DOMAIN}:7513" else local_DATAFED_CORE_ADDRESS_PORT_INTERNAL=$(printenv DATAFED_CORE_ADDRESS_PORT_INTERNAL) fi -if [ -z "${DATAFED_GOOGLE_ANALYTICS_TAG}" ] -then +if [ -z "${DATAFED_GOOGLE_ANALYTICS_TAG}" ]; then local_DATAFED_GOOGLE_ANALYTICS_TAG="" else local_DATAFED_GOOGLE_ANALYTICS_TAG=$(printenv DATAFED_GOOGLE_ANALYTICS_TAG) fi -if [ -z "${DATAFED_GLOBUS_REPO_USER}" ] -then +if [ -z "${DATAFED_GLOBUS_REPO_USER}" ]; then local_DATAFED_GLOBUS_REPO_USER="" else local_DATAFED_GLOBUS_REPO_USER=$(printenv DATAFED_GLOBUS_REPO_USER) fi -if [ -z "${DATAFED_CORE_USER}" ] -then +if [ -z "${DATAFED_CORE_USER}" ]; then local_DATAFED_CORE_USER="" else local_DATAFED_CORE_USER=$(printenv DATAFED_CORE_USER) fi - -if [ -z "${DATAFED_GLOBUS_CONTROL_PORT}" ] -then +if [ -z "${DATAFED_GLOBUS_CONTROL_PORT}" ]; then local_DATAFED_GLOBUS_CONTROL_PORT="443" else local_DATAFED_GLOBUS_CONTROL_PORT=$(printenv DATAFED_GLOBUS_CONTROL_PORT) fi -if [ -z "${DATAFED_GLOBUS_ALLOWED_DOMAINS}" ] -then +if [ -z "${DATAFED_GLOBUS_ALLOWED_DOMAINS}" ]; then local_DATAFED_GLOBUS_ALLOWED_DOMAINS="globusid.org" else local_DATAFED_GLOBUS_ALLOWED_DOMAINS=$(printenv DATAFED_GLOBUS_ALLOWED_DOMAINS) fi -if [ -z "${DATAFED_GLOBUS_SUBSCRIPTION}" ] -then - # For compose will set by default to run on a port other than 443 because +if [ -z "${DATAFED_GLOBUS_SUBSCRIPTION}" ]; then + # For compose will set by default to run on a port other than 443 because # the core metadata services use 443 for the web server local_DATAFED_GLOBUS_SUBSCRIPTION="" else local_DATAFED_GLOBUS_SUBSCRIPTION=$(printenv DATAFED_GLOBUS_SUBSCRIPTION) fi -if [ ! -d "$PATH_TO_CONFIG_DIR" ] -then +if [ ! -d "$PATH_TO_CONFIG_DIR" ]; then mkdir -p "$PATH_TO_CONFIG_DIR" fi -if [ ! -f "$PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" ] -then +if [ ! -f "$PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" ]; then touch "$PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" fi -cat << EOF > "$PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" +cat <"$PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" # This is the master DataFed configuration file # This is used when generating the service files to determine @@ -275,6 +248,8 @@ export DATAFED_DATABASE_PASSWORD="$local_DATAFED_DATABASE_PASSWORD" # Host of the metadata database, can be a domain name # or an IP address. export DATAFED_DATABASE_HOST="$local_DATAFED_DATABASE_HOST" +# i.e. 8529 - Arango port +export DATAFED_DATABASE_PORT="$local_DATAFED_DATABASE_PORT" # The user account the datafed core application will run under export DATAFED_CORE_USER="$local_DATAFED_CORE_USER" @@ -282,7 +257,6 @@ export DATAFED_CORE_USER="$local_DATAFED_CORE_USER" # Env Variables for Web Server # ************************************************ export DATAFED_ZEROMQ_SESSION_SECRET="$local_DATAFED_ZEROMQ_SESSION_SECRET" -export DATAFED_ZEROMQ_SYSTEM_SECRET="$local_DATAFED_ZEROMQ_SYSTEM_SECRET" # An email address is required by LEGO when # requesting certificates for the domain export DATAFED_LEGO_EMAIL="$local_DATAFED_LEGO_EMAIL" diff --git a/scripts/generate_datafed_backup_script.sh b/scripts/generate_datafed_backup_script.sh index 64ec9ca4b..377323464 100755 --- a/scripts/generate_datafed_backup_script.sh +++ b/scripts/generate_datafed_backup_script.sh @@ -15,33 +15,29 @@ echo "$FILE_NAME $VERSION" ERROR_DETECTED=0 # The admin should who should be receiving emails about the backups -if [ -z "$DATAFED_ADMIN_EMAIL" ] -then +if [ -z "$DATAFED_ADMIN_EMAIL" ]; then echo "Error DATAFED_ADMIN_EMAIL is not defined, this is a required argument." ERROR_DETECTED=1 fi # DataFed system email is from the actual system not from a person, it is # used to fill in the from field when sending emails out to admins or users. -if [ -z "$DATAFED_SYSTEM_EMAIL" ] -then +if [ -z "$DATAFED_SYSTEM_EMAIL" ]; then echo "Error DATAFED_SYSTEM_EMAIL is not defined, this is a required argument" ERROR_DETECTED=1 fi # Where the database backups will be placed. -if [ -z "$DATAFED_DATABASE_BACKUP_PATH" ] -then +if [ -z "$DATAFED_DATABASE_BACKUP_PATH" ]; then echo "Error DATAFED_DATABASE_BACKUP_PATH is not defined, this is a required argument" ERROR_DETECTED=1 fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi -cat << OUTER_EOF > "$PROJECT_ROOT/scripts/admin_datafed_backup.sh" +cat <"$PROJECT_ROOT/scripts/admin_datafed_backup.sh" #!/bin/bash # This script needs to be registered in the crontab diff --git a/scripts/generate_gsi-authz_config.sh b/scripts/generate_gsi-authz_config.sh index 3482ce297..853767293 100755 --- a/scripts/generate_gsi-authz_config.sh +++ b/scripts/generate_gsi-authz_config.sh @@ -11,7 +11,7 @@ source "${PROJECT_ROOT}/config/datafed.sh" PATH_TO_CONFIG_DIR=$(realpath "$SOURCE/../config") CONFIG_FILE_NAME="gsi-authz.conf" -cat << EOF > "$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" +cat <"$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" GLOBUS_GSI_AUTHZ_SYSTEM_INIT $DATAFED_INSTALL_PATH/authz/libdatafed-authz gsi_authz_init GLOBUS_GSI_AUTHZ_SYSTEM_DESTROY $DATAFED_INSTALL_PATH/authz/libdatafed-authz gsi_authz_destroy GLOBUS_GSI_AUTHZ_HANDLE_INIT $DATAFED_INSTALL_PATH/authz/libdatafed-authz gsi_authz_handle_init @@ -26,7 +26,5 @@ echo echo "gsi-conf file is being placed here: $PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" echo echo "Contents are:" -echo +echo cat "$PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" - - diff --git a/scripts/generate_metadata_container_scripts.sh b/scripts/generate_metadata_container_scripts.sh new file mode 100755 index 000000000..bd72a61e0 --- /dev/null +++ b/scripts/generate_metadata_container_scripts.sh @@ -0,0 +1,285 @@ +#!/bin/bash + +# Cannot run with -u because we check for unbound variables +# and the script will exit prematurely if '-u' is set +set -ef -o pipefail + +SCRIPT=$(realpath "$0") +FILE_NAME=$(basename "${SCRIPT}") +SOURCE=$(dirname "$SCRIPT") +PROJECT_ROOT=$(realpath "${SOURCE}/..") +source "${PROJECT_ROOT}/config/datafed.sh" + +VERSION="1.0.0" +echo "$FILE_NAME $VERSION" + +Help() { + echo "$(basename $0) Will set up the docker container scripts for the metadata server" + echo + echo "Syntax: $(basename $0) [-h|t|b]" + echo "options:" + echo "-h, --help Print this help message." + echo "-t, --docker-tag The tag on Savannah that the currently released containers are under" + echo "-b, --backup-directory The backup directory that will be mounted into the database container at /backups" + echo +} + +local_DOCKER_TAG="" +local_BACKUP_DIRECTORY="" + +if [ -z "${DATAFED_DOCKER_TAG}" ]; then + local_DOCKER_TAG="" +else + local_DOCKER_TAG=$(printenv DATAFED_DOCKER_TAG) +fi + +VALID_ARGS=$(getopt -o ht:b: --long 'help',docker-tag:,backup-directory: -- "$@") +if [[ $? -ne 0 ]]; then + exit 1 +fi +eval set -- "$VALID_ARGS" +while [ : ]; do + case "$1" in + -h | --help) + Help + exit 0 + ;; + -t | --docker-tag) + local_DOCKER_TAG=$2 + shift 2 + ;; + -b | --backup-directory) + local_BACKUP_DIRECTORY=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; + esac +done + +ERROR_DETECTED=0 + +if [ -z "$local_DOCKER_TAG" ]; then + echo "Error DOCKER_TAG is not defined, this is a required argument" + echo " This variable can be set using the command line option -t, --docker-tag" + echo " or with the environment variable DATAFED_DOCKER_TAG." + ERROR_DETECTED=1 +fi + +if [ -z "$local_BACKUP_DIRECTORY" ]; then + echo "Error BACKUP_DIRECTORY is not defined, this is a required argument" + echo " This variable can be set using the command line option -b, --backup-directory" + ERROR_DETECTED=1 +fi + +if [ "$ERROR_DETECTED" == "1" ]; then + exit 1 +fi + +CREATE_DATAFED_NETWORK_SCRIPT="$DATAFED_INSTALL_PATH/scripts/create_datafed_network.sh" +RUN_ARANGO_SCRIPT="$DATAFED_INSTALL_PATH/scripts/run_arango_container.sh" +STOP_ARANGO_SCRIPT="$DATAFED_INSTALL_PATH/scripts/stop_arango_container.sh" +REMOVE_ARANGO_SCRIPT="$DATAFED_INSTALL_PATH/scripts/remove_arango_container.sh" +RUN_CORE_SCRIPT="$DATAFED_INSTALL_PATH/scripts/run_core_container.sh" +STOP_CORE_SCRIPT="$DATAFED_INSTALL_PATH/scripts/stop_core_container.sh" +REMOVE_CORE_SCRIPT="$DATAFED_INSTALL_PATH/scripts/remove_core_container.sh" +RUN_WEB_SCRIPT="$DATAFED_INSTALL_PATH/scripts/run_web_container.sh" +STOP_WEB_SCRIPT="$DATAFED_INSTALL_PATH/scripts/stop_web_container.sh" +REMOVE_WEB_SCRIPT="$DATAFED_INSTALL_PATH/scripts/remove_web_container.sh" +RUN_NGINX_SCRIPT="$DATAFED_INSTALL_PATH/scripts/run_nginx_container.sh" +STOP_NGINX_SCRIPT="$DATAFED_INSTALL_PATH/scripts/stop_nginx_container.sh" +REMOVE_NGINX_SCRIPT="$DATAFED_INSTALL_PATH/scripts/remove_nginx_container.sh" + +local_DOCKER_TAG_WEB_SAFE=$(echo $local_DOCKER_TAG | sed 's/\./_/g') + +cat <"$CREATE_DATAFED_NETWORK_SCRIPT" +#!/bin/bash + +docker network create datafed-network +EOF + +cat <"$RUN_ARANGO_SCRIPT" +#!/bin/bash + +CONFIG_FILE_PATH="\$DATAFED_INSTALL_PATH/config/datafed.sh" +source "\${CONFIG_FILE_PATH}" + +docker run -d \\ + --restart=always \\ + --name arangodb \\ + --log-driver=json-file \\ + --log-opt max-size=10m \\ + --log-opt max-file=3 \\ + -e ARANGO_ROOT_PASSWORD="\$DATAFED_DATABASE_PASSWORD" \\ + -e LANG="en_US" \\ + --network datafed-network \\ + -p 8529:8529 \\ + -v arangodb_data:/var/lib/arangodb3:Z \\ + -v "$local_BACKUP_DIRECTORY:/backups" \\ + -t "arangodb/enterprise:3.12" +EOF + +cat <"$STOP_ARANGO_SCRIPT" +#!/bin/bash + +docker container stop arangodb +EOF + +cat <"$REMOVE_ARANGO_SCRIPT" +#!/bin/bash + +docker container stop arangodb +docker container rm arangodb +EOF + +cat <"$RUN_CORE_SCRIPT" +#!/bin/bash + +CONFIG_FILE_PATH="\$DATAFED_INSTALL_PATH/config/datafed.sh" +source "\${CONFIG_FILE_PATH}" + +USER_ID=\$(id -u) + +docker run -d \\ + --restart=always \\ + --name datafed-core-$local_DOCKER_TAG \\ + --log-driver=json-file \\ + --log-opt max-size=10m \\ + --log-opt max-file=3 \\ + -e DATAFED_GLOBUS_APP_SECRET="\$DATAFED_GLOBUS_APP_SECRET" \\ + -e DATAFED_GLOBUS_APP_ID="\$DATAFED_GLOBUS_APP_ID" \\ + -e DATAFED_ZEROMQ_SESSION_SECRET="\$DATAFED_ZEROMQ_SESSION_SECRET" \\ + -e DATAFED_DOMAIN="\$DATAFED_DOMAIN" \\ + -e DATAFED_DATABASE_PASSWORD="\$DATAFED_DATABASE_PASSWORD" \\ + -e DATAFED_DATABASE_IP_ADDRESS_PORT="http://\$DATAFED_DATABASE_HOST:\$DATAFED_DATABASE_PORT" \\ + -e DATAFED_DEFAULT_LOG_PATH="/datafed/logs" \\ + -e DATAFED_CORE_ADDRESS_PORT_INTERNAL="\$DATAFED_CORE_ADDRESS_PORT_INTERNAL" \\ + -e DATAFED_CORE_CLIENT_THREADS="24" \\ + -e DATAFED_CORE_TASK_THREADS="24" \\ + -e UID="\$USER_ID" \\ + --network datafed-network \\ + -p 7513:7513 \\ + -p 7512:7512 \\ + -v "\$DATAFED_INSTALL_PATH/logs:/datafed/logs" \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed-core-key.pub:/opt/datafed/keys/datafed-core-key.pub" \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed-core-key.priv:/opt/datafed/keys/datafed-core-key.priv" \\ + -t "datafed/core:$local_DOCKER_TAG" +EOF + +cat <"$STOP_CORE_SCRIPT" +#!/bin/bash + +docker container stop datafed-core-$local_DOCKER_TAG +EOF + +cat <"$REMOVE_CORE_SCRIPT" +#!/bin/bash + +docker container stop datafed-core-$local_DOCKER_TAG +docker container rm datafed-core-$local_DOCKER_TAG +EOF + +cat <"$RUN_WEB_SCRIPT" +#!/bin/bash + +CONFIG_FILE_PATH="\$DATAFED_INSTALL_PATH/config/datafed.sh" +source "\$CONFIG_FILE_PATH" + +USER_ID=\$(id -u) + +docker run -d \\ + --restart=always \\ + --name datafed-web-$local_DOCKER_TAG_WEB_SAFE \\ + --log-driver=json-file \\ + --log-opt max-size=10m \\ + --log-opt max-file=3 \\ + -e DATAFED_GLOBUS_APP_SECRET="\$DATAFED_GLOBUS_APP_SECRET" \\ + -e DATAFED_GLOBUS_APP_ID="\$DATAFED_GLOBUS_APP_ID" \\ + -e DATAFED_ZEROMQ_SESSION_SECRET="\$DATAFED_ZEROMQ_SESSION_SECRET" \\ + -e DATAFED_DOMAIN="\$DATAFED_DOMAIN" \\ + -e DATAFED_WEB_CERT_PATH="\$DATAFED_WEB_CERT_PATH" \\ + -e DATAFED_WEB_KEY_PATH="\$DATAFED_WEB_KEY_PATH" \\ + -e DATAFED_DEFAULT_LOG_PATH="/datafed/logs" \\ + -e DATAFED_CORE_ADDRESS_PORT_INTERNAL="\$DATAFED_CORE_ADDRESS_PORT_INTERNAL" \\ + -e DATAFED_GOOGLE_ANALYTICS_TAG="\$DATAFED_GOOGLE_ANALYTICS_TAG" \\ + -e UID="\$USER_ID" \\ + --network datafed-network \\ + -v "\$DATAFED_INSTALL_PATH/logs:/datafed/logs" \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed-core-key.pub:/opt/datafed/keys/datafed-core-key.pub" \\ + -v "\$DATAFED_WEB_CERT_PATH:\$DATAFED_WEB_CERT_PATH" \\ + -v "\$DATAFED_WEB_KEY_PATH:\$DATAFED_WEB_KEY_PATH" \\ + -t "datafed/web:$local_DOCKER_TAG" +EOF + +cat <"$STOP_WEB_SCRIPT" +#!/bin/bash + +docker container stop datafed-web-$local_DOCKER_TAG_WEB_SAFE +EOF + +cat <"$REMOVE_WEB_SCRIPT" +#!/bin/bash + +docker container stop datafed-web-$local_DOCKER_TAG_WEB_SAFE +docker container rm datafed-web-$local_DOCKER_TAG_WEB_SAFE +EOF + +cat <"$RUN_NGINX_SCRIPT" +#!/bin/bash + +CONFIG_FILE_PATH="\$DATAFED_INSTALL_PATH/config/datafed.sh" +source "\$CONFIG_FILE_PATH" + +docker run -d \\ + --restart=always \\ + --name datafed-nginx \\ + --network datafed-network \\ + --log-driver=json-file \\ + --log-opt max-size=10m \\ + --log-opt max-file=3 \\ + -p 443:443 \\ + -p 80:80 \\ + -v "\$DATAFED_INSTALL_PATH/nginx/nginx.conf:/etc/nginx/conf.d/default.conf" \\ + -v "\$DATAFED_INSTALL_PATH/nginx/sites-enabled:/etc/nginx/sites-enabled" \\ + -v "\$DATAFED_INSTALL_PATH/nginx/www:/www" \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed.ornl.gov.crt:/etc/nginx/certs/datafed.ornl.gov.crt" \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed.ornl.gov.key:/etc/nginx/certs/datafed.ornl.gov.key" \\ + nginx:latest +EOF + +cat <"$STOP_NGINX_SCRIPT" +#!/bin/bash + +docker container stop datafed-nginx +EOF + +cat <"$REMOVE_NGINX_SCRIPT" +#!/bin/bash + +docker container stop datafed-nginx +docker container rm datafed-nginx +EOF + +chmod +x "$CREATE_DATAFED_NETWORK_SCRIPT" + +chmod +x "$RUN_ARANGO_SCRIPT" +chmod +x "$STOP_ARANGO_SCRIPT" +chmod +x "$REMOVE_ARANGO_SCRIPT" + +chmod +x "$RUN_CORE_SCRIPT" +chmod +x "$STOP_CORE_SCRIPT" +chmod +x "$REMOVE_CORE_SCRIPT" + +chmod +x "$RUN_WEB_SCRIPT" +chmod +x "$STOP_WEB_SCRIPT" +chmod +x "$REMOVE_WEB_SCRIPT" + +chmod +x "$RUN_NGINX_SCRIPT" +chmod +x "$STOP_NGINX_SCRIPT" +chmod +x "$REMOVE_NGINX_SCRIPT" diff --git a/scripts/generate_repo_config.sh b/scripts/generate_repo_config.sh index d99c7d12d..45eb36725 100755 --- a/scripts/generate_repo_config.sh +++ b/scripts/generate_repo_config.sh @@ -6,8 +6,7 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) source ${PROJECT_ROOT}/config/datafed.sh -Help() -{ +Help() { echo "$(basename $0) Will set up a configuration file for the repo server" echo echo "Syntax: $(basename $0) [-h|t|c|e|d|g]" @@ -30,15 +29,13 @@ Help() echo "-g, --globus-collection-base-path The Globus (POSIX) Base path to the Guest Collection." } -if [ -z "${DATAFED_DOMAIN}" ] -then +if [ -z "${DATAFED_DOMAIN}" ]; then local_DATAFED_DOMAIN="datafed.ornl.gov" else local_DATAFED_DOMAIN=$(printenv DATAFED_DOMAIN) fi -if [ -z "${DATAFED_GCS_COLLECTION_BASE_PATH}" ] -then +if [ -z "${DATAFED_GCS_COLLECTION_BASE_PATH}" ]; then local_DATAFED_GCS_COLLECTION_BASE_PATH="/mnt/datafed-repo/mapped" else local_DATAFED_GCS_COLLECTION_BASE_PATH=$(printenv DATAFED_GCS_COLLECTION_BASE_PATH) @@ -46,19 +43,17 @@ fi local_DATAFED_LOG_PATH="" -if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ] -then +if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ]; then local_DATAFED_LOG_PATH="/var/log/datafed" else local_DATAFED_LOG_PATH=$(printenv DATAFED_DEFAULT_LOG_PATH) fi local_DATAFED_SERVER_PORT="" -if [ -z "${DATAFED_SERVER_PORT}" ] -then - local_DATAFED_SERVER_PORT="7512" +if [ -z "${DATAFED_SERVER_PORT}" ]; then + local_DATAFED_SERVER_PORT="7512" else - local_DATAFED_SERVER_PORT=$(printenv DATAFED_SERVER_PORT) + local_DATAFED_SERVER_PORT=$(printenv DATAFED_SERVER_PORT) fi local_DATAFED_CRED_DIR="${DATAFED_INSTALL_PATH}/keys/" @@ -67,46 +62,48 @@ local_DATAFED_REPO_THREADS=2 VALID_ARGS=$(getopt -o ht:c:e:d:g: --long 'help',threads:,cred-dir:,port:,globus-collection-base-path:,datafed-domain-port: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -t | --threads) - echo "Processing 'threads' option. Input argument is '$2'" - local_DATAFED_REPO_THREADS=$2 - shift 2 - ;; - -c | --cred-dir) - echo "Processing 'credential directory' option. Input argument is '$2'" - local_DATAFED_CRED_DIR=$2 - shift 2 - ;; - -p | --port) - echo "Processing 'port' option. Input argument is '$2'" - local_DATAFED_REPO_PORT=$2 - shift 2 - ;; - -d | --domain) - echo "Processing 'DataFed domain' option. Input argument is '$2'" - local_DATAFED_DOMAIN=$2 - shift 2 - ;; - -g | --globus-collection-base-path) - echo "Processing 'Globus Collection Base Path' option. Input argument is '$2'" - local_DATAFED_GCS_COLLECTION_BASE_PATH=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -t | --threads) + echo "Processing 'threads' option. Input argument is '$2'" + local_DATAFED_REPO_THREADS=$2 + shift 2 + ;; + -c | --cred-dir) + echo "Processing 'credential directory' option. Input argument is '$2'" + local_DATAFED_CRED_DIR=$2 + shift 2 + ;; + -p | --port) + echo "Processing 'port' option. Input argument is '$2'" + local_DATAFED_REPO_PORT=$2 + shift 2 + ;; + -d | --domain) + echo "Processing 'DataFed domain' option. Input argument is '$2'" + local_DATAFED_DOMAIN=$2 + shift 2 + ;; + -g | --globus-collection-base-path) + echo "Processing 'Globus Collection Base Path' option. Input argument is '$2'" + local_DATAFED_GCS_COLLECTION_BASE_PATH=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done @@ -118,7 +115,7 @@ CONFIG_FILE_NAME="datafed-repo.cfg" # tcp://datafed-repo.ornl.gov:9000, the repo server should have a fully # qualified domain name and publily accessible IP address. The port should be the # same port listed in the datafed-repo.cfg file. -cat << EOF > "$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" +cat <"$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" cred-dir=$local_DATAFED_CRED_DIR server=tcp://$local_DATAFED_DOMAIN:${local_DATAFED_SERVER_PORT} port=$local_DATAFED_REPO_PORT @@ -130,5 +127,5 @@ echo echo "Config file is being placed here: $PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" echo echo "Contents are:" -echo +echo cat "$PATH_TO_CONFIG_DIR/${CONFIG_FILE_NAME}" diff --git a/scripts/generate_repo_container_scripts.sh b/scripts/generate_repo_container_scripts.sh new file mode 100755 index 000000000..0ff4b575d --- /dev/null +++ b/scripts/generate_repo_container_scripts.sh @@ -0,0 +1,219 @@ +#!/bin/bash + +# Cannot run with -u because we check for unbound variables +# and the script will exit prematurely if '-u' is set +set -ef -o pipefail + +SCRIPT=$(realpath "$0") +FILE_NAME=$(basename "${SCRIPT}") +SOURCE=$(dirname "$SCRIPT") +PROJECT_ROOT=$(realpath "${SOURCE}/..") +source "${PROJECT_ROOT}/config/datafed.sh" + +VERSION="1.0.0" +echo "$FILE_NAME $VERSION" + +Help() { + echo "$(basename $0) Will set up the docker container scripts for the repository server" + echo + echo "Syntax: $(basename $0) [-h|t|v|i|d]" + echo "options:" + echo "-h, --help Print this help message." + echo "-t, --docker-tag The tag on Savannah that the currently released containers are under" + echo "-v, --repo-volume-mounts The extra volumes mounts to add to the repository server, comma separated" + echo "-i, --ip-address The public ip address of the host that the GCS container is running on" + echo "-d, --repo-domain The publicly accessible domain of the server that the host is running on" + echo +} + +local_DOCKER_TAG="" +local_IP_ADDRESS="" +local_REPO_DOMAIN="" +local_REPO_VOLUME_MOUNTS="" + +if [ -z "${DATAFED_DOCKER_TAG}" ]; then + local_DOCKER_TAG="" +else + local_DOCKER_TAG=$(printenv DATAFED_DOCKER_TAG) +fi + +VALID_ARGS=$(getopt -o ht:v:i:d: --long 'help',docker-tag:,repo-volume-mounts:,ip-address:,repo-domain: -- "$@") +if [[ $? -ne 0 ]]; then + exit 1 +fi +eval set -- "$VALID_ARGS" +while [ : ]; do + case "$1" in + -h | --help) + Help + exit 0 + ;; + -t | --docker-tag) + local_DOCKER_TAG=$2 + shift 2 + ;; + -v | --repo-volume-mounts) + local_REPO_VOLUME_MOUNTS=$2 + shift 2 + ;; + -i | --ip-address) + local_IP_ADDRESS=$2 + shift 2 + ;; + -d | --repo-domain) + local_REPO_DOMAIN=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; + esac +done + +ERROR_DETECTED=0 +if [ -z "$local_DOCKER_TAG" ]; then + echo "Error DOCKER_TAG is not defined, this is a required argument" + echo " This variable can be set using the command line option -t, --docker-tag" + echo " or with the environment variable DATAFED_DOCKER_TAG." + ERROR_DETECTED=1 +fi + +if [ -z "$local_IP_ADDRESS" ]; then + echo "Error IP_ADDRESS is not defined, this is a required argument" + echo " This variable can be set using the command line option -i, --ip-address" + ERROR_DETECTED=1 +fi + +if [ -z "$local_REPO_DOMAIN" ]; then + echo "Error REPO_DOMAIN is not defined, this is a required argument" + echo " This variable can be set using the command line option -d, --repo-domain" + ERROR_DETECTED=1 +fi + +if [ "$ERROR_DETECTED" == "1" ]; then + exit 1 +fi + +RUN_REPO_SCRIPT="$DATAFED_INSTALL_PATH/scripts/run_repo_container.sh" +STOP_REPO_SCRIPT="$DATAFED_INSTALL_PATH/scripts/stop_repo_container.sh" +REMOVE_REPO_SCRIPT="$DATAFED_INSTALL_PATH/scripts/remove_repo_container.sh" +RUN_GCS_SCRIPT="$DATAFED_INSTALL_PATH/scripts/run_gcs_container.sh" +STOP_GCS_SCRIPT="$DATAFED_INSTALL_PATH/scripts/stop_gcs_container.sh" +REMOVE_GCS_SCRIPT="$DATAFED_INSTALL_PATH/scripts/remove_gcs_container.sh" + +IFS=',' read -ra local_REPO_VOLUME_MOUNTS <<<"$local_REPO_VOLUME_MOUNTS" +local_REPO_VOLUME_MOUNTS_EXPANDED="" +for volume_mount in "${local_REPO_VOLUME_MOUNTS[@]}"; do + local_REPO_VOLUME_MOUNTS_EXPANDED+="-v \"$volume_mount\" " +done + +cat <"$RUN_REPO_SCRIPT" +#!/bin/bash + +CONFIG_FILE_PATH="\$DATAFED_INSTALL_PATH/config/datafed.sh" +source "\${CONFIG_FILE_PATH}" + +USER_ID=\$(id -u) + +docker run -d \\ + --restart=always \\ + --name "datafed-repo-$local_DOCKER_TAG" \\ + --log-driver=json-file \\ + --log-opt max-size=10m \\ + --log-opt max-file=3 \\ + -e DATAFED_GLOBUS_APP_SECRET="\$DATAFED_GLOBUS_APP_SECRET" \\ + -e DATAFED_GLOBUS_APP_ID="\$DATAFED_GLOBUS_APP_ID" \\ + -e DATAFED_ZEROMQ_SESSION_SECRET="\$DATAFED_ZEROMQ_SESSION_SECRET" \\ + -e DATAFED_HTTPS_SERVER_PORT="443" \\ + -e DATAFED_DOMAIN="\$DATAFED_DOMAIN" \\ + -e DATAFED_CORE_ADDRESS_PORT_INTERNAL="\$DATAFED_DOMAIN:7513" \\ + -e DATAFED_DEFAULT_LOG_PATH="\$DATAFED_DEFAULT_LOG_PATH" \\ + -e DATAFED_GCS_BASE_PATH="\$DATAFED_GCS_COLLECTION_BASE_PATH" \\ + -e DATAFED_GCS_COLLECTION_BASE_PATH="\$DATAFED_GCS_COLLECTION_BASE_PATH" \\ + -e DATAFED_GCS_COLLECTION_ROOT_PATH="\$DATAFED_GCS_COLLECTION_ROOT_PATH" \\ + -e UID="\$USER_ID" \\ + -p 9000:9000 \\ + -v "\$DATAFED_INSTALL_PATH/logs:/datafed/logs" \\ + $local_REPO_VOLUME_MOUNTS_EXPANDED \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed-repo-key.pub:/opt/datafed/keys/datafed-repo-key.pub" \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed-repo-key.priv:/opt/datafed/keys/datafed-repo-key.priv" \\ + -t "datafed/repo:$local_DOCKER_TAG" +EOF + +cat <"$STOP_REPO_SCRIPT" +#!/bin/bash + +docker container stop datafed-repo-$local_DOCKER_TAG +EOF + +cat <"$REMOVE_REPO_SCRIPT" +#!/bin/bash + +docker container stop datafed-repo-$local_DOCKER_TAG +docker container rm datafed-repo-$local_DOCKER_TAG +EOF + +cat <"$RUN_GCS_SCRIPT" +#!/bin/bash + +CONFIG_FILE_PATH="\$DATAFED_INSTALL_PATH/config/datafed.sh" +source "\${CONFIG_FILE_PATH}" + +USER_ID=\$(id -u) + +docker run -d \\ + --restart=always \\ + --name "datafed-gcs-$local_DOCKER_TAG" \\ + -e DATAFED_GLOBUS_APP_SECRET="\$DATAFED_GLOBUS_APP_SECRET" \\ + -e DATAFED_GLOBUS_APP_ID="\$DATAFED_GLOBUS_APP_ID" \\ + -e DATAFED_ZEROMQ_SESSION_SECRET="\$DATAFED_ZEROMQ_SESSION_SECRET" \\ + -e DATAFED_HTTPS_SERVER_PORT="443" \\ + -e DATAFED_DOMAIN="\$DATAFED_DOMAIN" \\ + -e DATAFED_CORE_ADDRESS_PORT_INTERNAL="\$DATAFED_DOMAIN:7513" \\ + -e DATAFED_DEFAULT_LOG_PATH="\$DATAFED_DEFAULT_LOG_PATH" \\ + -e DATAFED_GCS_COLLECTION_BASE_PATH="\$DATAFED_GCS_COLLECTION_BASE_PATH" \\ + -e DATAFED_GCS_COLLECTION_ROOT_PATH="\$DATAFED_GCS_COLLECTION_ROOT_PATH" \\ + -e DATAFED_GCS_ROOT_NAME="\$DATAFED_GCS_ROOT_NAME" \\ + -e DATAFED_GLOBUS_SUBSCRIPTION="\$DATAFED_GLOBUS_SUBSCRIPTION" \\ + -e DATAFED_GLOBUS_CONTROL_PORT="\$DATAFED_GLOBUS_CONTROL_PORT" \\ + -e DATAFED_REPO_USER="datafed" \\ + -e DATAFED_AUTHZ_USER="datafed" \\ + -e BUILD_WITH_METADATA_SERVICES="FALSE" \\ + -e DATAFED_REPO_ID_AND_DIR="\$DATAFED_REPO_ID_AND_DIR" \\ + -e DATAFED_GCS_IP="$local_IP_ADDRESS" \\ + -e DATAFED_REPO_DOMAIN="$local_REPO_DOMAIN" \\ + -e UID="\$USER_ID" \\ + --network=host \\ + -v "\$DATAFED_INSTALL_PATH/logs:/datafed/logs" \\ + $local_REPO_VOLUME_MOUNTS_EXPANDED \\ + -v "\$DATAFED_INSTALL_PATH/globus:/opt/datafed/globus" \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed-repo-key.pub:/opt/datafed/keys/datafed-repo-key.pub" \\ + -v "\$DATAFED_INSTALL_PATH/keys/datafed-repo-key.priv:/opt/datafed/keys/datafed-repo-key.priv" \\ + -t "datafed/gcs:$local_DOCKER_TAG" +EOF + +cat <"$STOP_GCS_SCRIPT" +#!/bin/bash + +docker container stop datafed-gcs-$local_DOCKER_TAG +EOF + +cat <"$REMOVE_GCS_SCRIPT" +#!/bin/bash + +docker container stop datafed-gcs-$local_DOCKER_TAG +docker container rm datafed-gcs-$local_DOCKER_TAG +EOF + +chmod +x "$RUN_REPO_SCRIPT" +chmod +x "$STOP_REPO_SCRIPT" +chmod +x "$REMOVE_REPO_SCRIPT" + +chmod +x "$RUN_GCS_SCRIPT" +chmod +x "$STOP_GCS_SCRIPT" +chmod +x "$REMOVE_GCS_SCRIPT" diff --git a/scripts/generate_repo_service.sh b/scripts/generate_repo_service.sh index 295203c4a..ec3a2ca1a 100755 --- a/scripts/generate_repo_service.sh +++ b/scripts/generate_repo_service.sh @@ -14,8 +14,7 @@ SERVICE_FILE_NAME="datafed-repo.service" local_DATAFED_LOG_PATH="" -if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ] -then +if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ]; then local_DATAFED_LOG_PATH="/var/log/datafed" else local_DATAFED_LOG_PATH=$(printenv DATAFED_DEFAULT_LOG_PATH) @@ -24,13 +23,12 @@ fi DATAFED_REPO_LOG_FILE_PATH="/$local_DATAFED_LOG_PATH/datafed-repo.log" # Remove double forward slashes -DATAFED_REPO_LOG_FILE_PATH=$( echo "$DATAFED_REPO_LOG_FILE_PATH" | sed 's/\/\//\//g') +DATAFED_REPO_LOG_FILE_PATH=$(echo "$DATAFED_REPO_LOG_FILE_PATH" | sed 's/\/\//\//g') -if [ ! -d "$PATH_TO_SERVICE_DIR" ] -then +if [ ! -d "$PATH_TO_SERVICE_DIR" ]; then mkdir -p $PATH_TO_SERVICE_DIR fi -cat << EOF > "$PATH_TO_SERVICE_DIR/$SERVICE_FILE_NAME" +cat <"$PATH_TO_SERVICE_DIR/$SERVICE_FILE_NAME" [Unit] Description=DataFed Repo Server [Service] diff --git a/scripts/generate_ws_config.sh b/scripts/generate_ws_config.sh index 33211d675..2e745b1f8 100755 --- a/scripts/generate_ws_config.sh +++ b/scripts/generate_ws_config.sh @@ -10,8 +10,7 @@ PROJECT_ROOT=$(realpath ${SOURCE}/..) source ${PROJECT_ROOT}/config/datafed.sh echo "SOURCE Is $SOURCE" -Help() -{ +Help() { echo "$(basename $0) Will set up a configuration file for the core server" echo echo "Syntax: $(basename $0) [-h|s|i|z|y|w|k|t]" @@ -35,7 +34,6 @@ Help() echo " datafed.ornl.gov:7513" echo " The default is to use the domain name and port 7513." echo "-z, --zeromq-session-secret ZeroMQ session secret" - echo "-y, --zeromq-system-secret ZeroMQ system secret" echo "-w, --web-cert-path Path to web server certificate file." echo "-k, --web-key-path Path to web server key file." echo "-t, --google-analytics-tag The tag associated with a Google Analytics stream" @@ -45,178 +43,139 @@ Help() local_DATAFED_WEB_CERT_PATH="${DATAFED_INSTALL_PATH}/keys/datafed-server-test.ornl.gov.crt" local_DATAFED_WEB_KEY_PATH="${DATAFED_INSTALL_PATH}/keys/datafed-server-test.ornl.gov.key" -if [ ! -z "${DATAFED_WEB_KEY_PATH}" ] -then - local_DATAFED_WEB_KEY_PATH=$(printenv DATAFED_WEB_KEY_PATH) +if [ ! -z "${DATAFED_WEB_KEY_PATH}" ]; then + local_DATAFED_WEB_KEY_PATH=$(printenv DATAFED_WEB_KEY_PATH) fi -if [ ! -z "${DATAFED_WEB_CERT_PATH}" ] -then - local_DATAFED_WEB_CERT_PATH=$(printenv DATAFED_WEB_CERT_PATH) +if [ ! -z "${DATAFED_WEB_CERT_PATH}" ]; then + local_DATAFED_WEB_CERT_PATH=$(printenv DATAFED_WEB_CERT_PATH) fi -if [ -z "${DATAFED_DOMAIN}" ] -then +if [ -z "${DATAFED_DOMAIN}" ]; then local_DATAFED_SERVER_DOMAIN_NAME="datafed.ornl.gov" else local_DATAFED_SERVER_DOMAIN_NAME=$(printenv DATAFED_DOMAIN) fi -if [ -z "${DATAFED_HTTPS_SERVER_PORT}" ] -then +if [ -z "${DATAFED_HTTPS_SERVER_PORT}" ]; then local_DATAFED_HTTPS_SERVER_PORT="443" else local_DATAFED_HTTPS_SERVER_PORT=$(printenv DATAFED_HTTPS_SERVER_PORT) fi -if [ -z "${DATAFED_GLOBUS_APP_ID}" ] -then +if [ -z "${DATAFED_GLOBUS_APP_ID}" ]; then local_DATAFED_GLOBUS_APP_ID="" else local_DATAFED_GLOBUS_APP_ID=$(printenv DATAFED_GLOBUS_APP_ID) fi -if [ -z "${DATAFED_GLOBUS_APP_SECRET}" ] -then +if [ -z "${DATAFED_GLOBUS_APP_SECRET}" ]; then local_DATAFED_GLOBUS_APP_SECRET="" else local_DATAFED_GLOBUS_APP_SECRET=$(printenv DATAFED_GLOBUS_APP_SECRET) fi -if [ -z "${DATAFED_ZEROMQ_SESSION_SECRET}" ] -then +if [ -z "${DATAFED_ZEROMQ_SESSION_SECRET}" ]; then local_DATAFED_ZEROMQ_SESSION_SECRET="" else local_DATAFED_ZEROMQ_SESSION_SECRET=$(printenv DATAFED_ZEROMQ_SESSION_SECRET) fi -if [ -z "${DATAFED_ZEROMQ_SYSTEM_SECRET}" ] -then - local_DATAFED_ZEROMQ_SYSTEM_SECRET="" -else - local_DATAFED_ZEROMQ_SYSTEM_SECRET=$(printenv DATAFED_ZEROMQ_SYSTEM_SECRET) -fi - local_DATAFED_LOG_PATH="" - -if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ] -then +if [ -z "${DATAFED_DEFAULT_LOG_PATH}" ]; then local_DATAFED_LOG_PATH="/var/log/datafed" else local_DATAFED_LOG_PATH=$(printenv DATAFED_DEFAULT_LOG_PATH) fi -if [ -z "${DATAFED_CORE_ADDRESS_PORT_INTERNAL}" ] -then +if [ -z "${DATAFED_CORE_ADDRESS_PORT_INTERNAL}" ]; then local_DATAFED_CORE_ADDRESS_PORT_INTERNAL="${local_DATAFED_SERVER_DOMAIN_NAME}:7513" else local_DATAFED_CORE_ADDRESS_PORT_INTERNAL=$(printenv DATAFED_CORE_ADDRESS_PORT_INTERNAL) fi -if [ -z "${DATAFED_GOOGLE_ANALYTICS_TAG}" ] -then +if [ -z "${DATAFED_GOOGLE_ANALYTICS_TAG}" ]; then local_DATAFED_GOOGLE_ANALYTICS_TAG="" else local_DATAFED_GOOGLE_ANALYTICS_TAG=$(printenv DATAFED_GOOGLE_ANALYTICS_TAG) fi - -VALID_ARGS=$(getopt -o hs:i:z:y:w:k:c:t: --long 'help',globus-secret:,globus-id:,zeromq-session-secret:,zeromq-system-secret:,web-cert-path:,web-key-path:,core-address-port:,google-analytics-tag: -- "$@") +VALID_ARGS=$(getopt -o hs:i:z:w:k:c:t: --long 'help',globus-secret:,globus-id:,zeromq-session-secret:,web-cert-path:,web-key-path:,core-address-port:,google-analytics-tag: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do echo "$1" case "$1" in - -h | --help) - Help - exit 0 - ;; - -s | --globus-secret) - echo "Processing 'DataFed Globus App secret' option. Input argument is '$2'" - local_DATAFED_GLOBUS_APP_SECRET=$2 - shift 2 - ;; - -i | --globus-id) - echo "Processing 'DataFed Globus App client id' option. Input argument is '$2'" - local_DATAFED_GLOBUS_APP_ID=$2 - shift 2 - ;; - -z | --zeromq-session-secret) - echo "Processing 'DataFed ZeroMQ session secret' option. Input argument is '$2'" - local_DATAFED_ZEROMQ_SESSION_SECRET=$2 - shift 2 - ;; - -y | --zeromq-system-secret) - echo "Processing 'DataFed ZeroMQ system secret' option. Input argument is '$2'" - local_DATAFED_ZEROMQ_SYSTEM_SECRET=$2 - shift 2 - ;; - -w | --web-cert-path) - echo "Processing 'DataFed web certificate path' option. Input argument is '$2'" - local_DATAFED_WEB_CERT_PATH=$2 - shift 2 - ;; - -k | --web-key-path) - echo "Processing 'DataFed web key path' option. Input argument is '$2'" - local_DATAFED_WEB_KEY_PATH=$2 - shift 2 - ;; - -c | --core-address-port) - echo "Processing 'DataFed internal core address and port' option. Input argument is '$2'" - local_DATAFED_CORE_ADDRESS_PORT_INTERNAL=$2 - shift 2 - ;; - -t | --google-analytics-tag) - echo "Processing 'DataFed Google Analytics tag' option. Input argument is '$2'" - local_DATAFED_GOOGLE_ANALYTICS_TAG=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -s | --globus-secret) + echo "Processing 'DataFed Globus App secret' option. Input argument is '$2'" + local_DATAFED_GLOBUS_APP_SECRET=$2 + shift 2 + ;; + -i | --globus-id) + echo "Processing 'DataFed Globus App client id' option. Input argument is '$2'" + local_DATAFED_GLOBUS_APP_ID=$2 + shift 2 + ;; + -w | --web-cert-path) + echo "Processing 'DataFed web certificate path' option. Input argument is '$2'" + local_DATAFED_WEB_CERT_PATH=$2 + shift 2 + ;; + -k | --web-key-path) + echo "Processing 'DataFed web key path' option. Input argument is '$2'" + local_DATAFED_WEB_KEY_PATH=$2 + shift 2 + ;; + -c | --core-address-port) + echo "Processing 'DataFed internal core address and port' option. Input argument is '$2'" + local_DATAFED_CORE_ADDRESS_PORT_INTERNAL=$2 + shift 2 + ;; + -t | --google-analytics-tag) + echo "Processing 'DataFed Google Analytics tag' option. Input argument is '$2'" + local_DATAFED_GOOGLE_ANALYTICS_TAG=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done ERROR_DETECTED=0 -if [ -z "$local_DATAFED_GLOBUS_APP_SECRET" ] -then +if [ -z "$local_DATAFED_GLOBUS_APP_SECRET" ]; then echo "Error DATAFED_GLOBUS_APP_SECRET is not defined, this is a required argument." echo " This variable can be set using the command line option -s, --globus-secret" echo " or with the environment variable DATAFED_GLOBUS_APP_SECRET." ERROR_DETECTED=1 fi -if [ -z "$local_DATAFED_GLOBUS_APP_ID" ] -then +if [ -z "$local_DATAFED_GLOBUS_APP_ID" ]; then echo "Error DATAFED_GLOBUS_APP_ID is not defined, this is a required argument" echo " This variable can be set using the command line option -i, --globus-id" echo " or with the environment variable DATAFED_GLOBUS_APP_ID." ERROR_DETECTED=1 fi -if [ -z "$local_DATAFED_ZEROMQ_SESSION_SECRET" ] -then +if [ -z "$local_DATAFED_ZEROMQ_SESSION_SECRET" ]; then echo "Error DATAFED_ZEROMQ_SESSION_SECRET is not defined, this is a required argument" echo " This variable can be set using the command line option -z, --zeromq-session-secret" echo " or with the environment variable DATAFED_ZEROMQ_SESSION_SECRET." ERROR_DETECTED=1 fi -if [ -z "$local_DATAFED_ZEROMQ_SYSTEM_SECRET" ] -then - echo "Error DATAFED_ZEROMQ_SYSTEM_SECRET is not defined, this is a required argument" - echo " This variable can be set using the command line option -y, --zeromq-session-secret" - echo " or with the environment variable DATAFED_ZEROMQ_SYSTEM_SECRET." - ERROR_DETECTED=1 -fi - -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi @@ -224,7 +183,7 @@ PATH_TO_CONFIG_DIR=$(realpath "$SOURCE/../config") CONFIG_FILE_NAME="datafed-ws.cfg" -cat << EOF > "$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" +cat <"$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" # Note this file can be generated with $(basename $0) [server] host=${local_DATAFED_SERVER_DOMAIN_NAME} @@ -240,7 +199,6 @@ log-path=${local_DATAFED_LOG_PATH} key_file=${local_DATAFED_WEB_KEY_PATH} cert_file=${local_DATAFED_WEB_CERT_PATH} # This is the secret used by Zero0MQ and must be consistent -system_secret=${local_DATAFED_ZEROMQ_SYSTEM_SECRET} session_secret=${local_DATAFED_ZEROMQ_SESSION_SECRET} extern_url=https://${local_DATAFED_SERVER_DOMAIN_NAME} @@ -265,5 +223,5 @@ echo echo "Config file is being placed here: $PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" echo echo "Contents are:" -echo +echo cat "$PATH_TO_CONFIG_DIR/$CONFIG_FILE_NAME" diff --git a/scripts/generate_ws_service.sh b/scripts/generate_ws_service.sh index 1d1868e44..c9f689db6 100755 --- a/scripts/generate_ws_service.sh +++ b/scripts/generate_ws_service.sh @@ -12,15 +12,13 @@ source ${PROJECT_ROOT}/config/datafed.sh PATH_TO_SERVICE_DIR=$(realpath "$SOURCE/../services") SERVICE_FILE_NAME="datafed-ws.service" -if [ ! -d "$PATH_TO_SERVICE_DIR" ] -then +if [ ! -d "$PATH_TO_SERVICE_DIR" ]; then mkdir -p "$PATH_TO_SERVICE_DIR" fi local_DATAFED_LOG_PATH="" -if [ ! -z "${DATAFED_DEFAULT_LOG_PATH}" ] -then +if [ ! -z "${DATAFED_DEFAULT_LOG_PATH}" ]; then local_DATAFED_LOG_PATH="/var/log/datafed" else local_DATAFED_LOG_PATH=$(printenv DATAFED_DEFAULT_LOG_PATH) @@ -29,12 +27,11 @@ fi DATAFED_WS_LOG_FILE_PATH="/$local_DATAFED_LOG_PATH/datafed-ws.log" # Remove double forward slashes -DATAFED_WS_LOG_FILE_PATH=$( echo "$DATAFED_WS_LOG_FILE_PATH" | sed 's/\/\//\//g') -if [ -d "$PATH_TO_SERVICE_DIR" ] -then +DATAFED_WS_LOG_FILE_PATH=$(echo "$DATAFED_WS_LOG_FILE_PATH" | sed 's/\/\//\//g') +if [ -d "$PATH_TO_SERVICE_DIR" ]; then mkdir -p $PATH_TO_SERVICE_DIR fi -cat << EOF > "$PATH_TO_SERVICE_DIR/$SERVICE_FILE_NAME" +cat <"$PATH_TO_SERVICE_DIR/$SERVICE_FILE_NAME" [Unit] Description=DataFed Web Server [Service] diff --git a/scripts/globus/clean_globus.sh b/scripts/globus/clean_globus.sh index d45a22908..be16be064 100755 --- a/scripts/globus/clean_globus.sh +++ b/scripts/globus/clean_globus.sh @@ -5,8 +5,7 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../../") source "${PROJECT_ROOT}/config/datafed.sh" -if [ -z "$DATAFED_GCS_ROOT_NAME" ] -then +if [ -z "$DATAFED_GCS_ROOT_NAME" ]; then echo "DATAFED_GCS_ROOT_NAME is not defined cannot run $SCRIPT" exit 1 fi @@ -16,12 +15,10 @@ COLLECTION_NAME="${DATAFED_GCS_ROOT_NAME} Collection Mapped" # Removing the mapped collection will also remove any guest collections -collection_line=$( globus-connect-server collection list | grep "$COLLECTION_NAME" ) -if [ ! -z "$collection_line" ] -then - uuid_of_collection=$( globus-connect-server collection list | grep "$COLLECTION_NAME" | awk '{ print $1 }') +collection_line=$(globus-connect-server collection list | grep "$COLLECTION_NAME") +if [ ! -z "$collection_line" ]; then + uuid_of_collection=$(globus-connect-server collection list | grep "$COLLECTION_NAME" | awk '{ print $1 }') - globus-connect-server collection update \ "$uuid_of_collection" \ --no-delete-protected @@ -29,14 +26,13 @@ then globus-connect-server collection delete "$uuid_of_collection" fi -gateway_line=$(globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" ) -if [ ! -z "$gateway_line" ] -then +gateway_line=$(globus-connect-server storage-gateway list | grep "$GATEWAY_NAME") +if [ ! -z "$gateway_line" ]; then spaces_in_name=$(echo "$GATEWAY_NAME" | awk '{print gsub("[ \t]",""); exit}') - columns=$(( $spaces_in_name + 3 )) - uuid_of_storage_gateway=$( globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" | awk -v col=$columns '{ print $col }') + columns=$(($spaces_in_name + 3)) + uuid_of_storage_gateway=$(globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" | awk -v col=$columns '{ print $col }') -# Check if it already exists + # Check if it already exists globus-connect-server storage-gateway delete "${uuid_of_storage_gateway}" fi diff --git a/scripts/globus/generate_repo_form.sh b/scripts/globus/generate_repo_form.sh index cf242adcf..af78eb2c7 100755 --- a/scripts/globus/generate_repo_form.sh +++ b/scripts/globus/generate_repo_form.sh @@ -7,8 +7,7 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/../../") source "${PROJECT_ROOT}/config/datafed.sh" -Help() -{ +Help() { echo "$(basename $0) Will create a form with prefilled information for registering a repo server with DataFed must be run on the same machine as the globus gridftp server" echo echo "Syntax: $(basename $0) [-h|s]" @@ -21,33 +20,28 @@ Help() echo "NOTE: Do not run this script with sudo!" } -if [ -z "$DATAFED_GCS_ROOT_NAME" ] -then +if [ -z "$DATAFED_GCS_ROOT_NAME" ]; then echo "DATAFED_GCS_ROOT_NAME is not defined in ${PROJECT_ROOT}/config/datafed.sh cannot run $SCRIPT." exit 1 fi -if [ -z "$DATAFED_GCS_COLLECTION_ROOT_PATH" ] -then +if [ -z "$DATAFED_GCS_COLLECTION_ROOT_PATH" ]; then echo "DATAFED_GCS_COLLECTION_ROOT_PATH is not defined cannot run $SCRIPT" exit 1 fi -if [ -z "$DATAFED_GCS_COLLECTION_BASE_PATH" ] -then +if [ -z "$DATAFED_GCS_COLLECTION_BASE_PATH" ]; then echo "DATAFED_GCS_COLLECTION_BASE_PATH is not defined cannot run $SCRIPT" exit 1 fi -if [ -z "$DATAFED_REPO_ID_AND_DIR" ] -then +if [ -z "$DATAFED_REPO_ID_AND_DIR" ]; then echo "DATAFED_REPO_ID_AND_DIR is not defined cannot run $SCRIPT" exit 1 fi # Check that the repo service has been installed -if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-repo-key.pub" ] -then +if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-repo-key.pub" ]; then echo "Cannot generate repository form if the repo service has not been installed." echo "NOTE: This script should be run from the same machine as the repo service" echo "and the globus connect server" @@ -59,37 +53,39 @@ local_GENERATE_REPO_FORM_JSON="FALSE" VALID_ARGS=$(getopt -o hscj --long 'help',generate-repo-form-script,generate-repo-form-config,generate-repo-form-json -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do echo "$1" case "$1" in - -h | --help) - Help - exit 0 - ;; - -s | --generate-repo-form-script) - echo "Processing generate-repo-form-script flag" - local_GENERATE_REPO_FORM_SCRIPT="TRUE" - shift 1 - ;; - -c | --generate-repo-form-config) - echo "Processing generate-repo-form-config flag" - local_GENERATE_REPO_FORM_CONFIG="TRUE" - shift 1 - ;; - -j | --generate-repo-form-json) - echo "Processing generate-repo-form-json flag" - local_GENERATE_REPO_FORM_JSON="TRUE" - shift 1 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -s | --generate-repo-form-script) + echo "Processing generate-repo-form-script flag" + local_GENERATE_REPO_FORM_SCRIPT="TRUE" + shift 1 + ;; + -c | --generate-repo-form-config) + echo "Processing generate-repo-form-config flag" + local_GENERATE_REPO_FORM_CONFIG="TRUE" + shift 1 + ;; + -j | --generate-repo-form-json) + echo "Processing generate-repo-form-json flag" + local_GENERATE_REPO_FORM_JSON="TRUE" + shift 1 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done @@ -99,7 +95,7 @@ function validate_domain() { local DOMAIN="$1" if host "$DOMAIN" | grep -q "has address"; then - echo "DEFINED" + echo "DEFINED" else echo "UNDEFINED" fi @@ -110,7 +106,7 @@ function normalize_path() { local normalized="" # Remove redundant slashes and handle '.' and '..' - IFS='/' read -r -a parts <<< "$path" + IFS='/' read -r -a parts <<<"$path" for part in "${parts[@]}"; do if [[ "$part" == "" || "$part" == "." ]]; then # Skip empty parts (redundant slashes) and current directory references @@ -145,7 +141,7 @@ function remove_trailing_slashes() { done echo "$path" } -# The below function is meant to remove a base path +# The below function is meant to remove a base path # from an absolute path examples of usage are shown below # # # Example usage @@ -153,58 +149,58 @@ function remove_trailing_slashes() { # absolute_path="/home/user/projects/myproject/file.txt" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /myproject/file.txt" -# +# # prefix="/" # absolute_path="/home/user/projects/myproject/file.txt" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /home/user/projects/myproject/file.txt" -# +# # prefix="/" # absolute_path="/" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /" -# +# # prefix="" # absolute_path="/" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /" -# +# # prefix="" # absolute_path="" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /" -# +# # prefix="/home/user/projects" # absolute_path="/home/user/projects" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /" -# +# # prefix="/home/user/projects" # absolute_path="/home/user/projects////" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /" -# +# # prefix="/home/user/projects" # absolute_path="/home/user/projects////myproject/file.txt" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /myproject/file.txt" -# +# # prefix="/home/././user/projects" # absolute_path="/home/user/projects////myproject/file.txt" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path: $relative_path == /myproject/file.txt" -# +# # # Should throw # prefix="/home/user/projects" # absolute_path="/home/user/../projects/myproject/file.txt" # error=$(remove_base "$prefix" "$absolute_path") # echo "Error $error == is not a base path of" -# +# # prefix="/home/user/projects" # absolute_path="/home/user/projects/myproject/.././file.txt" # relative_path=$(remove_base "$prefix" "$absolute_path") # echo "Relative path $relative_path == /file.txt" -# +# # # Example usage # prefix="/home/user/../../projects" # absolute_path="/home/user/../../projects/myproject/file.txt" @@ -217,8 +213,7 @@ function remove_base() { base_len=${#base_path} abs_len=${#absolute_path} - if [ $abs_len -lt $base_len ] - then + if [ $abs_len -lt $base_len ]; then echo "Something is wrong the absolute path is less than the root path" echo "absolute path: $absolute_path" echo " root path: $base_path" @@ -238,8 +233,7 @@ function remove_base() { absolute_path=$(remove_leading_slashes "$absolute_path") absolute_path="/${absolute_path}" # Remove the prefix from the absolute path - if [[ "${absolute_path}" != "${base_path}"* ]] - then + if [[ "${absolute_path}" != "${base_path}"* ]]; then echo "$base_path is not a base path of $absolute_path." return fi @@ -262,10 +256,9 @@ PATH_TO_GUEST_ROOT="${DATAFED_GCS_COLLECTION_ROOT_PATH}" RELATIVE_PATH=$(remove_base "$DATAFED_GCS_COLLECTION_BASE_PATH" "$PATH_TO_GUEST_ROOT") -uuid_of_collection=$( globus-connect-server collection list | grep "$GUEST_COLLECTION_NAME" | awk '{ print $1 }') +uuid_of_collection=$(globus-connect-server collection list | grep "$GUEST_COLLECTION_NAME" | awk '{ print $1 }') -if [ -z "$uuid_of_collection" ] -then +if [ -z "$uuid_of_collection" ]; then echo "Unable to generate form, you need to first create a guest collection" echo "inside '$MAPPED_COLLECTION_NAME' with name '$GUEST_COLLECTION_NAME'." echo "The guest collection must be located at $PATH_TO_GUEST_ROOT" @@ -274,21 +267,18 @@ fi # Probably should grab this from the config file local_DATAFED_REPO_EGRESS_PORT="9000" -if [ -z "${DATAFED_REPO_DOMAIN}" ] -then +if [ -z "${DATAFED_REPO_DOMAIN}" ]; then repo_domain_name="" else repo_domain_name=$(printenv DATAFED_REPO_DOMAIN) fi -if [ "${repo_domain_name}" == "" ] -then +if [ "${repo_domain_name}" == "" ]; then repo_domain_name=$(domainname -A | awk '{print $1}') fi local_DEFINED=$(validate_domain "$repo_domain_name") -if [ "${local_DEFINED}" == "UNDEFINED" ] || [ -z "$repo_domain_name" ] -then +if [ "${local_DEFINED}" == "UNDEFINED" ] || [ -z "$repo_domain_name" ]; then echo "domain name (${repo_domain_name}) is ${local_DEFINED} using local IP." local_address=$(hostname -I | awk '{print $1}') else @@ -300,55 +290,52 @@ FULL_RELATIVE_PATH="${RELATIVE_PATH}/$DATAFED_REPO_ID_AND_DIR" FULL_RELATIVE_PATH=$(remove_leading_slashes "$FULL_RELATIVE_PATH") FULL_RELATIVE_PATH="/${FULL_RELATIVE_PATH}" -if [ "$local_GENERATE_REPO_FORM_SCRIPT" = "TRUE" ] -then +if [ "$local_GENERATE_REPO_FORM_SCRIPT" = "TRUE" ]; then OUTPUT_SCRIPT_NAME="${DATAFED_REPO_ID_AND_DIR}-repo-form.sh" echo "Creating ${OUTPUT_SCRIPT_NAME} file" - echo "export DATAFED_REPO_ID=\"$DATAFED_REPO_ID_AND_DIR\"" > "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_TITLE=\"$DATAFED_GCS_ROOT_NAME\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_DESCRIPTION=\"Autogenerated\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_SERVER_ADDRESS=\"tcp://$local_address:$local_DATAFED_REPO_EGRESS_PORT\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_PUBLIC_KEY=\"$public_key\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_ENDPOINT_UUID=\"$uuid_of_collection\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_RELATIVE_PATH=\"${FULL_RELATIVE_PATH}\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_DOMAIN=\"placeholder\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_EXPORT_PATH=\"\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "export DATAFED_REPO_CAPACITY=\"\"" >> "${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_ID=\"$DATAFED_REPO_ID_AND_DIR\"" >"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_TITLE=\"$DATAFED_GCS_ROOT_NAME\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_DESCRIPTION=\"Autogenerated\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_SERVER_ADDRESS=\"tcp://$local_address:$local_DATAFED_REPO_EGRESS_PORT\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_PUBLIC_KEY=\"$public_key\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_ENDPOINT_UUID=\"$uuid_of_collection\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_RELATIVE_PATH=\"${FULL_RELATIVE_PATH}\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_DOMAIN=\"placeholder\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_EXPORT_PATH=\"\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "export DATAFED_REPO_CAPACITY=\"\"" >>"${OUTPUT_SCRIPT_NAME}" fi -if [ "$local_GENERATE_REPO_FORM_CONFIG" = "TRUE" ] -then +if [ "$local_GENERATE_REPO_FORM_CONFIG" = "TRUE" ]; then OUTPUT_SCRIPT_NAME="${DATAFED_REPO_ID_AND_DIR}-repo-form.cfg" echo "Creating ${OUTPUT_SCRIPT_NAME} file" - echo "id=\"$DATAFED_REPO_ID_AND_DIR\"" > "${OUTPUT_SCRIPT_NAME}" - echo "title=\"$DATAFED_GCS_ROOT_NAME\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "desc=\"Autogenerated\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "address=\"tcp://$local_address:$local_DATAFED_REPO_EGRESS_PORT\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "pub_key=\"$public_key\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "endpoint=\"$uuid_of_collection\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "path=\"${FULL_RELATIVE_PATH}\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "domain=\"placeholder\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "exp_path=\"\"" >> "${OUTPUT_SCRIPT_NAME}" - echo "capacity=\"\"" >> "${OUTPUT_SCRIPT_NAME}" + echo "id=\"$DATAFED_REPO_ID_AND_DIR\"" >"${OUTPUT_SCRIPT_NAME}" + echo "title=\"$DATAFED_GCS_ROOT_NAME\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "desc=\"Autogenerated\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "address=\"tcp://$local_address:$local_DATAFED_REPO_EGRESS_PORT\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "pub_key=\"$public_key\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "endpoint=\"$uuid_of_collection\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "path=\"${FULL_RELATIVE_PATH}\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "domain=\"placeholder\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "exp_path=\"\"" >>"${OUTPUT_SCRIPT_NAME}" + echo "capacity=\"\"" >>"${OUTPUT_SCRIPT_NAME}" fi -if [ "$local_GENERATE_REPO_FORM_JSON" = "TRUE" ] -then +if [ "$local_GENERATE_REPO_FORM_JSON" = "TRUE" ]; then # JSON treats backslash as a special character it will need to be represented as \\ when printed in JSON OUTPUT_SCRIPT_NAME="${DATAFED_REPO_ID_AND_DIR}-repo-form.json" echo "Creating ${OUTPUT_SCRIPT_NAME} script" - echo "{" > ${OUTPUT_SCRIPT_NAME} - echo " \"id\": \"$DATAFED_REPO_ID_AND_DIR\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"title\": \"$DATAFED_GCS_ROOT_NAME\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"desc\": \"Autogenerated\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"address\": \"tcp://$local_address:$local_DATAFED_REPO_EGRESS_PORT\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"pub_key\": \"$public_key\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"endpoint\": \"$uuid_of_collection\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"path\": \"${FULL_RELATIVE_PATH}\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"domain\": \"placeholder\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"exp_path\": \"\"," >> "${OUTPUT_SCRIPT_NAME}" - echo " \"capacity\": 0" >> "${OUTPUT_SCRIPT_NAME}" - echo "}" >> "${OUTPUT_SCRIPT_NAME}" + echo "{" >${OUTPUT_SCRIPT_NAME} + echo " \"id\": \"$DATAFED_REPO_ID_AND_DIR\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"title\": \"$DATAFED_GCS_ROOT_NAME\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"desc\": \"Autogenerated\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"address\": \"tcp://$local_address:$local_DATAFED_REPO_EGRESS_PORT\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"pub_key\": \"$public_key\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"endpoint\": \"$uuid_of_collection\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"path\": \"${FULL_RELATIVE_PATH}\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"domain\": \"placeholder\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"exp_path\": \"\"," >>"${OUTPUT_SCRIPT_NAME}" + echo " \"capacity\": 0" >>"${OUTPUT_SCRIPT_NAME}" + echo "}" >>"${OUTPUT_SCRIPT_NAME}" fi echo "DataFed Repo Form Registration Contents" @@ -365,4 +352,3 @@ echo "Domain: placeholder" # I don't know what this is echo "Export Path: " echo "Capacity: The capacity of the repository" - diff --git a/scripts/globus/initialize_globus_endpoint.py b/scripts/globus/initialize_globus_endpoint.py index c25a11c86..21250cadc 100644 --- a/scripts/globus/initialize_globus_endpoint.py +++ b/scripts/globus/initialize_globus_endpoint.py @@ -151,39 +151,53 @@ if DATAFED_GLOBUS_SUBSCRIPTION is not None: # Create subscription subgroup - results = gr_rt.get_group_by_subscription_id(DATAFED_GLOBUS_SUBSCRIPTION) - - parent_group_id = results["group_id"] - print("Groups by sub") - print(results) - group_name = f"{DATAFED_GCS_ROOT_NAME} Group" - - if utils.groupExists(gr_rt, group_name): - print("Group exists already") - group_id = utils.getGroupId(gr_rt, group_name) + # Note: get_group_by_subscription_id doesn't exist in current globus-sdk + # We'll use get_my_groups and filter by subscription_id + my_groups = gr_rt.get_my_groups() + + # Try to find a group with matching subscription_id + parent_group_id = None + for group in my_groups: + if group.get("subscription_id") == DATAFED_GLOBUS_SUBSCRIPTION: + parent_group_id = group["id"] + print(f"Found group with subscription {DATAFED_GLOBUS_SUBSCRIPTION}") + break + + # If no group found with subscription, try to create one or use first available + if parent_group_id is None: + print(f"Warning: No group found with subscription_id {DATAFED_GLOBUS_SUBSCRIPTION}") + # For now, we'll skip the group creation if we can't find the parent + print("Skipping group creation due to missing parent group") else: - print(f"Group does not exist {group_name}") - package = { - "name": group_name, - "description": "DataFed Repository Subscription Group, used for" - "granting access to the application client to setup the repository in " - "Globus", - "parent_id": str(parent_group_id), - } - - result = gr_rt.create_group(package) - group_id = result["id"] - - print("group id") - print(group_id) - - batch = globus_sdk.BatchMembershipActions() - batch.add_members(client_id, role="admin") - result = gr_rt.batch_membership_action(group_id, batch) - - print("membership_action") - print(result) - package = {"subscription_id": DATAFED_GLOBUS_SUBSCRIPTION} - result = gr_rt.update_group(group_id, package) - print("update group") - print(result) + print(f"Using parent group: {parent_group_id}") + group_name = f"{DATAFED_GCS_ROOT_NAME} Group" + + if utils.groupExists(gr_rt, group_name): + print("Group exists already") + group_id = utils.getGroupId(gr_rt, group_name) + else: + print(f"Group does not exist {group_name}") + package = { + "name": group_name, + "description": "DataFed Repository Subscription Group, used for" + "granting access to the application client to setup the repository in " + "Globus", + "parent_id": str(parent_group_id), + } + + result = gr_rt.create_group(package) + group_id = result["id"] + + print("group id") + print(group_id) + + batch = globus_sdk.BatchMembershipActions() + batch.add_members(client_id, role="admin") + result = gr_rt.batch_membership_action(group_id, batch) + + print("membership_action") + print(result) + package = {"subscription_id": DATAFED_GLOBUS_SUBSCRIPTION} + result = gr_rt.update_group(group_id, package) + print("update group") + print(result) diff --git a/scripts/globus/setup_globus.sh b/scripts/globus/setup_globus.sh index 523bb8d8d..c25b3c980 100755 --- a/scripts/globus/setup_globus.sh +++ b/scripts/globus/setup_globus.sh @@ -11,62 +11,56 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/../../) source ${PROJECT_ROOT}/config/datafed.sh -if [ -z "$DATAFED_GCS_ROOT_NAME" ] -then +if [ -z "$DATAFED_GCS_ROOT_NAME" ]; then echo "DATAFED_GCS_ROOT_NAME is not defined cannot run $SCRIPT" exit 1 fi -if [ -z "$DATAFED_GCS_COLLECTION_ROOT_PATH" ] -then +if [ -z "$DATAFED_GCS_COLLECTION_ROOT_PATH" ]; then echo "DATAFED_GCS_COLLECTION_ROOT_PATH is not defined cannot run $SCRIPT" exit 1 fi -if [ -z "$DATAFED_REPO_ID_AND_DIR" ] -then +if [ -z "$DATAFED_REPO_ID_AND_DIR" ]; then echo "DATAFED_REPO_ID_AND_DIR is not defined cannot run $SCRIPT" exit 1 fi -if [ -z "$DATAFED_GLOBUS_CRED_FILE_PATH" ] -then +if [ -z "$DATAFED_GLOBUS_CRED_FILE_PATH" ]; then echo "DATAFED_GLOBUS_CRED_FILE_PATH is not defined cannot run $DATAFED_GLOBUS_CRED_FILE_PATH" exit 1 else CRED_FILE_PATH="$DATAFED_GLOBUS_CRED_FILE_PATH" fi -if [ -z "${DATAFED_GLOBUS_SUBSCRIPTION}" ] -then +if [ -z "${DATAFED_GLOBUS_SUBSCRIPTION}" ]; then echo "DATAFED_GLOBUS_SUBSCRIPTION not defined" DATAFED_GLOBUS_SUBSCRIPTION="" else DATAFED_GLOBUS_SUBSCRIPTION=$(printenv DATAFED_GLOBUS_SUBSCRIPTION) fi -if [ -z "$DATAFED_GLOBUS_ALLOWED_DOMAINS" ] -then +if [ -z "$DATAFED_GLOBUS_ALLOWED_DOMAINS" ]; then echo "DATAFED_GLOBUS_ALLOWED_DOMAINS is not defined shoudl be i.e. globusid.org or gmail.com or ornl.gov or cu.edu or something of the sort." exit 1 fi if [ -f "$CRED_FILE_PATH" ]; then - echo "File exists! $CRED_FILE_PATH" + echo "File exists! $CRED_FILE_PATH" else - echo "File does not exist. $CRED_FILE_PATH" - echo "run the Globus python script first" - exit 1 + echo "File does not exist. $CRED_FILE_PATH" + echo "run the Globus python script first" + exit 1 fi GATEWAY_NAME="${DATAFED_GCS_ROOT_NAME} Storage Gateway" COLLECTION_NAME="${DATAFED_GCS_ROOT_NAME} Collection Mapped" GUEST_COLLECTION_NAME="${DATAFED_GCS_ROOT_NAME} Collection Guest" -gateway_line=$( globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" || echo "") +gateway_line=$(globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" || echo "") echo "$DATAFED_GLOBUS_REPO_USER" -cat << EOF > mapping.json +cat <mapping.json { "DATA_TYPE": "expression_identity_mapping#1.0.0", "mappings": [ @@ -85,25 +79,24 @@ EOF # from the domain DOMAINS="--domain $DATAFED_GLOBUS_ALLOWED_DOMAINS --domain clients.auth.globus.org" -echo "{" > path_restriction.json -echo " \"DATA_TYPE\": \"path_restrictions#1.0.0\"," >> path_restriction.json -echo " \"read_write\": [\"${DATAFED_GCS_COLLECTION_ROOT_PATH}/${DATAFED_REPO_ID_AND_DIR}\"]" >> path_restriction.json -echo "}" >> path_restriction.json +echo "{" >path_restriction.json +echo " \"DATA_TYPE\": \"path_restrictions#1.0.0\"," >>path_restriction.json +echo " \"read_write\": [\"${DATAFED_GCS_COLLECTION_ROOT_PATH}/${DATAFED_REPO_ID_AND_DIR}\"]" >>path_restriction.json +echo "}" >>path_restriction.json -if [ -z "$gateway_line" ] -then -# Check if it already exists +if [ -z "$gateway_line" ]; then + # Check if it already exists globus-connect-server storage-gateway create posix \ "$GATEWAY_NAME" \ - ${DOMAINS} \ + ${DOMAINS} \ --restrict-paths file:path_restriction.json \ --identity-mapping file:mapping.json else spaces_in_name=$(echo $GATEWAY_NAME | awk '{print gsub("[ \t]",""); exit}') - columns=$(( $spaces_in_name + 3 )) - uuid_of_storage_gateway=$( globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" | awk -v col=$columns '{ print $col }') + columns=$(($spaces_in_name + 3)) + uuid_of_storage_gateway=$(globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" | awk -v col=$columns '{ print $col }') globus-connect-server storage-gateway update posix \ "$uuid_of_storage_gateway" \ @@ -117,22 +110,20 @@ fi mkdir -p "${DATAFED_GCS_COLLECTION_ROOT_PATH}/${DATAFED_REPO_ID_AND_DIR}/user" mkdir -p "${DATAFED_GCS_COLLECTION_ROOT_PATH}/${DATAFED_REPO_ID_AND_DIR}/project" -collection_line=$( globus-connect-server collection list | grep "$COLLECTION_NAME" || echo "") +collection_line=$(globus-connect-server collection list | grep "$COLLECTION_NAME" || echo "") spaces_in_name=$(echo $GATEWAY_NAME | awk '{print gsub("[ \t]",""); exit}') -columns=$(( $spaces_in_name + 3 )) -uuid_of_storage_gateway=$( globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" | awk -v col=$columns '{ print $col }') +columns=$(($spaces_in_name + 3)) +uuid_of_storage_gateway=$(globus-connect-server storage-gateway list | grep "$GATEWAY_NAME" | awk -v col=$columns '{ print $col }') # If not empty extra_collection_arg="" -if [ -n "${DATAFED_GLOBUS_SUBSCRIPTION}" ] -then +if [ -n "${DATAFED_GLOBUS_SUBSCRIPTION}" ]; then globus-connect-server endpoint set-subscription-id "${DATAFED_GLOBUS_SUBSCRIPTION}" extra_collection_arg="--allow-guest-collections" fi -if [ -z "$collection_line" ] -then +if [ -z "$collection_line" ]; then # NOTE enable-anonymous-writes is allowed without a subscription # NOTE allow-guest-collections requires a subscription @@ -145,7 +136,7 @@ then --disable-https "$extra_collection_arg" else - uuid_of_collection=$( globus-connect-server collection list | grep "$COLLECTION_NAME" | awk '{ print $1 }') + uuid_of_collection=$(globus-connect-server collection list | grep "$COLLECTION_NAME" | awk '{ print $1 }') # NOTE enable-anonymous-writes is allowed without a subscription # NOTE allow-guest-collections requires a subscription globus-connect-server collection update \ diff --git a/scripts/install_authz_dependencies.sh b/scripts/install_authz_dependencies.sh deleted file mode 100755 index 21839870e..000000000 --- a/scripts/install_authz_dependencies.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/..) - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -packages=("host" "libtool" "build-essential" "g++" "gcc" "autoconf" - "automake" "make" "git" "pkg-config" - "libglobus-common-dev" "wget" "jq" "sudo" "libboost-all-dev" "python${DATAFED_PYTHON_VERSION}" "python${DATAFED_PYTHON_VERSION}-venv" "libgssapi-krb5-2") -pip_packages=("setuptools" "distro" "jwt" "globus_sdk") -externals=("cmake" "protobuf" "libsodium" "libzmq" ) - -install_python - -local_UNIFY=false - -if [ $# -eq 1 ]; then - case "$1" in - -h|--help) - # If -h or --help is provided, print help - echo "Usage: $0 [-h|--help] [unify]" - ;; - unify) - # If 'unify' is provided, print the packages - # The extra space is necessary to not conflict with the other install scripts - echo -n "${packages[@]} " >> "$apt_file_path" - echo -n "${pip_packages[@]} " >> "$pip_file_path" - echo -n "${externals[@]} " >> "$ext_file_path" - local_UNIFY=true - ;; - *) - echo "Invalid Argument" - ;; - esac -fi - - -if [[ $local_UNIFY = false ]]; then - sudo_command - - "$SUDO_CMD" apt-get update - "$SUDO_CMD" dpkg --configure -a - "$SUDO_CMD" apt-get install -y "${packages[@]}" - init_python - source "${DATAFED_PYTHON_ENV}/bin/activate" - "python${DATAFED_PYTHON_VERSION}" -m pip install "${pip_packages[@]}" - - for ext in "${externals[@]}"; do - install_dep_by_name "$ext" - done -fi diff --git a/scripts/install_client_dependencies.sh b/scripts/install_client_dependencies.sh deleted file mode 100755 index 0638f87ff..000000000 --- a/scripts/install_client_dependencies.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath "${SOURCE}/..") - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -packages=("pkg-config" "python${DATAFED_PYTHON_VERSION}" "python${DATAFED_PYTHON_VERSION}-venv") -pip_packages=("setuptools") - -install_python - -sudo_command -# This script will install all of the dependencies needed by DataFed 1.0 -"$SUDO_CMD" apt-get update -"$SUDO_CMD" dpkg --configure -a -"$SUDO_CMD" apt-get install -y "${packages[@]}" - -init_python -source "${DATAFED_PYTHON_ENV}/bin/activate" -"python${DATAFED_PYTHON_VERSION}" -m pip install "${pip_packages[@]}" -"python${DATAFED_PYTHON_VERSION}" -m pip install -r "${PROJECT_ROOT}/python/datafed_pkg/requirements.txt" - -install_protobuf -cd ~ - diff --git a/scripts/install_core.sh b/scripts/install_core.sh index 2781f4dd9..c91e66ee6 100755 --- a/scripts/install_core.sh +++ b/scripts/install_core.sh @@ -15,10 +15,8 @@ mkdir -p "${DATAFED_DEFAULT_LOG_PATH}" # Copy configuration files cp "$PROJECT_ROOT/config/datafed-core.cfg" "${DATAFED_INSTALL_PATH}/core" - # Move keys to Default:/opt/datafed/keys if they do not already exist -if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.priv" ] -then +if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.priv" ]; then # Generate keys echo "No keys for core server were detected in ${DATAFED_INSTALL_PATH}/keys/ creating them" "${DATAFED_INSTALL_PATH}/core/datafed-core" --gen-keys diff --git a/scripts/install_core_dependencies.sh b/scripts/install_core_dependencies.sh deleted file mode 100755 index bf7ea6316..000000000 --- a/scripts/install_core_dependencies.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/..) - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -packages=("libtool" "build-essential" "g++" "gcc" "make" "libboost-all-dev" "pkg-config" "autoconf" "automake" "unzip" "wget" "rapidjson-dev" "libkrb5-dev" "git" "python${DATAFED_PYTHON_VERSION}" "python${DATAFED_PYTHON_VERSION}-venv") -pip_packages=("setuptools") -# NOTE the order matters here -externals=("cmake" "nlohmann_json" "json_schema_validator" "protobuf" - "libsodium" "libzmq" "libopenssl" "zlib" "libcurl") - -install_python - -local_UNIFY=false - -if [ $# -eq 1 ]; then - case "$1" in - -h|--help) - # If -h or --help is provided, print help - echo "Usage: $0 [-h|--help] [unify]" - ;; - unify) - # If 'unify' is provided, print the packages - # The extra space is necessary to not conflict with the other install scripts - echo -n "${packages[@]} " >> "$apt_file_path" - echo -n "${externals[@]} " >> "$ext_file_path" - echo -n "${pip_packages[@]} " >> "$pip_file_path" - local_UNIFY=true - ;; - *) - echo "Invalid Argument" - ;; - esac -fi - - -if [[ $local_UNIFY = false ]]; then - sudo_command - "$SUDO_CMD" apt-get update - "$SUDO_CMD" dpkg --configure -a - "$SUDO_CMD" apt-get install -y "${packages[@]}" - init_python - source "${DATAFED_PYTHON_ENV}/bin/activate" - "python${DATAFED_PYTHON_VERSION}" -m pip install --upgrade pip - "python${DATAFED_PYTHON_VERSION}" -m pip install "${pip_packages[@]}" - - for ext in "${externals[@]}"; do - install_dep_by_name "$ext" - done -fi diff --git a/scripts/install_dependencies.sh b/scripts/install_dependencies.sh deleted file mode 100755 index 0fbdacdbe..000000000 --- a/scripts/install_dependencies.sh +++ /dev/null @@ -1,140 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/..) - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" -source "${SOURCE}/dependency_versions.sh" - -Help() -{ - echo $(basename "$0")" Will install all datafed dependencies" - echo - echo "Syntax: "$(basename "$0")" [-h|a|w|c|r]" - echo "options:" - echo "-h, --help Print this help message" - echo "-a, --disable-arango-deps-install Don't install arango" - echo "-w, --disable-web-deps-install Don't install web deps" - echo "-c, --disable-core-deps-install Don't install core deps" - echo "-r, --disable-repo-deps-install Don't install repo deps" - echo "-z, --disable-authz-deps-install Don't install authz deps" -} - -local_INSTALL_ARANGO="TRUE" -local_INSTALL_WEB="TRUE" -local_INSTALL_CORE="TRUE" -local_INSTALL_REPO="TRUE" -local_INSTALL_AUTHZ="TRUE" - -VALID_ARGS=$(getopt -o hawcrz --long 'help',disable-arango-deps-install,disable-web-deps-install,disable-core-deps-install,disable-repo-debs-install,disable-authz-deps-install -- "$@") -if [[ $? -ne 0 ]]; then - exit 1; -fi -eval set -- "$VALID_ARGS" -while [ : ]; do - case "$1" in - -h | --help) - Help - exit 0 - ;; - -a | --disable-arango-deps-install) - local_INSTALL_ARANGO="FALSE" - shift - ;; - -w | --disable-web-deps-install) - local_INSTALL_WEB="FALSE" - shift - ;; - -c | --disable-core-deps-install) - local_INSTALL_CORE="FALSE" - shift - ;; - -r | --disable-repo-deps-install) - local_INSTALL_REPO="FALSE" - shift - ;; - -z | --disable-authz-deps-install) - local_INSTALL_AUTHZ="FALSE" - shift - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; - esac -done - -sudo_command - -touch "$apt_file_path" -touch "$ext_file_path" -touch "$pip_file_path" - -# Defines SUDO_CMD which is empty if root -# sudo path if exists -# throws error otherwise - -"$SUDO_CMD" apt-get update -"$SUDO_CMD" apt install -y wget git curl - -# This script will install all of the dependencies needed by DataFed 1.0 -"$SUDO_CMD" dpkg --configure -a - -if [ "$local_INSTALL_CORE" == "TRUE" ] -then - "$SUDO_CMD" "$SOURCE/install_core_dependencies.sh" unify -fi -if [ "$local_INSTALL_REPO" == "TRUE" ] -then - "$SUDO_CMD" "$SOURCE/install_repo_dependencies.sh" unify -fi -if [ "$local_INSTALL_WEB" == "TRUE" ] -then - "$SUDO_CMD" "$SOURCE/install_ws_dependencies.sh" unify -fi -if [ "$local_INSTALL_AUTHZ" == "TRUE" ] -then - "$SUDO_CMD" "$SOURCE/install_authz_dependencies.sh" unify -fi -"$SUDO_CMD" "$SOURCE/install_docs_dependencies.sh" unify - -all_packages=$(cat "$apt_file_path") -IFS=' ' read -r -a all_packages_array <<< "$all_packages" -deduplicated_packages_array=($(printf "%s\n" "${all_packages_array[@]}" | sort -u)) -echo "DEPENDENCIES (${deduplicated_packages_array[@]})" -"$SUDO_CMD" apt-get install -y "${deduplicated_packages_array[@]}" - -all_pip_packages=$(cat "$pip_file_path") -IFS=' ' read -ra all_pip_packages_array <<< "$all_pip_packages" -if [ ${#all_pip_packages_array[@]} -gt 0 ]; then - echo "DEPENDENCIES (${all_pip_packages_array[@]})" - init_python - source "${DATAFED_PYTHON_ENV}/bin/activate" - "python${DATAFED_PYTHON_VERSION}" -m pip install "${all_pip_packages_array[@]}" -fi - -all_externals=$(cat "$ext_file_path") -IFS=' ' read -r -a all_externals_array <<< "$all_externals" -# Deduplication must preserve order -deduplicated_externals_array=($(echo "${all_externals_array[@]}" | awk '{ for (i=1;i<=NF;i++) if (!seen[$i]++) printf("%s ", $i) }')) -echo "DEPENDENCIES (${deduplicated_externals_array[@]})" -for ext in "${deduplicated_externals_array[@]}"; do - echo "===== INSTALLING $ext ======" - install_dep_by_name "$ext" -done - -rm "$apt_file_path" -rm "$ext_file_path" -rm "$pip_file_path" - -if [ "$local_INSTALL_ARANGO" == "TRUE" ] -then - install_arangodb -fi diff --git a/scripts/install_docker_dependencies.sh b/scripts/install_docker_dependencies.sh deleted file mode 100755 index 3129b2ab7..000000000 --- a/scripts/install_docker_dependencies.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -# This script will install all of the dependencies needed by DataFed 1.0 -sudo apt-get update -sudo dpkg --configure -a - -sudo apt-get install \ - ca-certificates \ - curl \ - gnupg \ - lsb-release - -sudo mkdir -p /etc/apt/keyrings -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg - -echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ - $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - -sudo apt-get update -sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin diff --git a/scripts/install_docs_dependencies.sh b/scripts/install_docs_dependencies.sh deleted file mode 100755 index 179382bad..000000000 --- a/scripts/install_docs_dependencies.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/..) - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -packages=("g++" "gcc" "make" "pkg-config" "python${DATAFED_PYTHON_VERSION}" "python${DATAFED_PYTHON_VERSION}-venv") -externals=("cmake" "protobuf") -pip_packages=("setuptools" "sphinx" "sphinx-rtd-theme" "sphinx-autoapi") - -local_UNIFY=false - -if [ $# -eq 1 ]; then - case "$1" in - -h|--help) - # If -h or --help is provided, print help - echo "Usage: $0 [-h|--help] [unify]" - ;; - unify) - # If 'unify' is provided, print the packages - # The extra space is necessary to not conflict with the other install scripts - echo -n "${packages[@]} " >> "$apt_file_path" - echo -n "${pip_packages[@]} " >> "$pip_file_path" - echo -n "${externals[@]} " >> "$ext_file_path" - local_UNIFY=true - ;; - *) - echo "Invalid Argument" - ;; - esac -fi - - -if [[ $local_UNIFY = false ]]; then - sudo_command - "$SUDO_CMD" apt-get update - "$SUDO_CMD" dpkg --configure -a - "$SUDO_CMD" apt-get install -y "${packages[@]}" - init_python - source "${DATAFED_PYTHON_ENV}/bin/activate" - "python${DATAFED_PYTHON_VERSION}" -m pip install --upgrade pip - "python${DATAFED_PYTHON_VERSION}" -m pip install "${pip_packages[@]}" - - for ext in "${externals[@]}"; do - install_dep_by_name "$ext" - done -fi - diff --git a/scripts/install_end_to_end_test_dependencies.sh b/scripts/install_end_to_end_test_dependencies.sh deleted file mode 100755 index ea1e5bddf..000000000 --- a/scripts/install_end_to_end_test_dependencies.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/..) - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -packages=("libtool" "build-essential" "g++" "gcc" "make" "libboost-all-dev" "pkg-config" "autoconf" "automake" "unzip" "libcurl4-openssl-dev" "wget" - "rapidjson-dev" "libkrb5-dev" "git" "python${DATAFED_PYTHON_VERSION}" "python${DATAFED_PYTHON_VERSION}-venv" "libssl-dev") - - -pip_packages=("setuptools") -# NOTE the order matters here -externals=("cmake" "protobuf" "nvm" "node" "foxx") - -local_UNIFY=false - -if [ $# -eq 1 ]; then - case "$1" in - -h|--help) - # If -h or --help is provided, print help - echo "Usage: $0 [-h|--help] [unify]" - ;; - unify) - # If 'unify' is provided, print the packages - # The extra space is necessary to not conflict with the other install scripts - echo -n "${packages[@]} " >> "$apt_file_path" - echo -n "${externals[@]} " >> "$ext_file_path" - echo -n "${pip_packages[@]} " >> "$pip_file_path" - local_UNIFY=true - ;; - *) - echo "Invalid Argument" - ;; - esac -fi - -if [[ $local_UNIFY = false ]]; then - sudo_command - "$SUDO_CMD" apt-get update - "$SUDO_CMD" dpkg --configure -a - "$SUDO_CMD" apt-get install -y "${packages[@]}" - init_python - source "${DATAFED_PYTHON_ENV}/bin/activate" - "python${DATAFED_PYTHON_VERSION}" -m pip install --upgrade pip - "python${DATAFED_PYTHON_VERSION}" -m pip install "${pip_packages[@]}" - - for ext in "${externals[@]}"; do - install_dep_by_name "$ext" - done -fi diff --git a/scripts/install_foxx.sh b/scripts/install_foxx.sh index 75ea608c6..88a35125b 100755 --- a/scripts/install_foxx.sh +++ b/scripts/install_foxx.sh @@ -2,9 +2,9 @@ # History # -# -e has been added back, password file deletion should be handled by another -# means such as the CI after script section. If the API fails to install, it -# could lead to improper testing the CI env. +# -e has been added back, password file deletion should be handled by another +# means such as the CI after script section. If the API fails to install, it +# could lead to improper testing the CI env. # # -e has been removed so that if an error occurs the PASSWORD File is deleted # and not left lying around @@ -15,13 +15,12 @@ set -ef -o pipefail SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/..) -source "${PROJECT_ROOT}/config/datafed.sh" -source "${SOURCE}/dependency_versions.sh" -source "${SOURCE}/dependency_install_functions.sh" +DATAFED_PROJECT_ROOT=$(realpath ${SOURCE}/..) +source "${DATAFED_PROJECT_ROOT}/config/datafed.sh" +source "${DATAFED_PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_versions.sh" +source "${DATAFED_PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_install_functions.sh" -Help() -{ +Help() { echo "$(basename $0) Will set up a configuration file for the core server" echo echo "Syntax: $(basename $0) [-h|u|f|p|i|y]" @@ -38,243 +37,248 @@ Help() echo " database, the env variable: " echo " DATAFED_DATABASE_HOST can also be " echo " used." - echo "-y, --system-secret ZeroMQ system secret" echo echo "NOTE: Do not run this script with sudo!" + echo + echo "NOTE: This script respects the SSL_CERT_FILE env variable, which can " + echo "be used to communicate over https:// ssl:// for certificates that may" + echo "not be registered in the certificate store." } +local_DATABASE_API_SCHEME="${DATABASE_API_SCHEME:-http}" +local_SSL_CERT_FILE="${SSL_CERT_FILE:-}" +local_ARANGOSH_SERVER_ENDPOINT_SCHEME="tcp" +local_CURL_SSL_ARG="" +NODE_EXTRA_CA_CERTS="" +if [[ ! -z "${local_SSL_CERT_FILE}" ]]; then + if [ -f "${local_SSL_CERT_FILE}" ]; then + echo "" + echo "INFO - Found ssl certificates for arango! Building with https." + echo "${local_SSL_CERT_FILE}" + echo "" + # Only run if defined and not empty, API_SCHEME must be https in this case + local_DATABASE_API_SCHEME="https" + local_CURL_SSL_ARG="--cacert $local_SSL_CERT_FILE" + # So foxx will trust the certificate + export NODE_EXTRA_CA_CERTS="$local_SSL_CERT_FILE" + else + echo "" + echo "WARNING - SSL_CERT_FILE is defined but the file does not exist! Assuming," + echo " communication with the database will be over http not https." + echo "$local_SSL_CERT_FILE" + echo "" + fi +fi + local_DATABASE_NAME="sdms" local_DATABASE_USER="root" local_DATABASE_PORT="8529" -if [ -z "${DATAFED_DATABASE_PASSWORD}" ] -then +if [ -z "${DATAFED_DATABASE_PASSWORD}" ]; then local_DATAFED_DATABASE_PASSWORD="" else local_DATAFED_DATABASE_PASSWORD=$(printenv DATAFED_DATABASE_PASSWORD) fi -if [ -z "${DATAFED_ZEROMQ_SYSTEM_SECRET}" ] -then - local_DATAFED_ZEROMQ_SYSTEM_SECRET="" -else - local_DATAFED_ZEROMQ_SYSTEM_SECRET=$(printenv DATAFED_ZEROMQ_SYSTEM_SECRET) -fi - -if [ -z "${FOXX_MAJOR_API_VERSION}" ] -then - local_FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs ) +if [ -z "${FOXX_MAJOR_API_VERSION}" ]; then + local_FOXX_MAJOR_API_VERSION=$(cat ${DATAFED_PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs) else local_FOXX_MAJOR_API_VERSION=$(printenv FOXX_MAJOR_API_VERSION) fi - -if [ -z "${DATAFED_DATABASE_HOST}" ] -then +if [ -z "${DATAFED_DATABASE_HOST}" ]; then local_DATAFED_DATABASE_HOST="localhost" else local_DATAFED_DATABASE_HOST=$(printenv DATAFED_DATABASE_HOST) fi - -VALID_ARGS=$(getopt -o hu:p:f:i:y: --long 'help',database-user:,database-password:,foxx-api-major-version:,database-host:,zeromq-system-secret: -- "$@") +VALID_ARGS=$(getopt -o hu:p:f:i: --long 'help',database-user:,database-password:,foxx-api-major-version:,database-host: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -u | --database-user) - echo "Processing 'Database user' option. Input argument is '$2'" - local_DATABASE_USER=$2 - shift 2 - ;; - -p | --database-password) - echo "Processing 'Database password' option. Input argument is '$2'" - local_DATAFED_DATABASE_PASSWORD=$2 - shift 2 - ;; - -f | --foxx-api-major-version) - echo "Processing 'Foxx major api version' option. Input argument is '$2'" - local_FOXX_MAJOR_API_VERSION=$2 - shift 2 - ;; - -i | --database-host) - echo "Processing 'database host' option. Input argument is '$2'" - local_DATAFED_DATABASE_HOST=$2 - shift 2 - ;; - -y | --zeromq-system-secret) - echo "Processing 'DataFed ZeroMQ system secret' option. Input argument is '$2'" - local_DATAFED_ZEROMQ_SYSTEM_SECRET=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -u | --database-user) + local_DATABASE_USER=$2 + shift 2 + ;; + -p | --database-password) + local_DATAFED_DATABASE_PASSWORD=$2 + shift 2 + ;; + -f | --foxx-api-major-version) + local_FOXX_MAJOR_API_VERSION=$2 + shift 2 + ;; + -i | --database-host) + local_DATAFED_DATABASE_HOST=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "ERROR - Invalid option" + exit + ;; esac done ERROR_DETECTED=0 -if [ -z "$local_DATAFED_DATABASE_PASSWORD" ] -then - echo "Error DATAFED_DATABASE_PASSWORD is not defined, this is a required argument" - echo " This variable can be set using the command line option -p, --database-password" - echo " or with the environment variable DATAFED_DATABASE_PASSWORD." +if [ -z "$local_DATAFED_DATABASE_PASSWORD" ]; then + echo "ERROR - DATAFED_DATABASE_PASSWORD is not defined, this is a required argument" + echo " This variable can be set using the command line option -p, --database-password" + echo " or with the environment variable DATAFED_DATABASE_PASSWORD." ERROR_DETECTED=1 fi -if [ -z "$local_DATAFED_ZEROMQ_SYSTEM_SECRET" ] -then - echo "Error DATAFED_ZEROMQ_SYSTEM_SECRET is not defined, this is a required argument" - echo " This variable can be set using the command line option -y, --zeromq-session-secret" - echo " or with the environment variable DATAFED_ZEROMQ_SYSTEM_SECRET." - ERROR_DETECTED=1 -fi - -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi basic_auth="$local_DATABASE_USER:$local_DATAFED_DATABASE_PASSWORD" -url="http://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}/_api/database/user" + +if [ "${local_DATABASE_API_SCHEME}" == "https" ]; then + set +e + output=$(LD_LIBRARY_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}:$LD_LIBRARY_PATH" curl ${local_CURL_SSL_ARG} --user "$basic_auth" ${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT} 2>&1) + error_code="$?" + set -e + + if [ "$error_code" == "60" ]; then + echo "ERROR - Untrusted certificate detected of address ${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" + echo "$output" + exit 1 + fi + + local_ARANGOSH_SERVER_ENDPOINT_SCHEME="ssl" +fi + +url="${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}/_api/database/user" # Do not output to /dev/null we need the output -code=$(LD_LIBRARY_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}:$LD_LIBRARY_PATH" curl -s -o /dev/null -w "%{http_code}" --user "$basic_auth" "$url") +code=$(LD_LIBRARY_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}:$LD_LIBRARY_PATH" curl ${local_CURL_SSL_ARG} -s -o /dev/null -w "%{http_code}" --user "$basic_auth" "$url") if [[ "$code" != "200" ]]; then - echo "Error detected in attempting to connect to database at $url" - echo "HTTP code is: $code" + echo "ERROR - Attempting to connect to database at $url" + echo " HTTP code is: $code" exit 1 fi -url2="http://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}/_api/database" +url2="${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}/_api/database" # We are now going to initialize the DataFed database in Arango, but only if sdms database does # not exist -output=$(LD_LIBRARY_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}:$LD_LIBRARY_PATH" curl -s -i --user "$basic_auth" "$url2") - -echo "Output: $output" +output=$(LD_LIBRARY_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}:$LD_LIBRARY_PATH" curl ${local_CURL_SSL_ARG} -s -i --user "$basic_auth" "$url2") if [[ "$output" == "" ]]; then - echo "curl command failed $url2 exiting" + echo "ERROR - curl command failed $url2 exiting" exit 1 fi - if [[ "$output" =~ .*"sdms".* ]]; then - echo "SDMS already exists do nothing" + echo "INFO - SDMS already exists do nothing." else - echo "Creating SDMS" - arangosh --server.endpoint \ - "tcp://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ + echo "INFO - Creating SDMS" + arangosh --server.endpoint \ + "${local_ARANGOSH_SERVER_ENDPOINT_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ --server.password "${local_DATAFED_DATABASE_PASSWORD}" \ --server.username "${local_DATABASE_USER}" \ - --javascript.execute "${PROJECT_ROOT}/core/database/foxx/db_create.js" + --javascript.execute "${DATAFED_PROJECT_ROOT}/core/database/foxx/db_create.js" # Give time for the database to be created sleep 2 - arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ + arangosh --server.endpoint "${local_ARANGOSH_SERVER_ENDPOINT_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ --server.password "${local_DATAFED_DATABASE_PASSWORD}" \ --server.username "${local_DATABASE_USER}" \ --javascript.execute-string 'db._useDatabase("sdms"); db.config.insert({"_key": "msg_daily", "msg" : "DataFed servers will be off-line for regular maintenance every Sunday night from 11:45 pm until 12:15 am EST Monday morning."}, {overwrite: true});' - arangosh --server.endpoint "tcp://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ + arangosh --server.endpoint "${local_ARANGOSH_SERVER_ENDPOINT_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ --server.password "${local_DATAFED_DATABASE_PASSWORD}" \ --server.username "${local_DATABASE_USER}" \ - --javascript.execute-string "db._useDatabase(\"sdms\"); db.config.insert({ \"_key\": \"system\", \"_id\": \"config/system\", \"secret\": \"${local_DATAFED_ZEROMQ_SYSTEM_SECRET}\"}, {overwrite: true } );" + --javascript.execute-string "db._useDatabase(\"sdms\"); db.config.insert({ \"_key\": \"system\", \"_id\": \"config/system\"}, {overwrite: true } );" fi # There are apparently 3 different ways to deploy Foxx microservices, # Using curl with http requests -# Using the Arango web ui +# Using the Arango web ui # Using node module # -# The web deployment requires manual interaction, and I could not figure out the +# The web deployment requires manual interaction, and I could not figure out the # syntax for the REST http endpoints with curl so we are going to try the node module # 1. Install nvm which will allow us to update node -echo "Installing nvm" +echo "INFO - Installing nvm" install_nvm -echo "Installing node" +echo "INFO - Installing node" install_node -echo "Installing foxx_cli" +echo "INFO - Installing foxx_cli" install_foxx_cli FOXX_PREFIX="" -if ! command -v foxx > /dev/null 2>&1; then - FOXX_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/" +if ! command -v foxx >/dev/null 2>&1; then + FOXX_PREFIX="${DATAFED_DEPENDENCIES_INSTALL_PATH}/npm/bin/" fi -echo "${local_DATAFED_DATABASE_PASSWORD}" > "${SOURCE}/database_temp.password" +echo "${local_DATAFED_DATABASE_PASSWORD}" >"${SOURCE}/database_temp.password" PATH_TO_PASSWD_FILE="${SOURCE}/database_temp.password" -echo "Path to PASSWRD file ${PATH_TO_PASSWD_FILE} passwd is $local_DATAFED_DATABASE_PASSWORD" -echo "$local_DATAFED_DATABASE_PASSWORD" > "${PATH_TO_PASSWD_FILE}" +echo "$local_DATAFED_DATABASE_PASSWORD" >"${PATH_TO_PASSWD_FILE}" { # try # Check if database foxx services have already been installed existing_services=$("${FOXX_PREFIX}foxx" list \ - --server "http://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ + --server "${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ -a -u "$local_DATABASE_USER" \ -p "${PATH_TO_PASSWD_FILE}" \ --database "$local_DATABASE_NAME") FOUND_API=$(echo "$existing_services" | grep "/api/${local_FOXX_MAJOR_API_VERSION}") - INSTALL_API="FALSE" FOUND_API=$(echo "$existing_services" | grep "/api/${local_FOXX_MAJOR_API_VERSION}") - echo "$FOUND_API" - - RESULT=$(LD_LIBRARY_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}:$LD_LIBRARY_PATH" curl -s http://${local_DATAFED_DATABASE_HOST}:8529/_db/sdms/api/${local_FOXX_MAJOR_API_VERSION}/version) - CODE=$(echo "${RESULT}" | jq '.code' ) - echo "Code is $CODE" - if [ -z "${FOUND_API}" ] - then - INSTALL_API="TRUE" - elif [ "$CODE" == "503" ] - then - INSTALL_API="TRUE" + RESULT=$(LD_LIBRARY_PATH="${DATAFED_DEPENDENCIES_INSTALL_PATH}:$LD_LIBRARY_PATH" curl ${local_CURL_SSL_ARG} -s ${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}/_db/sdms/api/${local_FOXX_MAJOR_API_VERSION}/version) + CODE=$(echo "${RESULT}" | jq '.code') + if [ -z "${FOUND_API}" ]; then + echo "INFO - API found at ${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}/_db/sdms/api/${local_FOXX_MAJOR_API_VERSION}/version" + INSTALL_API="TRUE" + elif [ "$CODE" == "503" ]; then + echo "WARNING - $CODE returned, attempting to remove api at /api/${local_FOXX_MAJOR_API_VERSION}" + INSTALL_API="TRUE" # Remove the api at this point - # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint + # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint "${FOXX_PREFIX}foxx" remove \ "/api/${local_FOXX_MAJOR_API_VERSION}" \ - --server "http://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ + --server "${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ -u "${local_DATABASE_USER}" \ -p "${PATH_TO_PASSWD_FILE}" \ --database "${local_DATABASE_NAME}" fi - echo "$RESULT" - if [ "${INSTALL_API}" == "TRUE" ] - then - # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint + if [ "${INSTALL_API}" == "TRUE" ]; then + echo "INFO - Installing arango foxx services at /api/${local_FOXX_MAJOR_API_VERSION}" + # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint "${FOXX_PREFIX}foxx" install \ - --server "http://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ + --server "${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ -u "${local_DATABASE_USER}" \ -p "${PATH_TO_PASSWD_FILE}" \ --database "${local_DATABASE_NAME}" \ "/api/${local_FOXX_MAJOR_API_VERSION}" \ - "${PROJECT_ROOT}/core/database/foxx/" + "${DATAFED_PROJECT_ROOT}/core/database/foxx/" else - echo "DataFed Foxx Services have already been uploaded, replacing to ensure consisency" - # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint + echo "INFO - Replacing arango foxx services at /api/${local_FOXX_MAJOR_API_VERSION}" + # WARNING Foxx and arangosh arguments differ --server is used for Foxx not --server.endpoint "${FOXX_PREFIX}foxx" replace \ - --server "http://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ + --server "${local_DATABASE_API_SCHEME}://${local_DATAFED_DATABASE_HOST}:${local_DATABASE_PORT}" \ -u "${local_DATABASE_USER}" \ -p "${PATH_TO_PASSWD_FILE}" \ --database "${local_DATABASE_NAME}" \ - "/api/${local_FOXX_MAJOR_API_VERSION}" "${PROJECT_ROOT}/core/database/foxx/" - echo "foxx replace -u ${local_DATABASE_USER} -p ${PATH_TO_PASSWD_FILE} --database ${local_DATABASE_NAME} /api/${local_FOXX_MAJOR_API_VERSION} ${PROJECT_ROOT}/core/database/foxx" + "/api/${local_FOXX_MAJOR_API_VERSION}" "${DATAFED_PROJECT_ROOT}/core/database/foxx/" fi rm "${PATH_TO_PASSWD_FILE}" } || { # catch + echo "ERROR - Unexpected error encountered!" rm "${PATH_TO_PASSWD_FILE}" } - diff --git a/scripts/install_gcs.sh b/scripts/install_gcs.sh deleted file mode 100755 index dea94d8c7..000000000 --- a/scripts/install_gcs.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -euf -o pipefail - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath "${SOURCE}/..") -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -install_gcs diff --git a/scripts/install_lego_and_certificates.sh b/scripts/install_lego_and_certificates.sh index dc475e3c6..44ed61c8d 100755 --- a/scripts/install_lego_and_certificates.sh +++ b/scripts/install_lego_and_certificates.sh @@ -6,10 +6,9 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/..") source "${PROJECT_ROOT}/config/datafed.sh" -source "${PROJECT_ROOT}/scripts/utils.sh" +source "${PROJECT_ROOT}/external/DataFedDependencies/scripts/utils.sh" -Help() -{ +Help() { echo "$(basename $0) Will install lego and use Let's Encrypt to create certificates." echo echo "Syntax: $(basename $0) [-h|d|e]" @@ -21,15 +20,13 @@ Help() echo "-e, --email The email address associated with the certificates." } -if [ -z "$DATAFED_LEGO_EMAIL" ] -then +if [ -z "$DATAFED_LEGO_EMAIL" ]; then local_DATAFED_LEGO_EMAIL="" else local_DATAFED_LEGO_EMAIL=$(printenv DATAFED_LEGO_EMAIL) fi -if [ -z "$DATAFED_DOMAIN" ] -then +if [ -z "$DATAFED_DOMAIN" ]; then local_DATAFED_DOMAIN="datafed.ornl.gov" else local_DATAFED_DOMAIN=$(printenv DATAFED_DOMAIN) @@ -37,45 +34,45 @@ fi VALID_ARGS=$(getopt -o hd:e: --long 'help',domain:,email: -- "$@") if [[ $? -ne 0 ]]; then - exit 1; + exit 1 fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in - -h | --help) - Help - exit 0 - ;; - -e | --email) - echo "Processing 'email' option. Input argument is '$2'" - local_DATAFED_LEGO_EMAIL=$2 - shift 2 - ;; - -d | --domain) - echo "Processing 'domain' option. Input argument is '$2'" - local_DATAFED_DOMAIN=$2 - shift 2 - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; + -h | --help) + Help + exit 0 + ;; + -e | --email) + echo "Processing 'email' option. Input argument is '$2'" + local_DATAFED_LEGO_EMAIL=$2 + shift 2 + ;; + -d | --domain) + echo "Processing 'domain' option. Input argument is '$2'" + local_DATAFED_DOMAIN=$2 + shift 2 + ;; + --) + shift + break + ;; + \?) # incorrect option + echo "Error: Invalid option" + exit + ;; esac done ERROR_DETECTED=0 -if [ -z "$local_DATAFED_LEGO_EMAIL" ] -then +if [ -z "$local_DATAFED_LEGO_EMAIL" ]; then echo "Error DATAFED_LEGO_EMAIL is not defined, this is a required argument" echo " This variable can be set using the command line option -e, --email" echo " or with the environment variable DATAFED_LEGO_EMAIL." ERROR_DETECTED=1 fi -if [ "$ERROR_DETECTED" == "1" ] -then +if [ "$ERROR_DETECTED" == "1" ]; then exit 1 fi @@ -90,9 +87,8 @@ export GO111MODULE=on GOBIN=/usr/local/bin/ go install github.com/go-acme/lego/v4/cmd/lego@latest # Create the folder -if [ ! -d "${DATAFED_INSTALL_PATH}/keys" ] -then - "$SUDO_CMD" mkdir -p "${DATAFED_INSTALL_PATH}/keys" +if [ ! -d "${DATAFED_INSTALL_PATH}/keys" ]; then + "$SUDO_CMD" mkdir -p "${DATAFED_INSTALL_PATH}/keys" fi # Check if the datafed-ws server is already running, will need to stop it if we want @@ -110,11 +106,10 @@ datafed_ws_service=$(systemctl list-unit-files --type service | grep datafed-ws # NOTE: Will only run if one of the necessary certificate files is missing cert_file="datafed-server-test.ornl.gov.crt" key_file="datafed-server-test.ornl.gov.key" -if [ ! -f "${DATAFED_INSTALL_PATH}/keys/$cert_file" ] || [ ! -f "${DATAFED_INSTALL_PATH}/keys/$key_file" ] -then - "$SUDO_CMD" lego --accept-tos --email="$DATAFED_LEGO_EMAIL" --domains="$local_DATAFED_DOMAIN" --path "${DATAFED_INSTALL_PATH}/keys/" --tls run +if [ ! -f "${DATAFED_INSTALL_PATH}/keys/$cert_file" ] || [ ! -f "${DATAFED_INSTALL_PATH}/keys/$key_file" ]; then + "$SUDO_CMD" lego --accept-tos --email="$DATAFED_LEGO_EMAIL" --domains="$local_DATAFED_DOMAIN" --path "${DATAFED_INSTALL_PATH}/keys/" --tls run mv ${DATAFED_INSTALL_PATH}/keys/certificates/$cert_file ${DATAFED_INSTALL_PATH}/keys/ - mv ${DATAFED_INSTALL_PATH}/keys/certificates/$key_file ${DATAFED_INSTALL_PATH}/keys/ + mv ${DATAFED_INSTALL_PATH}/keys/certificates/$key_file ${DATAFED_INSTALL_PATH}/keys/ rm -rf ${DATAFED_INSTALL_PATH}/keys/certificates rm -rf ${DATAFED_INSTALL_PATH}/keys/accounts else diff --git a/scripts/install_python_client_dependencies.sh b/scripts/install_python_client_dependencies.sh deleted file mode 100755 index aa627e2e5..000000000 --- a/scripts/install_python_client_dependencies.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath "${SOURCE}/..") - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -sudo_command - -# This script will install all of the dependencies needed by DataFed 1.0 -"$SUDO_CMD" apt-get update -"$SUDO_CMD" dpkg --configure -a -"$SUDO_CMD" apt-get install -y libtool build-essential g++ gcc make libboost-all-dev \ -pkg-config autoconf automake unzip libcurl4-openssl-dev wget \ -rapidjson-dev libkrb5-dev git "python${DATAFED_PYTHON_VERSION}" "python${DATAFED_PYTHON_VERSION}-venv" libssl-dev - -cd ~ -install_cmake -cd ~ - -# Install cmake 3.17 - -init_python -source "${DATAFED_PYTHON_ENV}/bin/activate" -"python${DATAFED_PYTHON_VERSION}" -m pip install --upgrade pip -"python${DATAFED_PYTHON_VERSION}" -m pip install setuptools - -install_protobuf -cd ~ - - diff --git a/scripts/install_repo.sh b/scripts/install_repo.sh index 77e448a21..b27354195 100755 --- a/scripts/install_repo.sh +++ b/scripts/install_repo.sh @@ -16,7 +16,6 @@ mkdir -p "${DATAFED_DEFAULT_LOG_PATH}" cp "$PROJECT_ROOT/config/datafed-repo.cfg" "${DATAFED_INSTALL_PATH}/repo" # Generate keys only if they do not exist -if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-repo-key.priv" ] -then +if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-repo-key.priv" ]; then "${DATAFED_INSTALL_PATH}/repo/datafed-repo" --gen-keys --cred-dir "${DATAFED_INSTALL_PATH}/keys" fi diff --git a/scripts/install_repo_dependencies.sh b/scripts/install_repo_dependencies.sh deleted file mode 100755 index 0bff1c7d8..000000000 --- a/scripts/install_repo_dependencies.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/..) - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -packages=("libtool" "wget" "build-essential" "g++" "gcc" "libboost-all-dev" "pkg-config" "autoconf" "automake" "make" "unzip" "git" "python${DATAFED_PYTHON_VERSION}" "python${DATAFED_PYTHON_VERSION}-venv") -pip_packages=("setuptools") -externals=("cmake" "protobuf" "libsodium" "libzmq") - -install_python - -local_UNIFY=false - -if [ $# -eq 1 ]; then - case "$1" in - -h|--help) - # If -h or --help is provided, print help - echo "Usage: $0 [-h|--help] [unify]" - ;; - unify) - # If 'unify' is provided, print the packages - # The extra space is necessary to not conflict with the other install scripts - echo -n "${packages[@]} " >> "$apt_file_path" - echo -n "${externals[@]} " >> "$ext_file_path" - echo -n "${pip_packages[@]} " >> "$pip_file_path" - local_UNIFY=true - ;; - *) - # If any other argument is provided, install the packages - echo "Invalid Argument" - ;; - esac -fi - -sudo_command - -if [[ $local_UNIFY = false ]]; then - "$SUDO_CMD" apt-get update - "$SUDO_CMD" dpkg --configure -a - "$SUDO_CMD" apt-get install -y "${packages[@]}" - - init_python - source "${DATAFED_PYTHON_ENV}/bin/activate" - "python${DATAFED_PYTHON_VERSION}" -m pip install --upgrade pip - "python${DATAFED_PYTHON_VERSION}" -m pip install "${pip_packages[@]}" - - for ext in "${externals[@]}"; do - install_dep_by_name "$ext" - done -fi diff --git a/scripts/install_ws.sh b/scripts/install_ws.sh index 18b248cac..f5a7750fc 100755 --- a/scripts/install_ws.sh +++ b/scripts/install_ws.sh @@ -6,8 +6,8 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/..") source "${PROJECT_ROOT}/config/datafed.sh" -source "${SOURCE}/dependency_versions.sh" -source "${SOURCE}/dependency_install_functions.sh" +source "${PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_versions.sh" +source "${PROJECT_ROOT}/external/DataFedDependencies/scripts/dependency_install_functions.sh" #NVM_DIR=/home/cades/.nvm #[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" @@ -24,13 +24,13 @@ install_nvm install_node install_foxx_cli { - npm --allow-root --unsafe-perm --prefix "${DATAFED_INSTALL_PATH}/web" install + npm --allow-root --unsafe-perm --prefix "${DATAFED_INSTALL_PATH}/web" install } || { echo "ERROR npm command failed!" exit 1 } -# Install javascript web server repo and core server were +# Install javascript web server repo and core server were # already installed by CMake cp "$PROJECT_ROOT/web/datafed-ws.js" "${DATAFED_INSTALL_PATH}/web" @@ -38,8 +38,7 @@ cp "$PROJECT_ROOT/web/datafed-ws.js" "${DATAFED_INSTALL_PATH}/web" cp "$PROJECT_ROOT/config/datafed-ws.cfg" "${DATAFED_INSTALL_PATH}/web" # Make sure that the datafed-core-pub.key exists in the web/static folder -if [[ -z "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub" ]] -then +if [[ -z "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub" ]]; then echo "ERROR unable to locate datafed-core-key.pub in ${DATAFED_INSTALL_PATH}/keys the public key is needed by the web server exiting" exit 1 fi diff --git a/scripts/install_ws_dependencies.sh b/scripts/install_ws_dependencies.sh deleted file mode 100755 index d28e30b5b..000000000 --- a/scripts/install_ws_dependencies.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash - -# Exit on error -set -e - -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath "${SOURCE}/..") - -source "${PROJECT_ROOT}/scripts/utils.sh" -source "${SOURCE}/dependency_versions.sh" -source "${PROJECT_ROOT}/scripts/dependency_install_functions.sh" - -packages=("curl" "python${DATAFED_PYTHON_VERSION}" "g++" "make" "wget") -externals=("cmake" "nvm" "node" "ws_node_packages") - -install_python - -Help() -{ - echo "$(basename $0) install web dependencies." - echo - echo "Syntax: $(basename $0) [-h|n]" - echo "options:" - echo "-h, --help Print this help message" - echo "-n, --node_install_dir Install directory, defaults to" - echo " whatever is defined in the datafed.sh file" - echo " DATAFED_DEPENDENCIES_INSTALL_PATH" - echo " ${DATAFED_DEPENDENCIES_INSTALL_PATH}" - echo "-u, --unify Unifies install scripts to be used in docker builds" -} - -# Equivalent to the .nvm directory -local_NODE_INSTALL="$DATAFED_DEPENDENCIES_INSTALL_PATH" -local_UNIFY=false - -VALID_ARGS=$(getopt -o hn: --long 'help',node_install_dir: -- "$@") -if [[ $? -ne 0 ]]; then - exit 1; -fi -eval set -- "$VALID_ARGS" -while [ : ]; do - case "$1" in - -h | --help) - Help - exit 0 - ;; - -n | --node_install_dir) - local_NODE_INSTALL=$2 - shift 2 - ;; - unify) - # The extra space is necessary to not conflict with the other install scripts - echo -n "${packages[@]} " >> "$apt_file_path" - echo -n "${externals[@]} " >> "$ext_file_path" - local_UNIFY=true - shift - ;; - --) shift; - break - ;; - \?) # incorrect option - echo "Error: Invalid option" - exit;; - esac -done - -sudo_command - -if [[ $local_UNIFY = false ]]; then - "$SUDO_CMD" apt-get update - "$SUDO_CMD" dpkg --configure -a - "$SUDO_CMD" apt-get install -y "${packages[@]}" - - for ext in "${externals[@]}"; do - install_dep_by_name "$ext" - done -fi diff --git a/scripts/run_arango_service.sh b/scripts/run_arango_service.sh index 0ee7c1534..60a9237cb 100755 --- a/scripts/run_arango_service.sh +++ b/scripts/run_arango_service.sh @@ -6,10 +6,9 @@ SCRIPT=$(realpath "$0") SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) -systemctl_exists=$( which systemctl ) +systemctl_exists=$(which systemctl) -if [[ ! -z $systemctl_exists ]] -then +if [[ ! -z $systemctl_exists ]]; then sudo systemctl daemon-reload # Turn off exit - on non zero exit code for the below command, we don't want @@ -17,14 +16,12 @@ then set +e arango_status=$(systemctl is-active arangodb3.service) set -e - if [ ! "active" = "$arango_status" ] - then + if [ ! "active" = "$arango_status" ]; then sudo systemctl restart arangodb3.service fi arango_status=$(systemctl is-active arangodb3.service) - if [ ! "active" = "$arango_status" ] - then + if [ ! "active" = "$arango_status" ]; then echo "ERROR something is wrong arangodb3.service is not active" exit 1 fi diff --git a/scripts/run_core_service.sh b/scripts/run_core_service.sh index a02c45f44..dda1df49e 100755 --- a/scripts/run_core_service.sh +++ b/scripts/run_core_service.sh @@ -7,10 +7,9 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/..") source "${PROJECT_ROOT}/config/datafed.sh" -systemctl_exists=$( which systemctl ) +systemctl_exists=$(which systemctl) -if [[ ! -z $systemctl_exists ]] -then +if [[ ! -z $systemctl_exists ]]; then sudo systemctl daemon-reload echo "The ArangoDB service should be up and running before you use this command" diff --git a/scripts/run_repo_service.sh b/scripts/run_repo_service.sh index acc1ff3b1..f4cd95674 100755 --- a/scripts/run_repo_service.sh +++ b/scripts/run_repo_service.sh @@ -7,14 +7,12 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath ${SOURCE}/..) source ${PROJECT_ROOT}/config/datafed.sh -systemctl_exists=$( which systemctl ) -if [[ ! -z $systemctl_exists ]] -then +systemctl_exists=$(which systemctl) +if [[ ! -z $systemctl_exists ]]; then sudo systemctl daemon-reload echo "The Globus service should be installed before you use this command" - if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub" ] - then + if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub" ]; then echo "Missing ${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub you will not be able to run the repo service until the public key is provided" else sudo systemctl restart datafed-repo.service diff --git a/scripts/run_ws_service.sh b/scripts/run_ws_service.sh index f98332ed4..9904172c6 100755 --- a/scripts/run_ws_service.sh +++ b/scripts/run_ws_service.sh @@ -7,10 +7,9 @@ SOURCE=$(dirname "$SCRIPT") PROJECT_ROOT=$(realpath "${SOURCE}/..") source "${PROJECT_ROOT}/config/datafed.sh" -systemctl_exists=$( which systemctl ) +systemctl_exists=$(which systemctl) -if [[ ! -z $systemctl_exists ]] -then +if [[ ! -z $systemctl_exists ]]; then sudo systemctl daemon-reload echo "The ArangoDB service and core service should be up and running before you use this command" diff --git a/scripts/uninstall_all.sh b/scripts/uninstall_all.sh index a53025633..7243d8025 100755 --- a/scripts/uninstall_all.sh +++ b/scripts/uninstall_all.sh @@ -12,7 +12,7 @@ rm -rf "${DATAFED_INSTALL_PATH}/web" rm -rf "${DATAFED_INSTALL_PATH}/repo" rm -rf "${DATAFED_INSTALL_PATH}/authz" -rm -f /etc/systemd/system/datafed* +rm -f /etc/systemd/system/datafed* rm -f /etc/grid-security/gsi-authz.conf # If the path is overwritten and the value that is not found in datafed.sh # is used to install a particular component then this will not suffice diff --git a/scripts/utils.sh b/scripts/utils.sh deleted file mode 100755 index dc1312d71..000000000 --- a/scripts/utils.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/bin/bash -SCRIPT=$(realpath "$0") -SOURCE=$(dirname "$SCRIPT") - -if [ -z "${PROJECT_ROOT}" ] -then - PROJECT_ROOT=$(realpath "${SOURCE}/..") -fi - -echo "PROJECT ROOT $PROJECT_ROOT" - -export_dependency_version_numbers() { - # Get the content of the function and remove comments - variables=$(cat "${PROJECT_ROOT}/scripts/dependency_versions.sh") - - local content="$(echo "${variables}" | sed '/^$/d;/^#/d')" - - # Extract variable assignments from the content - local assignments=$(echo "$content" | grep -Eo '\b[a-zA-Z_][a-zA-Z_0-9]*="[^\"]*"') - - echo "Variables are $variables" - echo "Content is $content" - echo "Assignments is $assignments" - # Loop through each assignment, export the variable - # Note: This may override existing variables - for assignment in $assignments; do - echo "export $assignment" - export "$assignment" - done -} - -empty_command() { - "$@" -} - -# The purpose of this function is to detect the sudo command -# if it exists use it, if we are running as root set SUDO_CMD to empty_command -# empty_command is needed so that I can do this where sudo doesn't exist -# -# "$SUDO_CMD" apt install curl -# -# If running as root this will expand to -# -# empty_command apt install curl -# -# which expands to -# -# apt install curl -# -# If I left SUDO_CMD blank i.e. "" apt install curl bash would complain -sudo_command() { - if [ "$(id -u)" -eq 0 ]; then - export SUDO_CMD="empty_command" # Ignore sudo running as root - else - # Check if sudo is available - if command -v sudo &> /dev/null; then - export SUDO_CMD=$(command -v sudo) - return 0 - else - echo "Error: This script requires sudo but sudo is not installed." >&2 - echo "You are not running as root!" >&2 - exit 1 - fi - exit $? # Exit with the same status as the sudo command - fi -} - -# Only recognized x.x.x format where all "x" are integers -# Returns true if first version is greater or equal to second version -# -# semantic_version_compatible "1.2.3" "1.1.8" -# echo $? -# Should print 1 -# -# semantic_version_compatible "1.2.3" "1.2.8" -# echo $? -# Should print 0 -# -#semantic_version_compatible "1.1.1" "1.1.1" -#echo "Should return true 1.1.1 >= 1.1.1" -# -#semantic_version_compatible "1.2.1" "1.1.1" -#echo "Should return true 1.2.1 >= 1.1.1" -# -#semantic_version_compatible "1.2.1" "3.1.1" -#echo "Should return false 1.2.1 >= 3.1.1" -# -#semantic_version_compatible "v1.2.1" "v3.1.1" -#echo "Should return false v1.2.1 >= v3.1.1" -# -#semantic_version_compatible "v1.2.1" "1.1.1" -#echo "Should return true v1.2.1 >= 1.1.1" - - -semantic_version_compatible() { - local VER1="$1" - local VER2="$2" - - # Remove any preceding v from version i.e. v1.1.2 - VER1=$(echo "$VER1" | sed 's/v//g' ) - VER2=$(echo "$VER2" | sed 's/v//g' ) - - maj_1=$(echo "$VER1" | sed 's/\./ /g' | awk '{print $1}') - min_1=$(echo "$VER1" | sed 's/\./ /g' | awk '{print $2}') - patch_1=$(echo "$VER1" | sed 's/\./ /g' | awk '{print $3}') - maj_2=$(echo "$VER2" | sed 's/\./ /g' | awk '{print $1}') - min_2=$(echo "$VER2" | sed 's/\./ /g' | awk '{print $2}') - patch_2=$(echo "$VER2" | sed 's/\./ /g' | awk '{print $3}') - - if [ "$maj_1" -gt "$maj_2" ] - then - return 1 - elif [ "$maj_1" -lt "$maj_2" ] - then - return 0 - fi - - if [ "$min_1" -gt "$min_2" ] - then - return 1 - elif [ "$min_1" -lt "$min_2" ] - then - return 0 - fi - - if [ "$patch_1" -gt "$patch_2" ] - then - return 1 - elif [ "$patch_1" -lt "$patch_2" ] - then - return 0 - fi - return 1 -} - - diff --git a/tests/end-to-end/setup.sh b/tests/end-to-end/setup.sh index 96cad4d13..c117ec984 100755 --- a/tests/end-to-end/setup.sh +++ b/tests/end-to-end/setup.sh @@ -4,9 +4,9 @@ set -ef -o pipefail # # Description -# +# # This script is designed to set up two DataFed users in the ArangoDB database, this -# cannot be done via the public facing DataFed API because it requires a OAuth flow +# cannot be done via the public facing DataFed API because it requires a OAuth flow # that requires user interaction. # # The public API also does not allow creation of repos and adding allocations this is @@ -37,16 +37,14 @@ set -ef -o pipefail local_DATABASE_NAME="sdms" local_DATABASE_USER="root" -if [ -z "${DATAFED_DATABASE_PASSWORD}" ] -then +if [ -z "${DATAFED_DATABASE_PASSWORD}" ]; then local_DATAFED_DATABASE_PASSWORD="" else local_DATAFED_DATABASE_PASSWORD=$(printenv DATAFED_DATABASE_PASSWORD) fi local_DATAFED_USER89_PASSWORD="" -if [ -z "${DATAFED_USER89_PASSWORD}" ] -then +if [ -z "${DATAFED_USER89_PASSWORD}" ]; then echo "REQUIRED env variable DATAFED_USER89_PASSWORD has not been set" exit 1 else @@ -55,26 +53,22 @@ else local_DATAFED_USER89_PASSWORD=$(echo "${DATAFED_USER89_PASSWORD}" | sed 's/!/%21/') fi -if [ -z "${DATAFED_USER89_GLOBUS_REFRESH_TOKEN}" ] -then +if [ -z "${DATAFED_USER89_GLOBUS_REFRESH_TOKEN}" ]; then echo "REQUIRED env variable DATAFED_USER89_GLOBUS_REFRESH_TOKEN has not been set" exit 1 fi -if [ -z "${DATAFED_USER89_GLOBUS_ACCESS_TOKEN}" ] -then +if [ -z "${DATAFED_USER89_GLOBUS_ACCESS_TOKEN}" ]; then echo "REQUIRED env variable DATAFED_USER89_GLOBUS_ACCESS_TOKEN has not been set" exit 1 fi -if [ -z "${DATAFED_USER89_GLOBUS_UUID}" ] -then +if [ -z "${DATAFED_USER89_GLOBUS_UUID}" ]; then echo "REQUIRED env variable DATAFED_USER89_GLOBUS_UUID has not been set" exit 1 fi -if [ -z "${DATAFED_USER99_PASSWORD}" ] -then +if [ -z "${DATAFED_USER99_PASSWORD}" ]; then echo "REQUIRED env variable DATAFED_USER99_PASSWORD has not been set" exit 1 else @@ -83,77 +77,67 @@ else local_DATAFED_USER99_PASSWORD=$(echo "${DATAFED_USER99_PASSWORD}" | sed 's/!/%21/') fi -if [ -z "${DATAFED_USER99_GLOBUS_REFRESH_TOKEN}" ] -then +if [ -z "${DATAFED_USER99_GLOBUS_REFRESH_TOKEN}" ]; then echo "REQUIRED env variable DATAFED_USER99_GLOBUS_REFRESH_TOKEN has not been set" exit 1 fi -if [ -z "${DATAFED_USER99_GLOBUS_ACCESS_TOKEN}" ] -then +if [ -z "${DATAFED_USER99_GLOBUS_ACCESS_TOKEN}" ]; then echo "REQUIRED env variable DATAFED_USER99_GLOBUS_ACCESS_TOKEN has not been set" exit 1 fi -if [ -z "${DATAFED_USER99_GLOBUS_UUID}" ] -then +if [ -z "${DATAFED_USER99_GLOBUS_UUID}" ]; then echo "REQUIRED env variable DATAFED_USER99_GLOBUS_UUID has not been set" exit 1 fi -SCRIPT=$(realpath "$0") +SCRIPT=$(realpath "${BASH_SOURCE[0]}") SOURCE=$(dirname "$SCRIPT") -PROJECT_ROOT=$(realpath ${SOURCE}/../../) -source ${PROJECT_ROOT}/config/datafed.sh +DATAFED_PROJECT_ROOT=$(realpath ${SOURCE}/../../) +source ${DATAFED_PROJECT_ROOT}/config/datafed.sh -if [ -z "${FOXX_MAJOR_API_VERSION}" ] -then - local_FOXX_MAJOR_API_VERSION=$(cat ${PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs ) +if [ -z "${FOXX_MAJOR_API_VERSION}" ]; then + local_FOXX_MAJOR_API_VERSION=$(cat ${DATAFED_PROJECT_ROOT}/cmake/Version.cmake | grep -o -P "(?<=FOXX_API_MAJOR).*(?=\))" | xargs) else local_FOXX_MAJOR_API_VERSION=$(printenv FOXX_MAJOR_API_VERSION) fi - # Detect whether arangodb is running locally { - ARANGODB_RUNNING=$(systemctl is-active --quiet arangodb3.service && echo "RUNNING") + ARANGODB_RUNNING=$(systemctl is-active --quiet arangodb3.service && echo "RUNNING") } || { - echo "Arangodb service is not locally detected." + echo "Arangodb service is not locally detected." } -if [ "${DATAFED_DATABASE_HOST}" == "localhost" ] || [ "${DATAFED_DATABASE_HOST}" == "127.0.0.1" ] -then - if [ "$ARANGODB_RUNNING" != "RUNNING" ] - then - echo "REQUIRED the arangodb service has not been detected to be running by systemctl" - exit 1 - fi +if [ "${DATAFED_DATABASE_HOST}" == "localhost" ] || [ "${DATAFED_DATABASE_HOST}" == "127.0.0.1" ]; then + if [ "$ARANGODB_RUNNING" != "RUNNING" ]; then + echo "REQUIRED the arangodb service has not been detected to be running by systemctl" + exit 1 + fi fi # First step is to clear the database echo "Clearing old database" -${PROJECT_ROOT}/scripts/clear_db.sh +${DATAFED_PROJECT_ROOT}/scripts/clear_db.sh # Second install foxx echo "Installing foxx services and API" -${PROJECT_ROOT}/scripts/install_foxx.sh +${DATAFED_PROJECT_ROOT}/scripts/install_foxx.sh echo "Completed" -if [ -z "${DATAFED_DATABASE_HOST}" ] -then +if [ -z "${DATAFED_DATABASE_HOST}" ]; then local_DATAFED_DATABASE_HOST=$(hostname -I | awk '{print $1}') else local_DATAFED_DATABASE_HOST=$(printenv DATAFED_DATABASE_HOST) fi -if [ -z "${DATAFED_DATABASE_PORT}" ] -then +if [ -z "${DATAFED_DATABASE_PORT}" ]; then local_DATAFED_DATABASE_PORT="8529" else local_DATAFED_DATABASE_PORT=$(printenv DATAFED_DATABASE_PORT) fi - # If the database was set up correctly auth will be turned on basic_auth="$local_DATABASE_USER:$local_DATAFED_DATABASE_PASSWORD" @@ -161,79 +145,49 @@ echo "IP is ${local_DATAFED_DATABASE_HOST}" echo "USER89 GLobud ID $DATAFED_USER89_GLOBUS_UUID" echo "Refresh is ${DATAFED_USER89_GLOBUS_REFRESH_TOKEN}" # Chreate user datafed89 who is admin -HTTP_CODE=$( curl --user "${basic_auth}" -w "%{http_code}" -o /dev/null -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/create?name=Data%20Fed&uid=datafed89&uuids=%5B\"${DATAFED_USER89_GLOBUS_UUID}\"%5D&password=${local_DATAFED_USER89_PASSWORD}&email=datafed89%40gmail.com&is_admin=true&secret=${DATAFED_ZEROMQ_SYSTEM_SECRET}" ) +HTTP_CODE=$(curl --user "${basic_auth}" -w "%{http_code}" -o /dev/null -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/create?name=Data%20Fed&uid=datafed89&uuids=%5B\"${DATAFED_USER89_GLOBUS_UUID}\"%5D&password=${local_DATAFED_USER89_PASSWORD}&email=datafed89%40gmail.com&is_admin=true") echo "HTTP_CODE: ${HTTP_CODE}" FIRST_INT=${HTTP_CODE:0:1} -if [ "${FIRST_INT}" -ne "2" ] -then - response=$( curl --user "${basic_auth}" -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/create?name=Data%20Fed&uid=datafed89&uuids=%5B\"${DATAFED_USER89_GLOBUS_UUID}\"%5D&password=${local_DATAFED_USER89_PASSWORD}&email=datafed89%40gmail.com&is_admin=true&secret=${DATAFED_ZEROMQ_SYSTEM_SECRET}" ) - CODE=$(echo $response | jq .code ) - ERROR_MSG=$(echo $response | jq .errorMessage ) +if [ "${FIRST_INT}" -ne "2" ]; then + response=$(curl --user "${basic_auth}" -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/create?name=Data%20Fed&uid=datafed89&uuids=%5B\"${DATAFED_USER89_GLOBUS_UUID}\"%5D&password=${local_DATAFED_USER89_PASSWORD}&email=datafed89%40gmail.com&is_admin=true") + CODE=$(echo $response | jq .code) + ERROR_MSG=$(echo $response | jq .errorMessage) echo "$ERROR_MSG" exit 1 fi # Set globus tokens -HTTP_CODE=$(curl --user "${basic_auth}" -w "%{http_code}" -o /dev/null -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/token/set?client=u%2Fdatafed89&access=${DATAFED_USER89_GLOBUS_ACCESS_TOKEN}&refresh=${DATAFED_USER89_GLOBUS_REFRESH_TOKEN}&expires_in=1") +HTTP_CODE=$(curl --user "${basic_auth}" -w "%{http_code}" -o /dev/null -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/token/set?client=u%2Fdatafed89&access=${DATAFED_USER89_GLOBUS_ACCESS_TOKEN}&refresh=${DATAFED_USER89_GLOBUS_REFRESH_TOKEN}&expires_in=1") echo "HTTP_CODE: ${HTTP_CODE}" FIRST_INT=${HTTP_CODE:0:1} -if [ "${FIRST_INT}" -ne "2" ] -then +if [ "${FIRST_INT}" -ne "2" ]; then response=$(curl --user "${basic_auth}" --fail-early -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/token/set?client=u%2Fdatafed89&access=${DATAFED_USER89_GLOBUS_ACCESS_TOKEN}&refresh=${DATAFED_USER89_GLOBUS_REFRESH_TOKEN}&expires_in=1") - CODE=$(echo $response | jq .code ) - ERROR_MSG=$(echo $response | jq .errorMessage ) + CODE=$(echo $response | jq .code) + ERROR_MSG=$(echo $response | jq .errorMessage) echo "$ERROR_MSG" exit 1 fi # Create user datafed99 who is not admin -HTTP_CODE=$(curl --user "${basic_auth}" -w "%{http_code}" -o /dev/null -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/create?name=Data%20Fed&uid=datafed99&uuids=%5B\"${DATAFED_USER99_GLOBUS_UUID}\"%5D&password=${local_DATAFED_USER99_PASSWORD}&email=datafed99%40gmail.com&is_admin=false&secret=${DATAFED_ZEROMQ_SYSTEM_SECRET}") +HTTP_CODE=$(curl --user "${basic_auth}" -w "%{http_code}" -o /dev/null -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/create?name=Data%20Fed&uid=datafed99&uuids=%5B\"${DATAFED_USER99_GLOBUS_UUID}\"%5D&password=${local_DATAFED_USER99_PASSWORD}&email=datafed99%40gmail.com&is_admin=false") echo "HTTP_CODE: ${HTTP_CODE}" FIRST_INT=${HTTP_CODE:0:1} -if [ "${FIRST_INT}" -ne "2" ] -then - response=$(curl --user "${basic_auth}" --fail-early -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/create?name=Data%20Fed&uid=datafed99&uuids=%5B\"${DATAFED_USER99_GLOBUS_UUID}\"%5D&password=${local_DATAFED_USER99_PASSWORD}&email=datafed99%40gmail.com&is_admin=false&secret=${DATAFED_ZEROMQ_SYSTEM_SECRET}") - CODE=$(echo $response | jq .code ) - ERROR_MSG=$(echo $response | jq .errorMessage ) +if [ "${FIRST_INT}" -ne "2" ]; then + response=$(curl --user "${basic_auth}" --fail-early -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/create?name=Data%20Fed&uid=datafed99&uuids=%5B\"${DATAFED_USER99_GLOBUS_UUID}\"%5D&password=${local_DATAFED_USER99_PASSWORD}&email=datafed99%40gmail.com&is_admin=false") + CODE=$(echo $response | jq .code) + ERROR_MSG=$(echo $response | jq .errorMessage) echo "$ERROR_MSG" exit 1 fi # Set globus tokens -HTTP_CODE=$(curl --user "${basic_auth}" -w "%{http_code}" -o /dev/null -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/token/set?client=u%2Fdatafed99&access=${DATAFED_USER99_GLOBUS_ACCESS_TOKEN}&refresh=${DATAFED_USER99_GLOBUS_REFRESH_TOKEN}&expires_in=1") +HTTP_CODE=$(curl --user "${basic_auth}" -w "%{http_code}" -o /dev/null -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/token/set?client=u%2Fdatafed99&access=${DATAFED_USER99_GLOBUS_ACCESS_TOKEN}&refresh=${DATAFED_USER99_GLOBUS_REFRESH_TOKEN}&expires_in=1") echo "HTTP_CODE: ${HTTP_CODE}" FIRST_INT=${HTTP_CODE:0:1} -if [ "${FIRST_INT}" -ne "2" ] -then - response=$(curl --user "${basic_auth}" --fail-early -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/token/set?client=u%2Fdatafed99&access=${DATAFED_USER99_GLOBUS_ACCESS_TOKEN}&refresh=${DATAFED_USER99_GLOBUS_REFRESH_TOKEN}&expires_in=1") - CODE=$(echo $response | jq .code ) - ERROR_MSG=$(echo $response | jq .errorMessage ) +if [ "${FIRST_INT}" -ne "2" ]; then + response=$(curl --user "${basic_auth}" --fail-early -X GET "http://${local_DATAFED_DATABASE_HOST}:${local_DATAFED_DATABASE_PORT}/_db/${local_DATABASE_NAME}/api/${local_FOXX_MAJOR_API_VERSION}/usr/token/set?client=u%2Fdatafed99&access=${DATAFED_USER99_GLOBUS_ACCESS_TOKEN}&refresh=${DATAFED_USER99_GLOBUS_REFRESH_TOKEN}&expires_in=1") + CODE=$(echo $response | jq .code) + ERROR_MSG=$(echo $response | jq .errorMessage) echo "$ERROR_MSG" exit 1 fi exit 0 -#source ${DATAFED_REPO_FORM_PATH} - -# Using the datafed89 client because it has admin rights to add the repo -#curl -X POST --header 'accept: application/json' --data-binary @- --dump - "http://${local_DATAFED_DATABASE_HOST}:8529/_db/sdms/api/repo/create?client=u%2Fdatafed89" <<\ -#EOF -#{ -# "id" : "$DATAFED_REPO_ID", -# "title" : "$DATAFED_REPO_TITLE", -# "desc" : "$DATAFED_REPO_DESCRIPTION", -# "domain" : "$DATAFED_REPO_DOMAIN", -# "capacity" : "$DATAFED_REPO_CAPACITY", -# "pub_key" : "$DATAFED_REPO_PUBLIC_KEY", -# "address" : "$DATAFED_REPO_SERVER_ADDRESS", -# "endpoint" : "$DATAFED_REPO_ENDPOINT_UUID", -# "path" : "$DATAFED_REPO_RELATIVE_PATH", -# "exp_path" : "$DATAFED_REPO_EXPORT_PATH", -# "admins" : ["u/datafed89"] -#} -#EOF -# -## Using the datafed89 client because it has the repo rights to create an allocation -## Creating an allocation for datafed89 -#curl -X GET "http://${local_DATAFED_DATABASE_HOST}:8529/_db/sdms/api/repo/alloc/create?client=u%2Fdatafed89&subject=u%2Fdatafed89&repo=repo%2F${DATAFED_REPO_ID}&data_limit=1000000000&rec_limit=100" -# -## Creating an allocation for datafed99 -#curl -X GET "http://${local_DATAFED_DATABASE_HOST}:8529/_db/sdms/api/repo/alloc/create?client=u%2Fdatafed89&subject=u%2Fdatafed99&repo=repo%2F${DATAFED_REPO_ID}&data_limit=1000000000&rec_limit=100" diff --git a/tests/end-to-end/test_api_alloc.py b/tests/end-to-end/test_api_alloc.py index be106cf65..7e74e86d3 100755 --- a/tests/end-to-end/test_api_alloc.py +++ b/tests/end-to-end/test_api_alloc.py @@ -47,6 +47,7 @@ def setUp(self): username = "datafed89" password = os.environ.get("DATAFED_USER89_PASSWORD") + self._timeout = int(os.environ.get('DATAFED_TEST_TIMEOUT_OVERRIDE', '1')); count = 0 while True: @@ -103,7 +104,7 @@ def setUp(self): result = self._df_api.repoList(list_all=True) count = 0 while len(result[0].repo) == 0: - time.sleep(1) + time.sleep(self._timeout) result = self._df_api.repoList(list_all=True) count = count + 1 if count > 3: @@ -147,7 +148,7 @@ def test_repo_alloc_list_create_delete(self): " all services are running." ) break - time.sleep(1) + time.sleep(self._timeout) print("Calling taskView") task_result = self._df_api.taskView(task_id) status = task_result[0].task[0].status @@ -180,7 +181,7 @@ def test_repo_alloc_list_create_delete(self): "sure all services are running." ) break - time.sleep(1) + time.sleep(self._timeout) task_result = self._df_api.taskView(task_id) status = task_result[0].task[0].status count = count + 1 diff --git a/tests/end-to-end/test_api_collection.py b/tests/end-to-end/test_api_collection.py index 81203ca61..f236dc239 100755 --- a/tests/end-to-end/test_api_collection.py +++ b/tests/end-to-end/test_api_collection.py @@ -51,6 +51,7 @@ def setUp(self): self._username = "datafed89" password = os.environ.get("DATAFED_USER89_PASSWORD") + self._timeout = int(os.environ.get('DATAFED_TEST_TIMEOUT_OVERRIDE', '1')); count = 0 while True: @@ -106,7 +107,7 @@ def setUp(self): result = self._df_api.repoList(list_all=True) count = 0 while len(result[0].repo) == 0: - time.sleep(1) + time.sleep(self._timeout) result = self._df_api.repoList(list_all=True) count = count + 1 if count > 3: @@ -141,7 +142,7 @@ def setUp(self): "sure all services are running." ) break - time.sleep(1) + time.sleep(self._timeout) task_result = self._df_api.taskView(task_id) status = task_result[0].task[0].status count = count + 1 @@ -220,7 +221,7 @@ def test_collection_create_delete(self): "make sure all services are running." ) break - time.sleep(1) + time.sleep(self._timeout) task_result = self._df_api.taskView(task_id) status = task_result[0].task[0].status count = count + 1 @@ -251,7 +252,7 @@ def tearDown(self): " make sure all services are running." ) break - time.sleep(1) + time.sleep(self._timeout) task_result = self._df_api.taskView(task_id) status = task_result[0].task[0].status count = count + 1 diff --git a/tests/end-to-end/test_api_context.py b/tests/end-to-end/test_api_context.py index b6a8dafc1..5e86685e6 100755 --- a/tests/end-to-end/test_api_context.py +++ b/tests/end-to-end/test_api_context.py @@ -46,6 +46,7 @@ def setUp(self): self._username = "datafed99" password = os.environ.get("DATAFED_USER99_PASSWORD") + timeout = int(os.environ.get('DATAFED_TEST_TIMEOUT_OVERRIDE', '1')) count = 0 while True: diff --git a/tests/end-to-end/test_api_endpoint.py b/tests/end-to-end/test_api_endpoint.py index 4d97dd366..e0a88eecd 100755 --- a/tests/end-to-end/test_api_endpoint.py +++ b/tests/end-to-end/test_api_endpoint.py @@ -46,6 +46,7 @@ def setUp(self): username = "datafed89" password = os.environ.get("DATAFED_USER89_PASSWORD") + timeout = int(os.environ.get('DATAFED_TEST_TIMEOUT_OVERRIDE', '1')) count = 0 while True: diff --git a/tests/end-to-end/test_api_record.py b/tests/end-to-end/test_api_record.py index d9d645ea6..71fae9999 100755 --- a/tests/end-to-end/test_api_record.py +++ b/tests/end-to-end/test_api_record.py @@ -53,6 +53,7 @@ def setUp(self): self._username = "datafed89" password = os.environ.get("DATAFED_USER89_PASSWORD") + self._timeout = int(os.environ.get('DATAFED_TEST_TIMEOUT_OVERRIDE', '1')); count = 0 while True: try: @@ -106,7 +107,7 @@ def setUp(self): result = self._df_api.repoList(list_all=True) count = 0 while len(result[0].repo) == 0: - time.sleep(1) + time.sleep(self._timeout) result = self._df_api.repoList(list_all=True) count = count + 1 if count > 3: @@ -141,7 +142,7 @@ def setUp(self): "all services are running." ) break - time.sleep(1) + time.sleep(self._timeout) task_result = self._df_api.taskView(task_id) status = task_result[0].task[0].status count = count + 1 @@ -188,7 +189,7 @@ def test_record_create_delete(self): while status < 3: if count > 30: break - time.sleep(4) + time.sleep(self._timeout) task_result = self._df_api.taskView(task_id) print("task Result **************") print(task_result) @@ -210,7 +211,7 @@ def test_record_create_delete(self): while status < 3: if count > 20: break - time.sleep(1) + time.sleep(self._timeout) task_result = self._df_api.taskView(task_id) status = task_result[0].task[0].status count = count + 1 @@ -242,7 +243,7 @@ def tearDown(self): " all services are running." ) break - time.sleep(1) + time.sleep(self._timeout) task_result = self._df_api.taskView(task_id) status = task_result[0].task[0].status count = count + 1 diff --git a/tests/end-to-end/test_api_repo.py b/tests/end-to-end/test_api_repo.py index 88befa332..b161b8632 100755 --- a/tests/end-to-end/test_api_repo.py +++ b/tests/end-to-end/test_api_repo.py @@ -41,6 +41,7 @@ def setUp(self): username = "datafed89" password = os.environ.get("DATAFED_USER89_PASSWORD") + timeout = int(os.environ.get('DATAFED_TEST_TIMEOUT_OVERRIDE', '1')) count = 0 while True: diff --git a/tests/end-to-end/web-UI/auth.setup.js.in b/tests/end-to-end/web-UI/auth.setup.js.in index 2e50973f5..9d898dacc 100644 --- a/tests/end-to-end/web-UI/auth.setup.js.in +++ b/tests/end-to-end/web-UI/auth.setup.js.in @@ -2,50 +2,68 @@ const { chromium } = require('playwright'); const path = require('path'); const process = require('process'); -console.log("******Inside Setup file******"); +console.log("INFO - ******Inside Setup file******"); module.exports = async function () { // if a playwright page object doesn't exist, create one const browser = await chromium.launch({ args: ['--ignore-certificate-errors'], - timeout: 30000, + headless: true, }); - // const context = await browser.newContext({ - // ignoreHTTPSErrors: true, - // }); const page = await browser.newPage(); - console.log("new page object created"); - - // Go to the website and login through globus using a tester account - await page.goto('https://@DATAFED_DOMAIN@/ui/welcome');//TESTING - if (await page.getByRole('button', { name: 'Log In / Register' }).isVisible()) { - await page.getByRole('button', { name: 'Log In / Register' }).click(); - if (page.getByRole('link', { name: 'Globus globus' }).isVisible()) { - page.getByRole('button', { name: 'Globus ID to sign in' }).click(); - if (page.getByLabel('Username @globusid.org').isEditable()) { - // changes the username and password in the .env file if needed - await page.getByLabel('Username @globusid.org').fill(process.env.DATAFED_WEB_TEST_USERNAME); - await page.getByLabel('Password').fill(process.env.DATAFED_WEB_TEST_PASSWORD); - await page.click('button[type="submit"]'); - await page.waitForURL('https://@DATAFED_DOMAIN@/ui/main') - console.log("******PAST LOGIN******"); - await page.context().storageState({ path: './.auth/auth.json'}); //TESTING - console.log("******Done with login******"); - } else { - console.log("DID NOT SEE FORM"); - } - } else { - console.log("DID NOT SEE GLOBUS BUTTON"); - } - } else { - console.log("DID NOT SEE LOGIN BUTTON"); - } + console.log("INFO - new page object created"); + + // Extra safety for debugging slow loads + page.on('console', msg => console.log('INFO - [PAGE LOG] ', msg.text())); + page.on('response', res => { + if (res.status() >= 400) + console.log(`ERROR - [HTTP ${res.status()}] ${res.url()}`); + }); + + // --- Step 1: Go to DataFed --- + console.log("INFO - 1. Got to DataFed"); + await page.goto('https://@DATAFED_DOMAIN@/ui/welcome', { waitUntil: 'networkidle', timeout: 60000 }); + + // --- Step 2: Click Login/Register --- + console.log("INFO - 2. Login and Register"); + const loginButton = page.getByRole('button', { name: 'Log In / Register' }); + await loginButton.waitFor({ state: 'visible', timeout: 30000 }); + await loginButton.click(); + + // --- Step 3: Check if link is visible --- + console.log("INFO - 3. Check if link is visible"); + const globusLink = page.getByRole('link', { name: /Globus/i }); + await globusLink.waitFor({ state: 'visible', timeout: 30000 }); + + // --- Step 4: Click Globus ID to sign in --- + console.log("INFO - 4. Use Globus ID to sign in"); + const globusIDButton = page.getByRole('button', { name: 'Globus ID to sign in' }); + await globusIDButton.waitFor({ state: 'visible', timeout: 30000 }); + await globusIDButton.click(); + + // --- Step 5: Wait for Globus redirect --- + console.log("INFO - 5. Wait for Globus login to redirect"); + await page.waitForLoadState('networkidle', { timeout: 45000 }); + + // --- Step 6: Fill in credentials robustly --- + console.log("INFO - 6. Fill in credentials"); + const usernameField = page.getByLabel(/username/i); + await usernameField.waitFor({ state: 'visible', timeout: 45000 }); + await usernameField.fill(process.env.DATAFED_WEB_TEST_USERNAME); + + const passwordField = page.getByLabel(/password/i); + await passwordField.waitFor({ state: 'visible', timeout: 45000 }); + await passwordField.fill(process.env.DATAFED_WEB_TEST_PASSWORD); + + // --- Step 7: Submit form --- + await page.click('button[type="submit"]'); + await page.waitForURL('https://@DATAFED_DOMAIN@/ui/main') + + console.log("INFO - ******PAST LOGIN******"); + await page.context().storageState({ path: './.auth/auth.json'}); //TESTING + console.log("INFO - ******Done with login******"); + await browser.close(); - //return page; // pass on the page variable if using this function directly in a test script }; -// TODO this is not as efficient as storing the states in the context variable, -// something like "page.context().storagestate" would work better in the future when -// there are many more test files - diff --git a/tests/end-to-end/web-UI/package-lock.json b/tests/end-to-end/web-UI/package-lock.json index 87fc11faa..b3d840179 100644 --- a/tests/end-to-end/web-UI/package-lock.json +++ b/tests/end-to-end/web-UI/package-lock.json @@ -10,20 +10,21 @@ "license": "ISC", "dependencies": { "dotenv": "^16.4.5", - "playwright": "^1.45.1" + "playwright": "^1.56.1" }, "devDependencies": { - "@playwright/test": "^1.45.1", + "@playwright/test": "^1.56.1", "@types/node": "^20.14.10" } }, "node_modules/@playwright/test": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.1.tgz", - "integrity": "sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", + "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright": "1.45.1" + "playwright": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -57,6 +58,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -66,11 +68,12 @@ } }, "node_modules/playwright": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.1.tgz", - "integrity": "sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.45.1" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -83,9 +86,10 @@ } }, "node_modules/playwright-core": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.1.tgz", - "integrity": "sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, diff --git a/tests/end-to-end/web-UI/package.json b/tests/end-to-end/web-UI/package.json index 6770e6275..cd394d9f6 100644 --- a/tests/end-to-end/web-UI/package.json +++ b/tests/end-to-end/web-UI/package.json @@ -8,11 +8,11 @@ "license": "ISC", "description": "", "devDependencies": { - "@playwright/test": "^1.45.1", + "@playwright/test": "^1.56.1", "@types/node": "^20.14.10" }, "dependencies": { "dotenv": "^16.4.5", - "playwright": "^1.45.1" + "playwright": "^1.56.1" } } diff --git a/tests/end-to-end/web-UI/playwright.config.js b/tests/end-to-end/web-UI/playwright.config.js index 1e83946f1..cae11dd50 100644 --- a/tests/end-to-end/web-UI/playwright.config.js +++ b/tests/end-to-end/web-UI/playwright.config.js @@ -15,13 +15,13 @@ module.exports = defineConfig({ /* Run tests in files in parallel */ fullyParallel: false, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, + /* Fail the build on CI_DATAFED_END_TO_END_WEB_RETRIES if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI_DATAFED_END_TO_END_WEB_RETRIES, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, + /* Retry on CI_DATAFED_END_TO_END_WEB_RETRIES only */ + retries: process.env.CI_DATAFED_END_TO_END_WEB_RETRIES ? 2 : 0, - /* Opt out of parallel tests on CI. */ + /* Opt out of parallel tests on CI_DATAFED_END_TO_END_WEB_RETRIES. */ workers: 1, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ @@ -31,9 +31,11 @@ module.exports = defineConfig({ use: { /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: "on-first-retry", - + screenshot: "only-on-failure", + video: "retain-on-failure", ignoreHTTPSErrors: true, - + actionTimeout: 45000, + navigationTimeout: 60000, launchOptions: { args: ["--ignore-certificate-errors"], }, diff --git a/web/datafed-ws.js b/web/datafed-ws.js index 4355ca091..6ead222f7 100755 --- a/web/datafed-ws.js +++ b/web/datafed-ws.js @@ -51,7 +51,6 @@ var g_host, g_server_key_file, g_server_cert_file, g_server_chain_file, - g_system_secret, g_session_secret, g_test, g_msg_by_id = {}, @@ -707,7 +706,6 @@ app.get("/api/usr/register", (a_req, a_resp) => { name: a_req.session.name, email: a_req.session.email, uuid: a_req.session.uuids, - secret: g_system_secret, }, function (reply) { if (!reply) { @@ -2390,7 +2388,6 @@ function loadSettings() { g_server_cert_file = config.server.cert_file || g_server_cert_file; g_server_chain_file = config.server.chain_file; } - g_system_secret = config.server.system_secret; g_session_secret = config.server.session_secret; g_test = config.server.test || g_test; } @@ -2422,9 +2419,6 @@ function loadSettings() { throw e; } - if (!g_system_secret) { - throw "Server system secret not set."; - } if (!g_session_secret) { throw "Server session secret not set."; } diff --git a/web/docker/Dockerfile b/web/docker/Dockerfile index 6449f28da..9fa6cfa3a 100644 --- a/web/docker/Dockerfile +++ b/web/docker/Dockerfile @@ -1,21 +1,23 @@ # NOTE this image must be built with respect to the base of the project i.e. # cd ${PROJECT_ROOT} or cd DataFed # docker build -f web/docker/Dockerfile . -ARG BUILD_BASE="ubuntu:focal" -ARG DEPENDENCIES="dependencies" -ARG RUNTIME="runtime" -ARG DATAFED_DIR="/datafed" -ARG DATAFED_INSTALL_PATH="/opt/datafed" +ARG BUILD_BASE="debian:bookworm-slim" +ARG DEPENDENCIES="dependencies" +ARG RUNTIME="runtime" +ARG DATAFED_DIR="/datafed" +ARG DATAFED_INSTALL_PATH="/opt/datafed" ARG DATAFED_DEPENDENCIES_INSTALL_PATH="/opt/datafed/dependencies" -ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" -ARG BUILD_DIR="$DATAFED_DIR/source" -ARG LIB_DIR="/usr/local/lib" +ARG GCS_IMAGE="code.ornl.gov:4567/dlsw/datafed/gcs-ubuntu-focal" +ARG BUILD_DIR="$DATAFED_DIR/source" +ARG LIB_DIR="/usr/local/lib" +ARG DATAFED_DEPENDENCIES_ROOT="$BUILD_DIR/external/DataFedDependencies" FROM ${DEPENDENCIES} AS ws-build ARG DATAFED_DIR ARG BUILD_DIR ARG DATAFED_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT ARG DATAFED_DEPENDENCIES_INSTALL_PATH ENV DATAFED_INSTALL_PATH="${DATAFED_INSTALL_PATH}" @@ -24,6 +26,12 @@ EXPOSE 7513 # For communication with the public EXPOSE 443 +RUN mkdir -p ${DATAFED_DEPENDENCIES_ROOT}/scripts && \ + mv ./scripts/utils.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/utils.sh && \ + mv ./scripts/dependency_install_functions.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/dependency_install_functions.sh && \ + mv ./scripts/dependency_versions.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/dependency_versions.sh && \ + mv ./scripts/generate_dependencies_config.sh ${DATAFED_DEPENDENCIES_ROOT}/scripts/generate_dependencies_config.sh + COPY ./CMakeLists.txt ${BUILD_DIR} COPY ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/ COPY ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/ @@ -34,16 +42,17 @@ COPY ./cmake ${BUILD_DIR}/cmake COPY ./common/proto ${BUILD_DIR}/common/proto COPY ./web ${BUILD_DIR}/web -RUN ${BUILD_DIR}/scripts/generate_datafed.sh && \ - ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake -S. -B build \ - -DBUILD_REPO_SERVER=False \ - -DBUILD_AUTHZ=False \ - -DBUILD_CORE_SERVER=False \ - -DBUILD_WEB_SERVER=True \ - -DBUILD_DOCS=False \ - -DBUILD_PYTHON_CLIENT=False \ - -DBUILD_FOXX=False \ - -DBUILD_COMMON=False +RUN ${DATAFED_DEPENDENCIES_ROOT}/scripts/generate_dependencies_config.sh && \ + ${BUILD_DIR}/scripts/generate_datafed.sh && \ + ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake -S. -B build \ + -DBUILD_REPO_SERVER=False \ + -DBUILD_AUTHZ=False \ + -DBUILD_CORE_SERVER=False \ + -DBUILD_WEB_SERVER=True \ + -DBUILD_DOCS=False \ + -DBUILD_PYTHON_CLIENT=False \ + -DBUILD_FOXX=False \ + -DBUILD_COMMON=False RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build RUN ${DATAFED_DEPENDENCIES_INSTALL_PATH}/bin/cmake --build build --target install # Only part of the final install can be done here @@ -57,10 +66,12 @@ ARG DATAFED_DIR ARG DATAFED_INSTALL_PATH ARG BUILD_DIR ARG DATAFED_DEPENDENCIES_INSTALL_PATH +ARG DATAFED_DEPENDENCIES_ROOT # The above should also be available at runtime ENV DATAFED_INSTALL_PATH="$DATAFED_INSTALL_PATH" ENV DATAFED_DEPENDENCIES_INSTALL_PATH="$DATAFED_DEPENDENCIES_INSTALL_PATH" +ENV DATAFED_DEPENDENCIES_ROOT="$DATAFED_DEPENDENCIES_ROOT" ENV DATAFED_DIR="$DATAFED_DIR" ENV BUILD_DIR="$BUILD_DIR" ENV DATAFED_DEFAULT_LOG_PATH="$DATAFED_INSTALL_PATH/logs" @@ -71,16 +82,17 @@ WORKDIR ${DATAFED_DIR} USER datafed -COPY --chown=datafed:root ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/generate_datafed.sh -COPY --chown=datafed:root ./scripts/dependency_versions.sh ${BUILD_DIR}/scripts/dependency_versions.sh -COPY --chown=datafed:root ./scripts/dependency_install_functions.sh ${BUILD_DIR}/scripts/dependency_install_functions.sh -COPY --chown=datafed:root ./scripts/generate_ws_config.sh ${BUILD_DIR}/scripts/generate_ws_config.sh -COPY --chown=datafed:root ./scripts/install_ws.sh ${BUILD_DIR}/scripts/install_ws.sh -COPY --chown=datafed:root ./cmake/Version.cmake ${BUILD_DIR}/cmake/Version.cmake -COPY --chown=datafed:root ./scripts/utils.sh ${BUILD_DIR}/scripts/utils.sh -COPY --chown=datafed:root ./scripts/export_dependency_version.sh ${BUILD_DIR}/scripts/export_dependency_version.sh +COPY --from=ws-build --chown=datafed:root ${DATAFED_DEPENDENCIES_ROOT}/scripts/ {DATAFED_DEPENDENCIES_ROOT}/scripts/ + +COPY --chown=datafed:root ./scripts/generate_datafed.sh ${BUILD_DIR}/scripts/generate_datafed.sh +COPY --chown=datafed:root ./scripts/export_dependency_version.sh ${BUILD_DIR}/scripts/export_dependency_version.sh +COPY --chown=datafed:root ./scripts/generate_ws_config.sh ${BUILD_DIR}/scripts/generate_ws_config.sh +COPY --chown=datafed:root ./scripts/install_ws.sh ${BUILD_DIR}/scripts/install_ws.sh +COPY --chown=datafed:root ./cmake/Version.cmake ${BUILD_DIR}/cmake/Version.cmake + COPY --from=ws-build --chown=datafed:root ${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm ${DATAFED_DEPENDENCIES_INSTALL_PATH}/nvm COPY --from=ws-build --chown=datafed:root ${BUILD_DIR}/web ${BUILD_DIR}/web +COPY --from=ws-build --chown=datafed:root ${DATAFED_DEPENDENCIES_ROOT}/scripts ${DATAFED_DEPENDENCIES_ROOT}/scripts COPY --from=ws-build --chown=datafed:root ${DATAFED_INSTALL_PATH}/web ${DATAFED_INSTALL_PATH}/web COPY --from=ws-build --chown=datafed:root /usr/bin/curl /usr/bin/curl diff --git a/web/docker/entrypoint.sh b/web/docker/entrypoint.sh index a4048bc3b..3eb63469d 100755 --- a/web/docker/entrypoint.sh +++ b/web/docker/entrypoint.sh @@ -4,7 +4,7 @@ set -euf -o pipefail if [ -n "$UID" ]; then - usermod -u "$UID" datafed + usermod -u "$UID" datafed fi chown -R datafed:root "${DATAFED_INSTALL_PATH}/web" @@ -32,13 +32,11 @@ fi # Send output to file as well as print to terminal log_path=$(grep "log-path" "${BUILD_DIR}/config/datafed-ws.cfg" | cut -d "=" -f 2 | tr -d ' ') -if [ ! -d "${log_path}" ] -then +if [ ! -d "${log_path}" ]; then su -c "mkdir -p ${log_path}" datafed fi -if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub" ] -then +if [ ! -f "${DATAFED_INSTALL_PATH}/keys/datafed-core-key.pub" ]; then echo "datafed-core-key.pub not found" exit 1 fi @@ -52,8 +50,7 @@ fi cd "$DATAFED_INSTALL_PATH/web" datafed_ws_exec=$(basename "$1") -if [ "${datafed_ws_exec}" = "datafed-ws.js" ] -then +if [ "${datafed_ws_exec}" = "datafed-ws.js" ]; then # Send output to log file su datafed -c '"$@"' -- argv0 "$@" 2>&1 | su datafed -c "tee $log_path/datafed-ws.log" else @@ -61,4 +58,3 @@ else # If not do not by default send to log file su datafed -c '"$@"' -- argv0 "$@" fi - diff --git a/web/static/ace/ace.js b/web/static/ace/ace.js index b21598256..e33e60534 100644 --- a/web/static/ace/ace.js +++ b/web/static/ace/ace.js @@ -1,11 +1,11 @@ -(function () { +((function () { function o(n) { var i = e; n && (e[n] || (e[n] = {}), (i = e[n])); if (!i.define || !i.define.packaged) - (t.original = i.define), (i.define = t), (i.define.packaged = !0); + ((t.original = i.define), (i.define = t), (i.define.packaged = !0)); if (!i.require || !i.require.packaged) - (r.original = i.require), (i.require = r), (i.require.packaged = !0); + ((r.original = i.require), (i.require = r), (i.require.packaged = !0)); } var ACE_NAMESPACE = "", e = (function () { @@ -21,14 +21,14 @@ console.trace()); return; } - arguments.length == 2 && (r = n), - t.modules[e] || ((t.payloads[e] = r), (t.modules[e] = null)); + (arguments.length == 2 && (r = n), + t.modules[e] || ((t.payloads[e] = r), (t.modules[e] = null))); }; - (t.modules = {}), (t.payloads = {}); + ((t.modules = {}), (t.payloads = {})); var n = function (e, t, n) { if (typeof t == "string") { var i = s(e, t); - if (i != undefined) return n && n(), i; + if (i != undefined) return (n && n(), i); } else if (Object.prototype.toString.call(t) === "[object Array]") { var o = []; for (var u = 0, a = t.length; u < a; ++u) { @@ -70,7 +70,7 @@ return n(r, e, t); }, f = s(a, o, u); - (o = f || u.exports), (t.modules[r] = o), delete t.payloads[r]; + ((o = f || u.exports), (t.modules[r] = o), delete t.payloads[r]); } s = t.modules[r] = o || s; } @@ -104,10 +104,10 @@ i = r.exec.call(/()??/, "")[1] === undefined, s = (function () { var e = /^/g; - return r.test.call(e, ""), !e.lastIndex; + return (r.test.call(e, ""), !e.lastIndex); })(); if (s && i) return; - (RegExp.prototype.exec = function (e) { + ((RegExp.prototype.exec = function (e) { var t = r.exec.apply(this, arguments), n, a; @@ -122,7 +122,7 @@ })); if (this._xregexp && this._xregexp.captureNames) for (var f = 1; f < t.length; f++) - (n = this._xregexp.captureNames[f - 1]), n && (t[n] = t[f]); + ((n = this._xregexp.captureNames[f - 1]), n && (t[n] = t[f])); !s && this.global && !t[0].length && this.lastIndex > t.index && this.lastIndex--; } return t; @@ -138,13 +138,13 @@ this.lastIndex--, !!t ); - }); + })); }), define("ace/lib/es5-shim", ["require", "exports", "module"], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -217,35 +217,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -258,7 +258,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -285,7 +285,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -387,15 +387,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -405,8 +405,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -428,9 +428,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -439,7 +439,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -466,10 +466,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -492,16 +492,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -513,7 +513,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -523,7 +523,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -542,8 +542,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -594,7 +594,7 @@ ["require", "exports", "module", "ace/lib/regexp", "ace/lib/es5-shim"], function (e, t, n) { "use strict"; - e("./regexp"), + (e("./regexp"), e("./es5-shim"), typeof Element != "undefined" && !Element.prototype.remove && @@ -605,19 +605,19 @@ value: function () { this.parentNode && this.parentNode.removeChild(this); }, - }); + })); }, ), define("ace/lib/useragent", ["require", "exports", "module"], function (e, t, n) { "use strict"; - (t.OS = { LINUX: "LINUX", MAC: "MAC", WINDOWS: "WINDOWS" }), + ((t.OS = { LINUX: "LINUX", MAC: "MAC", WINDOWS: "WINDOWS" }), (t.getOS = function () { return t.isMac ? t.OS.MAC : t.isLinux ? t.OS.LINUX : t.OS.WINDOWS; - }); + })); if (typeof navigator != "object") return; var r = (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase(), i = navigator.userAgent; - (t.isWin = r == "win"), + ((t.isWin = r == "win"), (t.isMac = r == "mac"), (t.isLinux = r == "linux"), (t.isIE = @@ -643,7 +643,7 @@ (t.isChromeOS = i.indexOf(" CrOS ") >= 0), (t.isIOS = /iPad|iPhone|iPod/.test(i) && !window.MSStream), t.isIOS && (t.isMac = !0), - (t.isMobile = t.isIPad || t.isAndroid); + (t.isMobile = t.isIPad || t.isAndroid)); }), define( "ace/lib/dom", @@ -652,10 +652,10 @@ "use strict"; var r = e("./useragent"), i = "http://www.w3.org/1999/xhtml"; - (t.buildDom = function o(e, t, n) { + ((t.buildDom = function o(e, t, n) { if (typeof e == "string" && e) { var r = document.createTextNode(e); - return t && t.appendChild(r), r; + return (t && t.appendChild(r), r); } if (!Array.isArray(e)) return e; if (typeof e[0] != "string" || !e[0]) { @@ -731,9 +731,9 @@ for (;;) { var i = n.indexOf(t); if (i == -1) break; - (r = !1), n.splice(i, 1); + ((r = !1), n.splice(i, 1)); } - return r && n.push(t), (e.className = n.join(" ")), r; + return (r && n.push(t), (e.className = n.join(" ")), r); }), (t.setCssClass = function (e, n, r) { r ? t.addCssClass(e, n) : t.removeCssClass(e, n); @@ -751,36 +751,36 @@ if (r && t.hasCssString(r, s)) return null; r && (n += "\n/*# sourceURL=ace/css/" + r + " */"); var u = t.createElement("style"); - u.appendChild(o.createTextNode(n)), + (u.appendChild(o.createTextNode(n)), r && (u.id = r), s == o && (s = t.getDocumentHead(o)), - s.insertBefore(u, s.firstChild); + s.insertBefore(u, s.firstChild)); }), (t.importCssStylsheet = function (e, n) { t.buildDom(["link", { rel: "stylesheet", href: e }], t.getDocumentHead(n)); }), (t.scrollbarWidth = function (e) { var n = t.createElement("ace_inner"); - (n.style.width = "100%"), + ((n.style.width = "100%"), (n.style.minWidth = "0px"), (n.style.height = "200px"), - (n.style.display = "block"); + (n.style.display = "block")); var r = t.createElement("ace_outer"), i = r.style; - (i.position = "absolute"), + ((i.position = "absolute"), (i.left = "-10000px"), (i.overflow = "hidden"), (i.width = "200px"), (i.minWidth = "0px"), (i.height = "150px"), (i.display = "block"), - r.appendChild(n); + r.appendChild(n)); var s = e.documentElement; s.appendChild(r); var o = n.offsetWidth; i.overflow = "scroll"; var u = n.offsetWidth; - return o == u && (u = r.clientWidth), s.removeChild(r), o - u; + return (o == u && (u = r.clientWidth), s.removeChild(r), o - u); }), typeof document == "undefined" && (t.importCssString = function () {}), (t.computedStyle = function (e, t) { @@ -793,14 +793,14 @@ (t.HAS_CSS_TRANSFORMS = !1), (t.HI_DPI = r.isWin ? typeof window != "undefined" && window.devicePixelRatio >= 1.5 - : !0); + : !0)); if (typeof document != "undefined") { var s = document.createElement("div"); - t.HI_DPI && s.style.transform !== undefined && (t.HAS_CSS_TRANSFORMS = !0), + (t.HI_DPI && s.style.transform !== undefined && (t.HAS_CSS_TRANSFORMS = !0), !r.isEdge && typeof s.style.animationName != "undefined" && (t.HAS_CSS_ANIMATION = !0), - (s = null); + (s = null)); } t.HAS_CSS_TRANSFORMS ? (t.translate = function (e, t, n) { @@ -808,17 +808,17 @@ "translate(" + Math.round(t) + "px, " + Math.round(n) + "px)"; }) : (t.translate = function (e, t, n) { - (e.style.top = Math.round(n) + "px"), (e.style.left = Math.round(t) + "px"); + ((e.style.top = Math.round(n) + "px"), (e.style.left = Math.round(t) + "px")); }); }, ), define("ace/lib/oop", ["require", "exports", "module"], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -826,7 +826,7 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define( "ace/lib/keys", @@ -953,9 +953,9 @@ t, n; for (n in e.FUNCTION_KEYS) - (t = e.FUNCTION_KEYS[n].toLowerCase()), (e[t] = parseInt(n, 10)); + ((t = e.FUNCTION_KEYS[n].toLowerCase()), (e[t] = parseInt(n, 10))); for (n in e.PRINTABLE_KEYS) - (t = e.PRINTABLE_KEYS[n].toLowerCase()), (e[t] = parseInt(n, 10)); + ((t = e.PRINTABLE_KEYS[n].toLowerCase()), (e[t] = parseInt(n, 10))); return ( r.mixin(e, e.MODIFIER_KEYS), r.mixin(e, e.PRINTABLE_KEYS), @@ -979,11 +979,11 @@ e ); })(); - r.mixin(t, i), + (r.mixin(t, i), (t.keyCodeToString = function (e) { var t = i[e]; - return typeof t != "string" && (t = String.fromCharCode(e)), t.toLowerCase(); - }); + return (typeof t != "string" && (t = String.fromCharCode(e)), t.toLowerCase()); + })); }, ), define( @@ -1010,7 +1010,7 @@ } } } - n in r.MODIFIER_KEYS && (n = -1), a & 8 && n >= 91 && n <= 93 && (n = -1); + (n in r.MODIFIER_KEYS && (n = -1), a & 8 && n >= 91 && n <= 93 && (n = -1)); if (!a && n === 13) { var f = "location" in t ? t.location : t.keyLocation; if (f === 3) { @@ -1032,13 +1032,13 @@ i = e("./useragent"), s = null, o = 0; - (t.addListener = function (e, t, n) { + ((t.addListener = function (e, t, n) { if (e.addEventListener) return e.addEventListener(t, n, !1); if (e.attachEvent) { var r = function () { n.call(e, window.event); }; - (n._wrapper = r), e.attachEvent("on" + t, r); + ((n._wrapper = r), e.attachEvent("on" + t, r)); } }), (t.removeListener = function (e, t, n) { @@ -1046,7 +1046,7 @@ e.detachEvent && e.detachEvent("on" + t, n._wrapper || n); }), (t.stopEvent = function (e) { - return t.stopPropagation(e), t.preventDefault(e), !1; + return (t.stopPropagation(e), t.preventDefault(e), !1); }), (t.stopPropagation = function (e) { e.stopPropagation ? e.stopPropagation() : (e.cancelBubble = !0); @@ -1066,11 +1066,11 @@ }), (t.capture = function (e, n, r) { function i(e) { - n && n(e), + (n && n(e), r && r(e), t.removeListener(document, "mousemove", n, !0), t.removeListener(document, "mouseup", i, !0), - t.removeListener(document, "dragstart", i, !0); + t.removeListener(document, "dragstart", i, !0)); } return ( t.addListener(document, "mousemove", n, !0), @@ -1081,52 +1081,52 @@ }), (t.addTouchMoveListener = function (e, n) { var r, i; - t.addListener(e, "touchstart", function (e) { + (t.addListener(e, "touchstart", function (e) { var t = e.touches, n = t[0]; - (r = n.clientX), (i = n.clientY); + ((r = n.clientX), (i = n.clientY)); }), t.addListener(e, "touchmove", function (e) { var t = e.touches; if (t.length > 1) return; var s = t[0]; - (e.wheelX = r - s.clientX), + ((e.wheelX = r - s.clientX), (e.wheelY = i - s.clientY), (r = s.clientX), (i = s.clientY), - n(e); - }); + n(e)); + })); }), (t.addMouseWheelListener = function (e, n) { "onmousewheel" in e ? t.addListener(e, "mousewheel", function (e) { var t = 8; - e.wheelDeltaX !== undefined + (e.wheelDeltaX !== undefined ? ((e.wheelX = -e.wheelDeltaX / t), (e.wheelY = -e.wheelDeltaY / t)) : ((e.wheelX = 0), (e.wheelY = -e.wheelDelta / t)), - n(e); + n(e)); }) : "onwheel" in e ? t.addListener(e, "wheel", function (e) { var t = 0.35; switch (e.deltaMode) { case e.DOM_DELTA_PIXEL: - (e.wheelX = e.deltaX * t || 0), - (e.wheelY = e.deltaY * t || 0); + ((e.wheelX = e.deltaX * t || 0), + (e.wheelY = e.deltaY * t || 0)); break; case e.DOM_DELTA_LINE: case e.DOM_DELTA_PAGE: - (e.wheelX = (e.deltaX || 0) * 5), - (e.wheelY = (e.deltaY || 0) * 5); + ((e.wheelX = (e.deltaX || 0) * 5), + (e.wheelY = (e.deltaY || 0) * 5)); } n(e); }) : t.addListener(e, "DOMMouseScroll", function (e) { - e.axis && e.axis == e.HORIZONTAL_AXIS + (e.axis && e.axis == e.HORIZONTAL_AXIS ? ((e.wheelX = (e.detail || 0) * 5), (e.wheelY = 0)) : ((e.wheelX = 0), (e.wheelY = (e.detail || 0) * 5)), - n(e); + n(e)); }); }), (t.addMultiMouseDownListener = function (e, n, r, s) { @@ -1139,21 +1139,21 @@ if (i.isIE) { var c = Math.abs(e.clientX - u) > 5 || Math.abs(e.clientY - a) > 5; if (!f || c) o = 1; - f && clearTimeout(f), + (f && clearTimeout(f), (f = setTimeout( function () { f = null; }, n[o - 1] || 600, )), - o == 1 && ((u = e.clientX), (a = e.clientY)); + o == 1 && ((u = e.clientX), (a = e.clientY))); } - (e._clicks = o), r[s]("mousedown", e); + ((e._clicks = o), r[s]("mousedown", e)); if (o > 4) o = 0; else if (o > 1) return r[s](l[o], e); } function h(e) { - (o = 2), + ((o = 2), f && clearTimeout(f), (f = setTimeout( function () { @@ -1162,19 +1162,19 @@ n[o - 1] || 600, )), r[s]("mousedown", e), - r[s](l[o], e); + r[s](l[o], e)); } var o = 0, u, a, f, l = { 2: "dblclick", 3: "tripleclick", 4: "quadclick" }; - Array.isArray(e) || (e = [e]), + (Array.isArray(e) || (e = [e]), e.forEach(function (e) { - t.addListener(e, "mousedown", c), - i.isOldIE && t.addListener(e, "dblclick", h); - }); - }); + (t.addListener(e, "mousedown", c), + i.isOldIE && t.addListener(e, "dblclick", h)); + })); + })); var u = !i.isMac || !i.isOpera || "KeyboardEvent" in window ? function (e) { @@ -1195,25 +1195,25 @@ (e.ctrlKey ? 8 : 0) ); }; - (t.getModifierString = function (e) { + ((t.getModifierString = function (e) { return r.KEY_MODS[u(e)]; }), (t.addCommandKeyListener = function (e, n) { var r = t.addListener; if (i.isOldGecko || (i.isOpera && !("KeyboardEvent" in window))) { var o = null; - r(e, "keydown", function (e) { + (r(e, "keydown", function (e) { o = e.keyCode; }), r(e, "keypress", function (e) { return a(n, e, o); - }); + })); } else { var u = null; - r(e, "keydown", function (e) { + (r(e, "keydown", function (e) { s[e.keyCode] = (s[e.keyCode] || 0) + 1; var t = a(n, e, e.keyCode); - return (u = e.defaultPrevented), t; + return ((u = e.defaultPrevented), t); }), r(e, "keypress", function (e) { u && @@ -1223,9 +1223,9 @@ r(e, "keyup", function (e) { s[e.keyCode] = null; }), - s || (f(), r(window, "focus", f)); + s || (f(), r(window, "focus", f))); } - }); + })); if (typeof window == "object" && window.postMessage && !i.isOldIE) { var l = 1; t.nextTick = function (e, n) { @@ -1235,10 +1235,10 @@ s.data == r && (t.stopPropagation(s), t.removeListener(n, "message", i), e()); }; - t.addListener(n, "message", i), n.postMessage(r, "*"); + (t.addListener(n, "message", i), n.postMessage(r, "*")); }; } - (t.$idleBlocked = !1), + ((t.$idleBlocked = !1), (t.onIdle = function (e, n) { return setTimeout(function r() { t.$idleBlocked ? setTimeout(r, 100) : e(); @@ -1246,11 +1246,11 @@ }), (t.$idleBlockId = null), (t.blockIdle = function (e) { - t.$idleBlockId && clearTimeout(t.$idleBlockId), + (t.$idleBlockId && clearTimeout(t.$idleBlockId), (t.$idleBlocked = !0), (t.$idleBlockId = setTimeout(function () { t.$idleBlocked = !1; - }, e || 100)); + }, e || 100))); }), (t.nextFrame = typeof window == "object" && @@ -1263,7 +1263,7 @@ ? (t.nextFrame = t.nextFrame.bind(window)) : (t.nextFrame = function (e) { setTimeout(e, 17); - }); + })); }, ), define("ace/range", ["require", "exports", "module"], function (e, t, n) { @@ -1272,10 +1272,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -1420,11 +1420,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -1433,11 +1433,11 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/lib/lang", ["require", "exports", "module"], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -1450,10 +1450,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -1520,18 +1520,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -1542,28 +1542,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define( "ace/keyboard/textinput_ios", @@ -1591,7 +1591,7 @@ function x(e) { if (m) return; m = !0; - if (k) (t = 0), (n = e ? 0 : c.value.length - 1); + if (k) ((t = 0), (n = e ? 0 : c.value.length - 1)); else var t = 4, n = 5; @@ -1602,20 +1602,20 @@ } function T() { if (m) return; - (c.value = h), i.isWebKit && S.schedule(); + ((c.value = h), i.isWebKit && S.schedule()); } function R() { - clearTimeout(q), + (clearTimeout(q), (q = setTimeout(function () { - g && ((c.style.cssText = g), (g = "")), + (g && ((c.style.cssText = g), (g = "")), t.renderer.$keepTextAreaAtCursor == null && ((t.renderer.$keepTextAreaAtCursor = !0), - t.renderer.$moveTextAreaToCursor()); - }, 0)); + t.renderer.$moveTextAreaToCursor())); + }, 0))); } var n = this, c = s.createElement("textarea"); - (c.className = i.isIOS + ((c.className = i.isIOS ? "ace_text-input ace_text-input-ios" : "ace_text-input"), i.isTouchPad && c.setAttribute("x-palm-disable-auto-cap", !0), @@ -1624,7 +1624,7 @@ c.setAttribute("autocapitalize", "off"), c.setAttribute("spellcheck", !1), (c.style.opacity = "0"), - e.insertBefore(c, e.firstChild); + e.insertBefore(c, e.firstChild)); var h = "\n aaaa a\n", p = !1, d = !1, @@ -1635,34 +1635,34 @@ try { var b = document.activeElement === c; } catch (w) {} - r.addListener(c, "blur", function (e) { - t.onBlur(e), (b = !1); + (r.addListener(c, "blur", function (e) { + (t.onBlur(e), (b = !1)); }), r.addListener(c, "focus", function (e) { - (b = !0), t.onFocus(e), x(); + ((b = !0), t.onFocus(e), x()); }), (this.focus = function () { if (g) return c.focus(); - (c.style.position = "fixed"), c.focus(); + ((c.style.position = "fixed"), c.focus()); }), (this.blur = function () { c.blur(); }), (this.isFocused = function () { return b; - }); + })); var E = o.delayedCall(function () { b && x(y); }), S = o.delayedCall(function () { m || ((c.value = h), b && x()); }); - i.isWebKit || + (i.isWebKit || t.addEventListener("changeSelection", function () { t.selection.isEmpty() != y && ((y = !y), E.schedule()); }), T(), - b && t.onFocus(); + b && t.onFocus()); var N = function (e) { return e.selectionStart === 0 && e.selectionEnd === e.value.length; }, @@ -1670,16 +1670,16 @@ N(c) ? (t.selectAll(), x()) : k && x(t.selection.isEmpty()); }, k = null; - (this.setInputHandler = function (e) { + ((this.setInputHandler = function (e) { k = e; }), (this.getInputHandler = function () { return k; - }); + })); var L = !1, A = function (e) { if (c.selectionStart === 4 && c.selectionEnd === 5) return; - k && ((e = k(e)), (k = null)), + (k && ((e = k(e)), (k = null)), v ? (x(), e && t.onPaste(e), (v = !1)) : e == h.substr(0) && c.selectionStart === 4 @@ -1698,12 +1698,12 @@ (e = e.slice(0, -1)), e && t.onTextInput(e)), p && (p = !1), - L && (L = !1); + L && (L = !1)); }, O = function (e) { if (m) return; var t = c.value; - A(t), T(); + (A(t), T()); }, M = function (e, t, n) { var r = e.clipboardData || window.clipboardData; @@ -1730,7 +1730,7 @@ (c.value = s), c.select(), setTimeout(function () { - (p = !1), T(), x(), n ? t.onCut() : t.onCopy(); + ((p = !1), T(), x(), n ? t.onCut() : t.onCopy()); })); }, D = function (e) { @@ -1747,15 +1747,15 @@ r.preventDefault(e)) : ((c.value = ""), (v = !0)); }; - r.addCommandKeyListener(c, t.onCommandKey.bind(t)), + (r.addCommandKeyListener(c, t.onCommandKey.bind(t)), r.addListener(c, "select", C), r.addListener(c, "input", O), r.addListener(c, "cut", D), r.addListener(c, "copy", P), - r.addListener(c, "paste", H); + r.addListener(c, "paste", H)); var B = function (e) { if (m || !t.onCompositionStart || t.$readOnly) return; - (m = {}), + ((m = {}), (m.canUndo = t.session.$undoManager), t.onCompositionStart(), setTimeout(j, 0), @@ -1765,22 +1765,22 @@ (t.insert(""), t.session.markUndoGroup(), t.selection.clearSelection()), - t.session.markUndoGroup(); + t.session.markUndoGroup()); }, j = function () { if (!m || !t.onCompositionUpdate || t.$readOnly) return; var e = c.value.replace(/\x01/g, ""); if (m.lastValue === e) return; - t.onCompositionUpdate(e), + (t.onCompositionUpdate(e), m.lastValue && t.undo(), - m.canUndo && (m.lastValue = e); + m.canUndo && (m.lastValue = e)); if (m.lastValue) { var n = t.selection.getRange(); - t.insert(m.lastValue), + (t.insert(m.lastValue), t.session.markUndoGroup(), (m.range = t.selection.getRange()), t.selection.setRange(n), - t.selection.clearSelection(); + t.selection.clearSelection()); } }, F = function (e) { @@ -1793,7 +1793,7 @@ if (m) return; e == n.lastValue ? T() : !n.lastValue && e && (T(), A(e)); }); - (k = function (i) { + ((k = function (i) { return ( r && clearTimeout(r), (i = i.replace(/\x01/g, "")), @@ -1804,14 +1804,14 @@ t.removeListener("mousedown", F), e.type == "compositionend" && n.range && - t.selection.setRange(n.range); + t.selection.setRange(n.range)); var s = (!!i.isChrome && i.isChrome >= 53) || (!!i.isWebKit && i.isWebKit >= 603); s && O(); }, I = o.delayedCall(j, 50); - r.addListener(c, "compositionstart", B), + (r.addListener(c, "compositionstart", B), r.addListener(c, "compositionupdate", function () { I.schedule(); }), @@ -1829,57 +1829,57 @@ c.readOnly = e; }), (this.onContextMenu = function (e) { - (L = !0), + ((L = !0), x(t.selection.isEmpty()), t._emit("nativecontextmenu", { target: t, domEvent: e }), - this.moveToMouse(e, !0); + this.moveToMouse(e, !0)); }), (this.moveToMouse = function (e, n) { - g || (g = c.style.cssText), + (g || (g = c.style.cssText), (c.style.cssText = (n ? "z-index:100000;" : "") + "height:" + c.style.height + ";" + - (i.isIE ? "opacity:0.1;" : "")); + (i.isIE ? "opacity:0.1;" : ""))); var o = t.container.getBoundingClientRect(), u = s.computedStyle(t.container), a = o.top + (parseInt(u.borderTopWidth) || 0), f = o.left + (parseInt(o.borderLeftWidth) || 0), l = o.bottom - a - c.clientHeight - 2, h = function (e) { - (c.style.left = e.clientX - f - 2 + "px"), - (c.style.top = Math.min(e.clientY - a - 2, l) + "px"); + ((c.style.left = e.clientX - f - 2 + "px"), + (c.style.top = Math.min(e.clientY - a - 2, l) + "px")); }; h(e); if (e.type != "mousedown") return; - t.renderer.$keepTextAreaAtCursor && + (t.renderer.$keepTextAreaAtCursor && (t.renderer.$keepTextAreaAtCursor = null), clearTimeout(q), - i.isWin && r.capture(t.container, h, R); + i.isWin && r.capture(t.container, h, R)); }), - (this.onContextMenuClose = R); + (this.onContextMenuClose = R)); var q, U = function (e) { - t.textInput.onContextMenu(e), R(); + (t.textInput.onContextMenu(e), R()); }; - r.addListener(c, "mouseup", U), + (r.addListener(c, "mouseup", U), r.addListener(c, "mousedown", function (e) { - e.preventDefault(), R(); + (e.preventDefault(), R()); }), r.addListener(t.renderer.scroller, "contextmenu", U), - r.addListener(c, "contextmenu", U); + r.addListener(c, "contextmenu", U)); if (i.isIOS) { var z = null, W = !1; - e.addEventListener("keydown", function (e) { - z && clearTimeout(z), (W = !0); + (e.addEventListener("keydown", function (e) { + (z && clearTimeout(z), (W = !0)); }), e.addEventListener("keyup", function (e) { z = setTimeout(function () { W = !1; }, 100); - }); + })); var X = function (e) { if (document.activeElement !== c) return; if (W) return; @@ -1945,10 +1945,10 @@ } } }; - document.addEventListener("selectionchange", X), + (document.addEventListener("selectionchange", X), t.on("destroy", function () { document.removeEventListener("selectionchange", X); - }); + })); } }; t.TextInput = c; @@ -1990,53 +1990,53 @@ u = t.session.getLine(i); if (r.start.row != i) { var a = t.session.getLine(i - 1); - (s = r.start.row < i - 1 ? 0 : s), + ((s = r.start.row < i - 1 ? 0 : s), (o += a.length + 1), - (u = a + "\n" + u); + (u = a + "\n" + u)); } else if (r.end.row != i) { var f = t.session.getLine(i + 1); - (o = r.end.row > i + 1 ? f.length : o), + ((o = r.end.row > i + 1 ? f.length : o), (o += u.length + 1), - (u = u + "\n" + f); + (u = u + "\n" + f)); } u.length > l && (s < l && o < l ? (u = u.slice(0, l)) : ((u = "\n"), (s = 0), (o = 1))); var c = u + "\n\n"; - c != E && ((n.value = E = c), (S = x = c.length)), - O && ((S = n.selectionStart), (x = n.selectionEnd)); + (c != E && ((n.value = E = c), (S = x = c.length)), + O && ((S = n.selectionStart), (x = n.selectionEnd))); if (x != o || S != s) try { - n.setSelectionRange(s, o), (S = s), (x = o); + (n.setSelectionRange(s, o), (S = s), (x = o)); } catch (h) {} d = !1; } function R() { - (w = !0), n.blur(), n.focus(), (w = !1); + ((w = !0), n.blur(), n.focus(), (w = !1)); } function z(e) { - e.keyCode == 27 && + (e.keyCode == 27 && n.value.length < n.selectionStart && (d || (E = n.value), (S = x = -1), C()), - U(); + U()); } function X() { - clearTimeout(W), + (clearTimeout(W), (W = setTimeout(function () { - m && ((n.style.cssText = m), (m = "")), + (m && ((n.style.cssText = m), (m = "")), t.renderer.$keepTextAreaAtCursor == null && ((t.renderer.$keepTextAreaAtCursor = !0), - t.renderer.$moveTextAreaToCursor()); - }, 0)); + t.renderer.$moveTextAreaToCursor())); + }, 0))); } if (i.isIOS) return c.call(this, e, t); var n = s.createElement("textarea"); - (n.className = "ace_text-input"), + ((n.className = "ace_text-input"), n.setAttribute("wrap", "off"), n.setAttribute("autocorrect", "off"), n.setAttribute("autocapitalize", "off"), n.setAttribute("spellcheck", !1), (n.style.opacity = "0"), - e.insertBefore(n, e.firstChild); + e.insertBefore(n, e.firstChild)); var h = !1, p = !1, d = !1, @@ -2053,13 +2053,13 @@ try { var T = document.activeElement === n; } catch (N) {} - r.addListener(n, "blur", function (e) { + (r.addListener(n, "blur", function (e) { if (w) return; - t.onBlur(e), (T = !1); + (t.onBlur(e), (T = !1)); }), r.addListener(n, "focus", function (e) { if (w) return; - (T = !0), t.onFocus(e), C(); + ((T = !0), t.onFocus(e), C()); }), (this.$focusScroll = !1), (this.focus = function () { @@ -2067,27 +2067,27 @@ return n.focus({ preventScroll: !0 }); if (!document.documentElement.contains(n)) return; var e = n.style.top; - (n.style.position = "fixed"), (n.style.top = "0px"); + ((n.style.position = "fixed"), (n.style.top = "0px")); var t = n.getBoundingClientRect().top != 0, r = []; if (t) { var i = n.parentElement; while (i && i.nodeType == 1) - r.push(i), + (r.push(i), i.setAttribute("ace_nocontext", !0), !i.parentElement && i.getRootNode ? (i = i.getRootNode().host) - : (i = i.parentElement); + : (i = i.parentElement)); } - n.focus({ preventScroll: !0 }), + (n.focus({ preventScroll: !0 }), t && r.forEach(function (e) { e.removeAttribute("ace_nocontext"); }), setTimeout(function () { - (n.style.position = ""), - n.style.top == "0px" && (n.style.top = e); - }, 0); + ((n.style.position = ""), + n.style.top == "0px" && (n.style.top = e)); + }, 0)); }), (this.blur = function () { n.blur(); @@ -2097,9 +2097,9 @@ }), t.on("beforeEndOperation", function () { if (t.curOp && t.curOp.command.name == "insertstring") return; - d && ((E = n.value = ""), q()), C(); + (d && ((E = n.value = ""), q()), C()); }), - T && t.onFocus(); + T && t.onFocus()); var k = function (e) { return ( e.selectionStart === 0 && @@ -2114,16 +2114,16 @@ h ? (h = !1) : k(n) && (t.selectAll(), C()); }, A = null; - (this.setInputHandler = function (e) { + ((this.setInputHandler = function (e) { A = e; }), (this.getInputHandler = function () { return A; - }); + })); var O = !1, M = function (e, r) { O && (O = !1); - if (p) return C(), e && t.onPaste(e), (p = !1), ""; + if (p) return (C(), e && t.onPaste(e), (p = !1), ""); var i = n.selectionStart, s = n.selectionEnd, o = S, @@ -2132,14 +2132,14 @@ f = e.length - i, l = e.length - s, c = 0; - while (o > 0 && E[c] == e[c]) c++, o--; - (a = a.slice(c)), (c = 1); + while (o > 0 && E[c] == e[c]) (c++, o--); + ((a = a.slice(c)), (c = 1)); while ( u > 0 && E.length - c > S - 1 && E[E.length - c] == e[e.length - c] ) - c++, u--; + (c++, u--); return ( (f -= c - 1), (l -= c - 1), @@ -2187,7 +2187,7 @@ (n.value = s), n.select(), setTimeout(function () { - (h = !1), C(), i ? t.onCut() : t.onCopy(); + ((h = !1), C(), i ? t.onCut() : t.onCopy()); })); }, H = function (e) { @@ -2204,7 +2204,7 @@ r.preventDefault(e)) : ((n.value = ""), (p = !0)); }; - r.addCommandKeyListener(n, t.onCommandKey.bind(t)), + (r.addCommandKeyListener(n, t.onCommandKey.bind(t)), r.addListener(n, "select", L), r.addListener(n, "input", _), r.addListener(n, "cut", H), @@ -2223,14 +2223,14 @@ case 88: H(e); } - }); + })); var F = function (e) { if (d || !t.onCompositionStart || t.$readOnly) return; d = {}; if (b) return; - setTimeout(I, 0), t.on("mousedown", R); + (setTimeout(I, 0), t.on("mousedown", R)); var r = t.getSelectionRange(); - (r.end.row = r.start.row), + ((r.end.row = r.start.row), (r.end.column = r.start.column), (d.markerRange = r), (d.selectionStart = S), @@ -2238,7 +2238,7 @@ d.useTextareaForIME ? ((n.value = ""), (E = ""), (S = 0), (x = 0)) : (n.msGetInputContext && (d.context = n.msGetInputContext()), - n.getInputContext && (d.context = n.getInputContext())); + n.getInputContext && (d.context = n.getInputContext()))); }, I = function () { if (!d || !t.onCompositionUpdate || t.$readOnly) return; @@ -2246,21 +2246,21 @@ if (d.useTextareaForIME) t.onCompositionUpdate(n.value); else { var e = n.value; - M(e), + (M(e), d.markerRange && (d.context && (d.markerRange.start.column = d.selectionStart = d.context.compositionStartOffset), (d.markerRange.end.column = - d.markerRange.start.column + x - d.selectionStart)); + d.markerRange.start.column + x - d.selectionStart))); } }, q = function (e) { if (!t.onCompositionEnd || t.$readOnly) return; - (d = !1), t.onCompositionEnd(), t.off("mousedown", R), e && _(); + ((d = !1), t.onCompositionEnd(), t.off("mousedown", R), e && _()); }, U = o.delayedCall(I, 50).schedule.bind(null, null); - r.addListener(n, "compositionstart", F), + (r.addListener(n, "compositionstart", F), r.addListener(n, "compositionupdate", I), r.addListener(n, "keyup", z), r.addListener(n, "keydown", U), @@ -2269,7 +2269,7 @@ return n; }), (this.setCommandMode = function (e) { - (b = e), (n.readOnly = !1); + ((b = e), (n.readOnly = !1)); }), (this.setReadOnly = function (e) { b || (n.readOnly = e); @@ -2278,46 +2278,46 @@ y = e; }), (this.onContextMenu = function (e) { - (O = !0), + ((O = !0), C(), t._emit("nativecontextmenu", { target: t, domEvent: e }), - this.moveToMouse(e, !0); + this.moveToMouse(e, !0)); }), (this.moveToMouse = function (e, o) { - m || (m = n.style.cssText), + (m || (m = n.style.cssText), (n.style.cssText = (o ? "z-index:100000;" : "") + (i.isIE ? "opacity:0.1;" : "") + "text-indent: -" + (S + x) * t.renderer.characterWidth * 0.5 + - "px;"); + "px;")); var u = t.container.getBoundingClientRect(), a = s.computedStyle(t.container), f = u.top + (parseInt(a.borderTopWidth) || 0), l = u.left + (parseInt(u.borderLeftWidth) || 0), c = u.bottom - f - n.clientHeight - 2, h = function (e) { - (n.style.left = e.clientX - l - 2 + "px"), - (n.style.top = Math.min(e.clientY - f - 2, c) + "px"); + ((n.style.left = e.clientX - l - 2 + "px"), + (n.style.top = Math.min(e.clientY - f - 2, c) + "px")); }; h(e); if (e.type != "mousedown") return; - t.renderer.$keepTextAreaAtCursor && + (t.renderer.$keepTextAreaAtCursor && (t.renderer.$keepTextAreaAtCursor = null), clearTimeout(W), - i.isWin && r.capture(t.container, h, X); + i.isWin && r.capture(t.container, h, X)); }), - (this.onContextMenuClose = X); + (this.onContextMenuClose = X)); var W, V = function (e) { - t.textInput.onContextMenu(e), X(); + (t.textInput.onContextMenu(e), X()); }; - r.addListener(n, "mouseup", V), + (r.addListener(n, "mouseup", V), r.addListener(n, "mousedown", function (e) { - e.preventDefault(), X(); + (e.preventDefault(), X()); }), r.addListener(t.renderer.scroller, "contextmenu", V), - r.addListener(n, "contextmenu", V); + r.addListener(n, "contextmenu", V)); }; t.TextInput = h; }, @@ -2330,12 +2330,12 @@ function o(e) { e.$clickSelection = null; var t = e.editor; - t.setDefaultHandler("mousedown", this.onMouseDown.bind(e)), + (t.setDefaultHandler("mousedown", this.onMouseDown.bind(e)), t.setDefaultHandler("dblclick", this.onDoubleClick.bind(e)), t.setDefaultHandler("tripleclick", this.onTripleClick.bind(e)), t.setDefaultHandler("quadclick", this.onQuadClick.bind(e)), t.setDefaultHandler("mousewheel", this.onMouseWheel.bind(e)), - t.setDefaultHandler("touchmove", this.onTouchMove.bind(e)); + t.setDefaultHandler("touchmove", this.onTouchMove.bind(e))); var n = [ "select", "startSelect", @@ -2347,11 +2347,11 @@ "dragWaitEnd", "focusWait", ]; - n.forEach(function (t) { + (n.forEach(function (t) { e[t] = this[t]; }, this), (e.selectByLines = this.extendSelectionBy.bind(e, "getLineRange")), - (e.selectByWords = this.extendSelectionBy.bind(e, "getWordRange")); + (e.selectByWords = this.extendSelectionBy.bind(e, "getWordRange"))); } function u(e, t, n, r) { return Math.sqrt(Math.pow(n - e, 2) + Math.pow(r - t, 2)); @@ -2368,8 +2368,8 @@ var r = e("../lib/useragent"), i = 0, s = 250; - (function () { - (this.onMouseDown = function (e) { + ((function () { + ((this.onMouseDown = function (e) { var t = e.inSelection(), n = e.getDocumentPosition(); this.mousedownEvent = e; @@ -2378,17 +2378,17 @@ if (s !== 0) { var o = i.getSelectionRange(), u = o.isEmpty(); - (u || s == 1) && i.selection.moveToPosition(n), + ((u || s == 1) && i.selection.moveToPosition(n), s == 2 && (i.textInput.onContextMenu(e.domEvent), - r.isMozilla || e.preventDefault()); + r.isMozilla || e.preventDefault())); return; } this.mousedownEvent.time = Date.now(); if (t && !i.isFocused()) { i.focus(); if (this.$focusTimeout && !this.$clickSelection && !i.inMultiSelectMode) { - this.setState("focusWait"), this.captureMouse(e); + (this.setState("focusWait"), this.captureMouse(e)); return; } } @@ -2402,13 +2402,13 @@ e = e || this.editor.renderer.screenToTextCoordinates(this.x, this.y); var n = this.editor; if (!this.mousedownEvent) return; - this.mousedownEvent.getShiftKey() + (this.mousedownEvent.getShiftKey() ? n.selection.selectToPosition(e) : t || n.selection.moveToPosition(e), t || this.select(), n.renderer.scroller.setCapture && n.renderer.scroller.setCapture(), n.setStyle("ace_selecting"), - this.setState("select"); + this.setState("select")); }), (this.select = function () { var e, @@ -2420,11 +2420,11 @@ else if (r == 1) e = this.$clickSelection.start; else { var i = a(this.$clickSelection, n); - (n = i.cursor), (e = i.anchor); + ((n = i.cursor), (e = i.anchor)); } t.selection.setSelectionAnchor(e.row, e.column); } - t.selection.selectToPosition(n), t.renderer.scrollCursorIntoView(); + (t.selection.selectToPosition(n), t.renderer.scrollCursorIntoView()); }), (this.extendSelectionBy = function (e) { var t, @@ -2440,24 +2440,24 @@ } else if (o == 1 && s >= 0) { t = this.$clickSelection.start; if (i.start.row != r.row || i.start.column != r.column) r = i.end; - } else if (s == -1 && o == 1) (r = i.end), (t = i.start); + } else if (s == -1 && o == 1) ((r = i.end), (t = i.start)); else { var u = a(this.$clickSelection, r); - (r = u.cursor), (t = u.anchor); + ((r = u.cursor), (t = u.anchor)); } n.selection.setSelectionAnchor(t.row, t.column); } - n.selection.selectToPosition(r), n.renderer.scrollCursorIntoView(); + (n.selection.selectToPosition(r), n.renderer.scrollCursorIntoView()); }), (this.selectEnd = this.selectAllEnd = this.selectByWordsEnd = this.selectByLinesEnd = function () { - (this.$clickSelection = null), + ((this.$clickSelection = null), this.editor.unsetStyle("ace_selecting"), this.editor.renderer.scroller.releaseCapture && - this.editor.renderer.scroller.releaseCapture(); + this.editor.renderer.scroller.releaseCapture()); }), (this.focusWait = function () { var e = u(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y), @@ -2470,30 +2470,30 @@ n = this.editor, r = n.session, i = r.getBracketRange(t); - i + (i ? (i.isEmpty() && (i.start.column--, i.end.column++), this.setState("select")) : ((i = n.selection.getWordRange(t.row, t.column)), this.setState("selectByWords")), (this.$clickSelection = i), - this.select(); + this.select()); }), (this.onTripleClick = function (e) { var t = e.getDocumentPosition(), n = this.editor; this.setState("selectByLines"); var r = n.getSelectionRange(); - r.isMultiLine() && r.contains(t.row, t.column) + (r.isMultiLine() && r.contains(t.row, t.column) ? ((this.$clickSelection = n.selection.getLineRange(r.start.row)), (this.$clickSelection.end = n.selection.getLineRange(r.end.row).end)) : (this.$clickSelection = n.selection.getLineRange(t.row)), - this.select(); + this.select()); }), (this.onQuadClick = function (e) { var t = this.editor; - t.selectAll(), + (t.selectAll(), (this.$clickSelection = t.getSelectionRange()), - this.setState("selectAll"); + this.setState("selectAll")); }), (this.onMouseWheel = function (e) { if (e.getAccelKey()) return; @@ -2511,8 +2511,8 @@ i < s && ((o = (o + n.vx) / 2), (u = (u + n.vy) / 2)); var a = Math.abs(o / u), f = !1; - a >= 1 && t.renderer.isScrollableBy(e.wheelX * e.speed, 0) && (f = !0), - a <= 1 && t.renderer.isScrollableBy(0, e.wheelY * e.speed) && (f = !0); + (a >= 1 && t.renderer.isScrollableBy(e.wheelX * e.speed, 0) && (f = !0), + a <= 1 && t.renderer.isScrollableBy(0, e.wheelY * e.speed) && (f = !0)); if (f) n.allowed = r; else if (r - n.allowed < s) { var l = @@ -2520,7 +2520,7 @@ Math.abs(u) <= 1.1 * Math.abs(n.vy); l ? ((f = !0), (n.allowed = r)) : (n.allowed = 0); } - (n.t = r), (n.vx = o), (n.vy = u); + ((n.t = r), (n.vx = o), (n.vy = u)); if (f) return ( t.renderer.scrollBy(e.wheelX * e.speed, e.wheelY * e.speed), @@ -2529,9 +2529,9 @@ }), (this.onTouchMove = function (e) { this.editor._emit("mousewheel", e); - }); + })); }).call(o.prototype), - (t.DefaultHandlers = o); + (t.DefaultHandlers = o)); }, ), define( @@ -2540,12 +2540,12 @@ function (e, t, n) { "use strict"; function s(e) { - (this.isOpen = !1), (this.$element = null), (this.$parentNode = e); + ((this.isOpen = !1), (this.$element = null), (this.$parentNode = e)); } var r = e("./lib/oop"), i = e("./lib/dom"); - (function () { - (this.$init = function () { + ((function () { + ((this.$init = function () { return ( (this.$element = i.createElement("div")), (this.$element.className = "ace_tooltip"), @@ -2564,17 +2564,17 @@ this.getElement().innerHTML = e; }), (this.setPosition = function (e, t) { - (this.getElement().style.left = e + "px"), - (this.getElement().style.top = t + "px"); + ((this.getElement().style.left = e + "px"), + (this.getElement().style.top = t + "px")); }), (this.setClassName = function (e) { i.addCssClass(this.getElement(), e); }), (this.show = function (e, t, n) { - e != null && this.setText(e), + (e != null && this.setText(e), t != null && n != null && this.setPosition(t, n), this.isOpen || - ((this.getElement().style.display = "block"), (this.isOpen = !0)); + ((this.getElement().style.display = "block"), (this.isOpen = !0))); }), (this.hide = function () { this.isOpen && @@ -2587,13 +2587,13 @@ return this.getElement().offsetWidth; }), (this.destroy = function () { - (this.isOpen = !1), + ((this.isOpen = !1), this.$element && this.$element.parentNode && - this.$element.parentNode.removeChild(this.$element); - }); + this.$element.parentNode.removeChild(this.$element)); + })); }).call(s.prototype), - (t.Tooltip = s); + (t.Tooltip = s)); }, ), define( @@ -2621,26 +2621,26 @@ if (a > t.session.documentToScreenRow(l.row, l.column)) return c(); } if (f == s) return; - (f = s.text.join("
    ")), + ((f = s.text.join("
    ")), i.setHtml(f), i.show(), t._signal("showGutterTooltip", i), - t.on("mousewheel", c); + t.on("mousewheel", c)); if (e.$tooltipFollowsMouse) h(u); else { var p = u.domEvent.target, d = p.getBoundingClientRect(), v = i.getElement().style; - (v.left = d.right + "px"), (v.top = d.bottom + "px"); + ((v.left = d.right + "px"), (v.top = d.bottom + "px")); } } function c() { - o && (o = clearTimeout(o)), + (o && (o = clearTimeout(o)), f && (i.hide(), (f = null), t._signal("hideGutterTooltip", i), - t.removeEventListener("mousewheel", c)); + t.removeEventListener("mousewheel", c))); } function h(e) { i.setPosition(e.x, e.y); @@ -2656,29 +2656,29 @@ o = t.session.selection; if (r.getShiftKey()) o.selectTo(s, 0); else { - if (r.domEvent.detail == 2) return t.selectAll(), r.preventDefault(); + if (r.domEvent.detail == 2) return (t.selectAll(), r.preventDefault()); e.$clickSelection = t.selection.getLineRange(s); } - return e.setState("selectByLines"), e.captureMouse(r), r.preventDefault(); + return (e.setState("selectByLines"), e.captureMouse(r), r.preventDefault()); }); var o, u, f; - e.editor.setDefaultHandler("guttermousemove", function (t) { + (e.editor.setDefaultHandler("guttermousemove", function (t) { var n = t.domEvent.target || t.domEvent.srcElement; if (r.hasCssClass(n, "ace_fold-widget")) return c(); - f && e.$tooltipFollowsMouse && h(t), (u = t); + (f && e.$tooltipFollowsMouse && h(t), (u = t)); if (o) return; o = setTimeout(function () { - (o = null), u && !e.isMousePressed ? l() : c(); + ((o = null), u && !e.isMousePressed ? l() : c()); }, 50); }), s.addListener(t.renderer.$gutter, "mouseout", function (e) { u = null; if (!f || o) return; o = setTimeout(function () { - (o = null), c(); + ((o = null), c()); }, 50); }), - t.on("changeSession", c); + t.on("changeSession", c)); } function a(e) { o.call(this, e); @@ -2687,21 +2687,21 @@ i = e("../lib/oop"), s = e("../lib/event"), o = e("../tooltip").Tooltip; - i.inherits(a, o), + (i.inherits(a, o), function () { this.setPosition = function (e, t) { var n = window.innerWidth || document.documentElement.clientWidth, r = window.innerHeight || document.documentElement.clientHeight, i = this.getWidth(), s = this.getHeight(); - (e += 15), + ((e += 15), (t += 15), e + i > n && (e -= e + i - n), t + s > r && (t -= 20 + s), - o.prototype.setPosition.call(this, e, t); + o.prototype.setPosition.call(this, e, t)); }; }.call(a.prototype), - (t.GutterHandler = u); + (t.GutterHandler = u)); }, ), define( @@ -2712,24 +2712,24 @@ var r = e("../lib/event"), i = e("../lib/useragent"), s = (t.MouseEvent = function (e, t) { - (this.domEvent = e), + ((this.domEvent = e), (this.editor = t), (this.x = this.clientX = e.clientX), (this.y = this.clientY = e.clientY), (this.$pos = null), (this.$inSelection = null), (this.propagationStopped = !1), - (this.defaultPrevented = !1); + (this.defaultPrevented = !1)); }); (function () { - (this.stopPropagation = function () { - r.stopPropagation(this.domEvent), (this.propagationStopped = !0); + ((this.stopPropagation = function () { + (r.stopPropagation(this.domEvent), (this.propagationStopped = !0)); }), (this.preventDefault = function () { - r.preventDefault(this.domEvent), (this.defaultPrevented = !0); + (r.preventDefault(this.domEvent), (this.defaultPrevented = !0)); }), (this.stop = function () { - this.stopPropagation(), this.preventDefault(); + (this.stopPropagation(), this.preventDefault()); }), (this.getDocumentPosition = function () { return this.$pos @@ -2763,7 +2763,7 @@ } : function () { return this.domEvent.ctrlKey; - }); + })); }).call(s.prototype); }, ), @@ -2777,7 +2777,7 @@ var r = Date.now(), i = !n || e.row != n.row, s = !n || e.column != n.column; - if (!S || i || s) t.moveCursorToPosition(e), (S = r), (x = { x: p, y: d }); + if (!S || i || s) (t.moveCursorToPosition(e), (S = r), (x = { x: p, y: d })); else { var o = l(x.x, x.y, p, d); o > a @@ -2797,8 +2797,8 @@ f = Math.min(a.x.left, a.x.right), l = Math.min(a.y.top, a.y.bottom), c = { row: e.row, column: e.column }; - f / s <= 2 && (c.column += a.x.left < a.x.right ? -3 : 2), - l / i <= 1 && (c.row += a.y.top < a.y.bottom ? -1 : 1); + (f / s <= 2 && (c.column += a.x.left < a.x.right ? -3 : 2), + l / i <= 1 && (c.row += a.y.top < a.y.bottom ? -1 : 1)); var h = e.row != c.row, v = e.column != c.column, m = !n || e.row != n.row; @@ -2810,10 +2810,10 @@ } function C() { var e = g; - (g = t.renderer.screenToTextCoordinates(p, d)), T(g, e), N(g, e); + ((g = t.renderer.screenToTextCoordinates(p, d)), T(g, e), N(g, e)); } function k() { - (m = t.selection.toOrientedRange()), + ((m = t.selection.toOrientedRange()), (h = t.session.addMarker(m, "ace_selection", t.getSelectionStyle())), t.clearSelection(), t.isFocused() && t.renderer.$cursorLayer.setBlinking(!1), @@ -2821,10 +2821,10 @@ C(), (v = setInterval(C, 20)), (y = 0), - i.addListener(document, "mousemove", O); + i.addListener(document, "mousemove", O)); } function L() { - clearInterval(v), + (clearInterval(v), t.session.removeMarker(h), (h = null), t.selection.fromOrientedRange(m), @@ -2836,7 +2836,7 @@ (y = 0), (E = null), (S = null), - i.removeListener(document, "mousemove", O); + i.removeListener(document, "mousemove", O)); } function O() { A == null && @@ -2873,16 +2873,16 @@ } var t = e.editor, n = r.createElement("img"); - (n.src = + ((n.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="), s.isOpera && (n.style.cssText = - "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;"); + "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;")); var f = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; - f.forEach(function (t) { + (f.forEach(function (t) { e[t] = this[t]; }, this), - t.addEventListener("mousedown", this.onMouseDown.bind(e)); + t.addEventListener("mousedown", this.onMouseDown.bind(e))); var c = t.container, h, p, @@ -2896,36 +2896,36 @@ E, S, x; - (this.onDragStart = function (e) { + ((this.onDragStart = function (e) { if (this.cancelDrag || !c.draggable) { var r = this; return ( setTimeout(function () { - r.startSelect(), r.captureMouse(e); + (r.startSelect(), r.captureMouse(e)); }, 0), e.preventDefault() ); } m = t.getSelectionRange(); var i = e.dataTransfer; - (i.effectAllowed = t.getReadOnly() ? "copy" : "copyMove"), + ((i.effectAllowed = t.getReadOnly() ? "copy" : "copyMove"), s.isOpera && (t.container.appendChild(n), (n.scrollTop = 0)), i.setDragImage && i.setDragImage(n, 0, 0), s.isOpera && t.container.removeChild(n), i.clearData(), i.setData("Text", t.session.getTextRange()), (w = !0), - this.setState("drag"); + this.setState("drag")); }), (this.onDragEnd = function (e) { - (c.draggable = !1), (w = !1), this.setState(null); + ((c.draggable = !1), (w = !1), this.setState(null)); if (!t.getReadOnly()) { var n = e.dataTransfer.dropEffect; - !b && n == "move" && t.session.remove(t.getSelectionRange()), - t.renderer.$cursorLayer.setBlinking(!0); + (!b && n == "move" && t.session.remove(t.getSelectionRange()), + t.renderer.$cursorLayer.setBlinking(!0)); } - this.editor.unsetStyle("ace_dragging"), - this.editor.renderer.setCursorStyle(""); + (this.editor.unsetStyle("ace_dragging"), + this.editor.renderer.setCursorStyle("")); }), (this.onDragEnter = function (e) { if (t.getReadOnly() || !M(e.dataTransfer)) return; @@ -2951,7 +2951,7 @@ }), (this.onDragLeave = function (e) { y--; - if (y <= 0 && h) return L(), (b = null), i.preventDefault(e); + if (y <= 0 && h) return (L(), (b = null), i.preventDefault(e)); }), (this.onDrop = function (e) { if (!g) return; @@ -2968,16 +2968,18 @@ } else { var r = n.getData("Text"); - (m = { start: g, end: t.session.insert(g, r) }), t.focus(), (b = null); + ((m = { start: g, end: t.session.insert(g, r) }), + t.focus(), + (b = null)); } - return L(), i.preventDefault(e); + return (L(), i.preventDefault(e)); }), i.addListener(c, "dragstart", this.onDragStart.bind(e)), i.addListener(c, "dragend", this.onDragEnd.bind(e)), i.addListener(c, "dragenter", this.onDragEnter.bind(e)), i.addListener(c, "dragover", this.onDragOver.bind(e)), i.addListener(c, "dragleave", this.onDragLeave.bind(e)), - i.addListener(c, "drop", this.onDrop.bind(e)); + i.addListener(c, "drop", this.onDrop.bind(e))); var A = null; } function l(e, t, n, r) { @@ -2989,32 +2991,32 @@ o = 200, u = 200, a = 5; - (function () { - (this.dragWait = function () { + ((function () { + ((this.dragWait = function () { var e = Date.now() - this.mousedownEvent.time; e > this.editor.getDragDelay() && this.startDrag(); }), (this.dragWaitEnd = function () { var e = this.editor.container; - (e.draggable = !1), + ((e.draggable = !1), this.startSelect(this.mousedownEvent.getDocumentPosition()), - this.selectEnd(); + this.selectEnd()); }), (this.dragReadyEnd = function (e) { - this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()), + (this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()), this.editor.unsetStyle("ace_dragging"), this.editor.renderer.setCursorStyle(""), - this.dragWaitEnd(); + this.dragWaitEnd()); }), (this.startDrag = function () { this.cancelDrag = !1; var e = this.editor, t = e.container; - (t.draggable = !0), + ((t.draggable = !0), e.renderer.$cursorLayer.setBlinking(!1), - e.setStyle("ace_dragging"); + e.setStyle("ace_dragging")); var n = s.isWin ? "default" : "move"; - e.renderer.setCursorStyle(n), this.setState("dragReady"); + (e.renderer.setCursorStyle(n), this.setState("dragReady")); }), (this.onMouseDrag = function (e) { var t = this.editor.container; @@ -3050,29 +3052,29 @@ } this.setState("dragWait"); } else this.startDrag(); - this.captureMouse(e, this.onMouseDrag.bind(this)), - (e.defaultPrevented = !0); + (this.captureMouse(e, this.onMouseDrag.bind(this)), + (e.defaultPrevented = !0)); } - }); + })); }).call(f.prototype), - (t.DragdropHandler = f); + (t.DragdropHandler = f)); }, ), define("ace/lib/net", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { "use strict"; var r = e("./dom"); - (t.get = function (e, t) { + ((t.get = function (e, t) { var n = new XMLHttpRequest(); - n.open("GET", e, !0), + (n.open("GET", e, !0), (n.onreadystatechange = function () { n.readyState === 4 && t(n.responseText); }), - n.send(null); + n.send(null)); }), (t.loadScript = function (e, t) { var n = r.getDocumentHead(), i = document.createElement("script"); - (i.src = e), + ((i.src = e), n.appendChild(i), (i.onload = i.onreadystatechange = function (e, n) { @@ -3082,13 +3084,13 @@ i.readyState == "loaded" || i.readyState == "complete" ) - (i = i.onload = i.onreadystatechange = null), n || t(); - }); + ((i = i.onload = i.onreadystatechange = null), n || t()); + })); }), (t.qualifyURL = function (e) { var t = document.createElement("a"); - return (t.href = e), t.href; - }); + return ((t.href = e), t.href); + })); }), define("ace/lib/event_emitter", ["require", "exports", "module"], function (e, t, n) { "use strict"; @@ -3099,18 +3101,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -3127,7 +3129,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -3136,7 +3138,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -3175,7 +3177,7 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define( "ace/lib/app_config", @@ -3189,11 +3191,11 @@ } function u(e, t) { var n = new Error(e); - (n.data = t), + ((n.data = t), typeof console == "object" && console.error && console.error(n), setTimeout(function () { throw n; - }); + })); } var r = e("./oop"), i = e("./event_emitter").EventEmitter, @@ -3224,7 +3226,7 @@ if (!n) return o('misspelled option "' + e + '"'); if (n.forwardTo) return this[n.forwardTo] && this[n.forwardTo].setOption(e, t); - n.handlesSet || (this["$" + e] = t), n && n.set && n.set.call(this, t); + (n.handlesSet || (this["$" + e] = t), n && n.set && n.set.call(this, t)); }, getOption: function (e) { var t = this.$options[e]; @@ -3240,17 +3242,17 @@ a = function () { this.$defaultOptions = {}; }; - (function () { - r.implement(this, i), + ((function () { + (r.implement(this, i), (this.defineOptions = function (e, t, n) { return ( e.$options || (this.$defaultOptions[t] = e.$options = {}), Object.keys(n).forEach(function (t) { var r = n[t]; - typeof r == "string" && (r = { forwardTo: r }), + (typeof r == "string" && (r = { forwardTo: r }), r.name || (r.name = t), (e.$options[r.name] = r), - "initialValue" in r && (e["$" + r.name] = r.initialValue); + "initialValue" in r && (e["$" + r.name] = r.initialValue)); }), r.implement(e, s), this @@ -3275,9 +3277,9 @@ }, this); }), (this.warn = o), - (this.reportError = u); + (this.reportError = u)); }).call(a.prototype), - (t.AppConfig = a); + (t.AppConfig = a)); }, ), define( @@ -3314,12 +3316,12 @@ var b = d.match(/^(.*)\/ace(\-\w+)?\.js(\?|$)/); b && (s = b[1]); } - s && ((i.base = i.base || s), (i.packaged = !0)), + (s && ((i.base = i.base || s), (i.packaged = !0)), (i.basePath = i.base), (i.workerPath = i.workerPath || i.base), (i.modePath = i.modePath || i.base), (i.themePath = i.themePath || i.base), - delete i.base; + delete i.base); for (var w in i) typeof i[w] != "undefined" && t.set(w, i[w]); } function c(e) { @@ -3344,7 +3346,7 @@ suffix: ".js", $moduleUrls: {}, }; - (t.get = function (e) { + ((t.get = function (e) { if (!a.hasOwnProperty(e)) throw new Error("Unknown config key: " + e); return a[e]; }), @@ -3385,21 +3387,21 @@ i = e(n); } catch (u) {} if (i && !t.$loading[n]) return r && r(i); - t.$loading[n] || (t.$loading[n] = []), t.$loading[n].push(r); + (t.$loading[n] || (t.$loading[n] = []), t.$loading[n].push(r)); if (t.$loading[n].length > 1) return; var a = function () { e([n], function (e) { t._emit("load.module", { name: n, module: e }); var r = t.$loading[n]; - (t.$loading[n] = null), + ((t.$loading[n] = null), r.forEach(function (t) { t && t(e); - }); + })); }); }; if (!t.get("packaged")) return a(); - s.loadScript(t.moduleUrl(n, o), a), f(); - }); + (s.loadScript(t.moduleUrl(n, o), a), f()); + })); var f = function () { !a.basePath && !a.workerPath && @@ -3441,7 +3443,7 @@ f = e("../config"), l = function (e) { var t = this; - (this.editor = e), new s(this), new o(this), new a(this); + ((this.editor = e), new s(this), new o(this), new a(this)); var n = function (t) { var n = !document.hasFocus || @@ -3449,10 +3451,10 @@ (!e.isFocused() && document.activeElement == (e.textInput && e.textInput.getElement())); - n && window.focus(), e.focus(); + (n && window.focus(), e.focus()); }, u = e.renderer.getMouseEventTarget(); - r.addListener(u, "click", this.onMouseEvent.bind(this, "click")), + (r.addListener(u, "click", this.onMouseEvent.bind(this, "click")), r.addListener(u, "mousemove", this.onMouseMove.bind(this, "mousemove")), r.addMultiMouseDownListener( [ @@ -3472,9 +3474,9 @@ r.addTouchMoveListener( e.container, this.onTouchMove.bind(this, "touchmove"), - ); + )); var f = e.renderer.$gutter; - r.addListener(f, "mousedown", this.onMouseEvent.bind(this, "guttermousedown")), + (r.addListener(f, "mousedown", this.onMouseEvent.bind(this, "guttermousedown")), r.addListener(f, "click", this.onMouseEvent.bind(this, "gutterclick")), r.addListener( f, @@ -3500,10 +3502,10 @@ !i.isEmpty() && i.insideStart(r.row, r.column) ? s.setCursorStyle("default") : s.setCursorStyle(""); - }); + })); }; - (function () { - (this.onMouseEvent = function (e, t) { + ((function () { + ((this.onMouseEvent = function (e, t) { this.editor._emit(e, new u(t, this.editor)); }), (this.onMouseMove = function (e, t) { @@ -3513,23 +3515,23 @@ }), (this.onMouseWheel = function (e, t) { var n = new u(t, this.editor); - (n.speed = this.$scrollSpeed * 2), + ((n.speed = this.$scrollSpeed * 2), (n.wheelX = t.wheelX), (n.wheelY = t.wheelY), - this.editor._emit(e, n); + this.editor._emit(e, n)); }), (this.onTouchMove = function (e, t) { var n = new u(t, this.editor); - (n.speed = 1), + ((n.speed = 1), (n.wheelX = t.wheelX), (n.wheelY = t.wheelY), - this.editor._emit(e, n); + this.editor._emit(e, n)); }), (this.setState = function (e) { this.state = e; }), (this.captureMouse = function (e, t) { - (this.x = e.x), (this.y = e.y), (this.isMousePressed = !0); + ((this.x = e.x), (this.y = e.y), (this.isMousePressed = !0)); var n = this.editor, s = this.editor.renderer; s.$keepTextAreaAtCursor && (s.$keepTextAreaAtCursor = null); @@ -3538,14 +3540,14 @@ if (!e) return; if (i.isWebKit && !e.which && o.releaseMouse) return o.releaseMouse(); - (o.x = e.clientX), + ((o.x = e.clientX), (o.y = e.clientY), t && t(e), (o.mouseEvent = new u(e, o.editor)), - (o.$mouseMoved = !0); + (o.$mouseMoved = !0)); }, f = function (e) { - n.off("beforeEndOperation", c), + (n.off("beforeEndOperation", c), clearInterval(h), l(), o[o.state + "End"] && o[o.state + "End"](e), @@ -3555,10 +3557,10 @@ (o.isMousePressed = !1), (o.$onCaptureMouseMove = o.releaseMouse = null), e && o.onMouseEvent("mouseup", e), - n.endOperation(); + n.endOperation()); }, l = function () { - o[o.state] && o[o.state](), (o.$mouseMoved = !1); + (o[o.state] && o[o.state](), (o.$mouseMoved = !1)); }; if (i.isOldIE && e.domEvent.type == "dblclick") return setTimeout(function () { @@ -3572,21 +3574,21 @@ (o.state = ""), o.releaseMouse()); }; - n.on("beforeEndOperation", c), + (n.on("beforeEndOperation", c), n.startOperation({ command: { name: "mouse" } }), (o.$onCaptureMouseMove = a), - (o.releaseMouse = r.capture(this.editor.container, a, f)); + (o.releaseMouse = r.capture(this.editor.container, a, f))); var h = setInterval(l, 20); }), (this.releaseMouse = null), (this.cancelContextMenu = function () { var e = function (t) { if (t && t.domEvent && t.domEvent.type != "contextmenu") return; - this.editor.off("nativecontextmenu", e), - t && t.domEvent && r.stopEvent(t.domEvent); + (this.editor.off("nativecontextmenu", e), + t && t.domEvent && r.stopEvent(t.domEvent)); }.bind(this); - setTimeout(e, 10), this.editor.on("nativecontextmenu", e); - }); + (setTimeout(e, 10), this.editor.on("nativecontextmenu", e)); + })); }).call(l.prototype), f.defineOptions(l.prototype, "mouseHandler", { scrollSpeed: { initialValue: 2 }, @@ -3595,7 +3597,7 @@ focusTimeout: { initialValue: 0 }, tooltipFollowsMouse: { initialValue: !0 }, }), - (t.MouseHandler = l); + (t.MouseHandler = l)); }, ), define( @@ -3604,7 +3606,7 @@ function (e, t, n) { "use strict"; function i(e) { - e.on("click", function (t) { + (e.on("click", function (t) { var n = t.getDocumentPosition(), i = e.session, s = i.getFoldAt(n.row, n.column, 1); @@ -3620,9 +3622,9 @@ if (n == "foldWidgets") { var r = t.getDocumentPosition().row, i = e.session; - i.foldWidgets && i.foldWidgets[r] && e.session.onFoldWidgetClick(r, t), + (i.foldWidgets && i.foldWidgets[r] && e.session.onFoldWidgetClick(r, t), e.isFocused() || e.focus(), - t.stop(); + t.stop()); } }), e.on("gutterdblclick", function (t) { @@ -3645,7 +3647,7 @@ } t.stop(); } - }); + })); } var r = e("../lib/dom"); t.FoldHandler = i; @@ -3659,16 +3661,16 @@ var r = e("../lib/keys"), i = e("../lib/event"), s = function (e) { - (this.$editor = e), + ((this.$editor = e), (this.$data = { editor: e }), (this.$handlers = []), - this.setDefaultHandler(e.commands); + this.setDefaultHandler(e.commands)); }; - (function () { - (this.setDefaultHandler = function (e) { - this.removeKeyboardHandler(this.$defaultHandler), + ((function () { + ((this.setDefaultHandler = function (e) { + (this.removeKeyboardHandler(this.$defaultHandler), (this.$defaultHandler = e), - this.addKeyboardHandler(e, 0); + this.addKeyboardHandler(e, 0)); }), (this.setKeyboardHandler = function (e) { var t = this.$handlers; @@ -3681,11 +3683,11 @@ if (!e) return; typeof e == "function" && !e.handleKeyboard && (e.handleKeyboard = e); var n = this.$handlers.indexOf(e); - n != -1 && this.$handlers.splice(n, 1), + (n != -1 && this.$handlers.splice(n, 1), t == undefined ? this.$handlers.push(e) : this.$handlers.splice(t, 0, e), - n == -1 && e.attach && e.attach(this.$editor); + n == -1 && e.attach && e.attach(this.$editor)); }), (this.removeKeyboardHandler = function (e) { var t = this.$handlers.indexOf(e); @@ -3713,7 +3715,7 @@ for (var a = this.$handlers.length; a--; ) { s = this.$handlers[a].handleKeyboard(this.$data, e, t, n, r); if (!s || !s.command) continue; - s.command == "null" + (s.command == "null" ? (o = !0) : (o = u.exec(s.command, this.$editor, s.args, r)), o && @@ -3721,7 +3723,7 @@ e != -1 && s.passEvent != 1 && s.command.passEvent != 1 && - i.stopEvent(r); + i.stopEvent(r)); if (o) break; } return ( @@ -3741,9 +3743,9 @@ }), (this.onTextInput = function (e) { this.$callKeyboardHandlers(-1, e); - }); + })); }).call(s.prototype), - (t.KeyBinding = s); + (t.KeyBinding = s)); }, ), define("ace/lib/bidiutil", ["require", "exports", "module"], function (e, t, n) { @@ -3761,14 +3763,14 @@ E = null, T = []; if (!r) for (w = 0, r = []; w < n; w++) r[w] = R(e[w]); - (o = s), (u = !1), (a = !1), (f = !1), (l = !1); + ((o = s), (u = !1), (a = !1), (f = !1), (l = !1)); for (E = 0; E < n; E++) { - (c = m), + ((c = m), (T[E] = h = q(e, r, T, E)), (m = i[c][h]), (g = m & 240), (m &= 15), - (t[E] = v = i[m][5]); + (t[E] = v = i[m][5])); if (g > 0) if (g == 16) { for (w = b; w < E; w++) t[w] = 1; @@ -3780,7 +3782,7 @@ for (w = b; w < E; w++) t[w] = v; b = -1; } - r[E] == S && (t[E] = 0), (o |= v); + (r[E] == S && (t[E] = 0), (o |= v)); } if (l) for (w = 0; w < n; w++) @@ -3808,7 +3810,7 @@ if (t[i] >= e) { u = i + 1; while (u < r && t[u] >= e) u++; - for (a = i, l = u - 1; a < l; a++, l--) (c = n[a]), (n[a] = n[l]), (n[l] = c); + for (a = i, l = u - 1; a < l; a++, l--) ((c = n[a]), (n[a] = n[l]), (n[l] = c)); i = u; } i++; @@ -3830,7 +3832,7 @@ case b: return u ? w : b; case T: - return (u = !0), (a = !0), y; + return ((u = !0), (a = !0), y); case N: return E; case C: @@ -3841,7 +3843,7 @@ ((c = t[r + 1]) != b && c != w) ) return E; - return u && (c = w), c == o ? c : E; + return (u && (c = w), c == o ? c : E); case k: o = r > 0 ? n[r - 1] : S; if (o == b && r + 1 < t.length && t[r + 1] == b) return b; @@ -3849,12 +3851,12 @@ case L: if (r > 0 && n[r - 1] == b) return b; if (u) return E; - (p = r + 1), (h = t.length); + ((p = r + 1), (h = t.length)); while (p < h && t[p] == L) p++; if (p < h && t[p] == b) return b; return E; case A: - (h = t.length), (p = r + 1); + ((h = t.length), (p = r + 1)); while (p < h && t[p] == A) p++; if (p < h) { var d = e[r], @@ -3865,9 +3867,9 @@ if (r < 1 || (o = t[r - 1]) == S) return E; return n[r - 1]; case S: - return (u = !1), (f = !0), s; + return ((u = !1), (f = !0), s); case x: - return (l = !0), E; + return ((l = !0), E); case O: case M: case D: @@ -4247,7 +4249,7 @@ E, N, ]; - (t.L = g), + ((t.L = g), (t.R = y), (t.EN = b), (t.ON_R = 3), @@ -4262,9 +4264,9 @@ o = new Array(i.length), u = new Array(i.length), a = []; - (s = r ? m : v), F(i, a, i.length, n); + ((s = r ? m : v), F(i, a, i.length, n)); for (var f = 0; f < o.length; o[f] = f, f++); - I(2, a, o), I(1, a, o); + (I(2, a, o), I(1, a, o)); for (var f = 0; f < o.length - 1; f++) n[f] === w ? (a[f] = t.AN) @@ -4274,23 +4276,23 @@ i[f - 1] === "\u0644" && /\u0622|\u0623|\u0625|\u0627/.test(i[f]) && ((a[f - 1] = a[f] = t.R_H), f++); - i[i.length - 1] === t.DOT && (a[i.length - 1] = t.B), - i[0] === "\u202b" && (a[0] = t.RLE); + (i[i.length - 1] === t.DOT && (a[i.length - 1] = t.B), + i[0] === "\u202b" && (a[0] = t.RLE)); for (var f = 0; f < o.length; f++) u[f] = a[o[f]]; return { logicalFromVisual: o, bidiLevels: u }; }), (t.hasBidiCharacters = function (e, t) { var n = !1; for (var r = 0; r < e.length; r++) - (t[r] = R(e.charAt(r))), - !n && (t[r] == y || t[r] == T || t[r] == w) && (n = !0); + ((t[r] = R(e.charAt(r))), + !n && (t[r] == y || t[r] == T || t[r] == w) && (n = !0)); return n; }), (t.getVisualFromLogicalIdx = function (e, t) { for (var n = 0; n < t.logicalFromVisual.length; n++) if (t.logicalFromVisual[n] == e) return n; return 0; - }); + })); }), define( "ace/bidihandler", @@ -4301,7 +4303,7 @@ i = e("./lib/lang"), s = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\u202B]/, o = function (e) { - (this.session = e), + ((this.session = e), (this.bidiMap = {}), (this.currentRow = null), (this.bidiUtil = r), @@ -4318,10 +4320,10 @@ (this.rtlLineOffset = 0), (this.wrapOffset = 0), (this.isMoveLeftOperation = !1), - (this.seenBidi = s.test(e.getValue())); + (this.seenBidi = s.test(e.getValue()))); }; - (function () { - (this.isBidiRow = function (e, t, n) { + ((function () { + ((this.isBidiRow = function (e, t, n) { return this.seenBidi ? (e !== this.currentRow && ((this.currentRow = e), @@ -4355,7 +4357,7 @@ while (this.currentRow - e > 0) { n = this.session.$getRowCacheIndex(t, this.currentRow - e - 1); if (n !== r) break; - (r = n), e++; + ((r = n), e++); } } else e = this.currentRow; return e; @@ -4364,12 +4366,12 @@ e === undefined && (e = this.getDocumentRow()); var n = e === this.session.getLength() - 1, s = n ? this.EOF : this.EOL; - (this.wrapIndent = 0), + ((this.wrapIndent = 0), (this.line = this.session.getLine(e)), - (this.isRtlDir = this.line.charAt(0) === this.RLE); + (this.isRtlDir = this.line.charAt(0) === this.RLE)); if (this.session.$useWrapMode) { var o = this.session.$wrapData[e]; - o && + (o && (t === undefined && (t = this.getSplitIndex()), t > 0 && o.length ? ((this.wrapIndent = o.indent), @@ -4379,12 +4381,12 @@ ? this.line.substring(o[t - 1], o[t]) : this.line.substring(o[o.length - 1]))) : (this.line = this.line.substring(0, o[t]))), - t == o.length && (this.line += this.showInvisibles ? s : r.DOT); + t == o.length && (this.line += this.showInvisibles ? s : r.DOT)); } else this.line += this.showInvisibles ? s : r.DOT; var u = this.session, a = 0, f; - (this.line = this.line.replace( + ((this.line = this.line.replace( /\t|[\u1100-\u2029, \u202F-\uFFE6]/g, function (e, t) { return e === " " || u.isFullWidth(e.charCodeAt(0)) @@ -4401,7 +4403,7 @@ : this.line), (this.rtlLineOffset = this.contentWidth - - this.fontMetrics.$main.getBoundingClientRect().width)); + this.fontMetrics.$main.getBoundingClientRect().width))); }), (this.updateBidiMap = function () { var e = []; @@ -4417,17 +4419,17 @@ this.fontMetrics = e; var t = (this.characterWidth = e.$characterSize.width), n = e.$measureCharWidth("\u05d4"); - (this.charWidths[r.L] = + ((this.charWidths[r.L] = this.charWidths[r.EN] = this.charWidths[r.ON_R] = t), (this.charWidths[r.R] = this.charWidths[r.AN] = n), (this.charWidths[r.R_H] = n * 0.45), (this.charWidths[r.B] = this.charWidths[r.RLE] = 0), - (this.currentRow = null); + (this.currentRow = null)); }), (this.setShowInvisibles = function (e) { - (this.showInvisibles = e), (this.currentRow = null); + ((this.showInvisibles = e), (this.currentRow = null)); }), (this.setEolChar = function (e) { this.EOL = e; @@ -4486,12 +4488,12 @@ this.wrapIndent && (o += this.isRtlDir ? -1 * this.wrapOffset : this.wrapOffset); for (var h, p = 0; p < r.length; p++) - (h = n.logicalFromVisual[p]), + ((h = n.logicalFromVisual[p]), (i = r[p]), (f = h >= u && h < a), f && !l ? (c = o) : !f && l && s.push({ left: c, width: o - c }), (o += this.charWidths[i]), - (l = f); + (l = f)); f && p === r.length && s.push({ left: c, width: o - c }); if (this.isRtlDir) for (var d = 0; d < s.length; d++) s[d].left += this.rtlLineOffset; @@ -4535,9 +4537,9 @@ t === 0 && this.isRtlDir && t++, t + this.wrapIndent ); - }); + })); }).call(o.prototype), - (t.BidiHandler = o); + (t.BidiHandler = o)); }, ), define( @@ -4558,28 +4560,28 @@ s = e("./lib/event_emitter").EventEmitter, o = e("./range").Range, u = function (e) { - (this.session = e), + ((this.session = e), (this.doc = e.getDocument()), this.clearSelection(), (this.cursor = this.lead = this.doc.createAnchor(0, 0)), (this.anchor = this.doc.createAnchor(0, 0)), - (this.$silent = !1); + (this.$silent = !1)); var t = this; - this.cursor.on("change", function (e) { - (t.$cursorChanged = !0), + (this.cursor.on("change", function (e) { + ((t.$cursorChanged = !0), t.$silent || t._emit("changeCursor"), !t.$isEmpty && !t.$silent && t._emit("changeSelection"), !t.$keepDesiredColumnOnChange && e.old.column != e.value.column && - (t.$desiredColumn = null); + (t.$desiredColumn = null)); }), this.anchor.on("change", function () { - (t.$anchorChanged = !0), - !t.$isEmpty && !t.$silent && t._emit("changeSelection"); - }); + ((t.$anchorChanged = !0), + !t.$isEmpty && !t.$silent && t._emit("changeSelection")); + })); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.isEmpty = function () { return ( this.$isEmpty || @@ -4594,7 +4596,7 @@ return this.lead.getPosition(); }), (this.setSelectionAnchor = function (e, t) { - (this.$isEmpty = !1), this.anchor.setPosition(e, t); + ((this.$isEmpty = !1), this.anchor.setPosition(e, t)); }), (this.getAnchor = this.getSelectionAnchor = function () { @@ -4634,7 +4636,7 @@ (this.$setSelection = function (e, t, n, r) { var i = this.$isEmpty, s = this.inMultiSelectMode; - (this.$silent = !0), + ((this.$silent = !0), (this.$cursorChanged = this.$anchorChanged = !1), this.anchor.setPosition(e, t), this.cursor.setPosition(n, r), @@ -4645,11 +4647,11 @@ this.$anchorChanged || i != this.$isEmpty || s) && - this._emit("changeSelection"); + this._emit("changeSelection")); }), (this.$moveSelection = function (e) { var t = this.lead; - this.$isEmpty && this.setSelectionAnchor(t.row, t.column), e.call(this); + (this.$isEmpty && this.setSelectionAnchor(t.row, t.column), e.call(this)); }), (this.selectTo = function (e, t) { this.$moveSelection(function () { @@ -4662,10 +4664,10 @@ }); }), (this.moveTo = function (e, t) { - this.clearSelection(), this.moveCursorTo(e, t); + (this.clearSelection(), this.moveCursorTo(e, t)); }), (this.moveToPosition = function (e) { - this.clearSelection(), this.moveCursorToPosition(e); + (this.clearSelection(), this.moveCursorToPosition(e)); }), (this.selectUp = function () { this.$moveSelection(this.moveCursorUp); @@ -4700,7 +4702,7 @@ (this.getWordRange = function (e, t) { if (typeof t == "undefined") { var n = e || this.lead; - (e = n.row), (t = n.column); + ((e = n.row), (t = n.column)); } return this.session.getWordRange(e, t); }), @@ -4781,10 +4783,10 @@ r = this.session.screenToDocumentPosition(n, 0), i = this.session.getDisplayLine(e, null, r.row, r.column), s = i.match(/^\s*/); - s[0].length != t && + (s[0].length != t && !this.session.$useEmacsStyleLineStart && (r.column += s[0].length), - this.moveCursorToPosition(r); + this.moveCursorToPosition(r)); }), (this.moveCursorLineEnd = function () { var e = this.lead, @@ -4811,8 +4813,8 @@ t = this.lead.column, n = this.doc.getLine(e), r = n.substring(t); - (this.session.nonTokenRe.lastIndex = 0), - (this.session.tokenRe.lastIndex = 0); + ((this.session.nonTokenRe.lastIndex = 0), + (this.session.tokenRe.lastIndex = 0)); var i = this.session.getFoldAt(e, t, 1); if (i) { this.moveCursorTo(i.end.row, i.end.column); @@ -4823,15 +4825,15 @@ (this.session.nonTokenRe.lastIndex = 0), (r = n.substring(t))); if (t >= n.length) { - this.moveCursorTo(e, n.length), + (this.moveCursorTo(e, n.length), this.moveCursorRight(), - e < this.doc.getLength() - 1 && this.moveCursorWordRight(); + e < this.doc.getLength() - 1 && this.moveCursorWordRight()); return; } - this.session.tokenRe.exec(r) && + (this.session.tokenRe.exec(r) && ((t += this.session.tokenRe.lastIndex), (this.session.tokenRe.lastIndex = 0)), - this.moveCursorTo(e, t); + this.moveCursorTo(e, t)); }), (this.moveCursorLongWordLeft = function () { var e = this.lead.row, @@ -4844,22 +4846,22 @@ var r = this.session.getFoldStringAt(e, t, -1); r == null && (r = this.doc.getLine(e).substring(0, t)); var s = i.stringReverse(r); - (this.session.nonTokenRe.lastIndex = 0), + ((this.session.nonTokenRe.lastIndex = 0), (this.session.tokenRe.lastIndex = 0), this.session.nonTokenRe.exec(s) && ((t -= this.session.nonTokenRe.lastIndex), (s = s.slice(this.session.nonTokenRe.lastIndex)), - (this.session.nonTokenRe.lastIndex = 0)); + (this.session.nonTokenRe.lastIndex = 0))); if (t <= 0) { - this.moveCursorTo(e, 0), + (this.moveCursorTo(e, 0), this.moveCursorLeft(), - e > 0 && this.moveCursorWordLeft(); + e > 0 && this.moveCursorWordLeft()); return; } - this.session.tokenRe.exec(s) && + (this.session.tokenRe.exec(s) && ((t -= this.session.tokenRe.lastIndex), (this.session.tokenRe.lastIndex = 0)), - this.moveCursorTo(e, t); + this.moveCursorTo(e, t)); }), (this.$shortWordEndIndex = function (e) { var t = 0, @@ -4873,7 +4875,7 @@ if (t < 1) { i.lastIndex = 0; while ((n = e[t]) && !i.test(n)) { - (i.lastIndex = 0), t++; + ((i.lastIndex = 0), t++); if (r.test(n)) { if (t > 2) { t--; @@ -4885,7 +4887,7 @@ } } } - return (i.lastIndex = 0), t; + return ((i.lastIndex = 0), t); }), (this.moveCursorShortWordRight = function () { var e = this.lead.row, @@ -4896,9 +4898,9 @@ if (i) return this.moveCursorTo(i.end.row, i.end.column); if (t == n.length) { var s = this.doc.getLength(); - do e++, (r = this.doc.getLine(e)); + do (e++, (r = this.doc.getLine(e))); while (e < s && /^\s*$/.test(r)); - /^\s+/.test(r) || (r = ""), (t = 0); + (/^\s+/.test(r) || (r = ""), (t = 0)); } var o = this.$shortWordEndIndex(r); this.moveCursorTo(e, t + o); @@ -4911,9 +4913,9 @@ return this.moveCursorTo(n.start.row, n.start.column); var r = this.session.getLine(e).substring(0, t); if (t === 0) { - do e--, (r = this.doc.getLine(e)); + do (e--, (r = this.doc.getLine(e))); while (e > 0 && /^\s*$/.test(r)); - (t = r.length), /\s+$/.test(r) || (r = ""); + ((t = r.length), /\s+$/.test(r) || (r = "")); } var s = i.stringReverse(r), o = this.$shortWordEndIndex(s); @@ -4947,7 +4949,7 @@ ? (n.column = this.$desiredColumn) : (this.$desiredColumn = n.column)); var i = this.session.screenToDocumentPosition(n.row + e, n.column, r); - e !== 0 && + (e !== 0 && t === 0 && i.row === this.lead.row && i.column === this.lead.column && @@ -4955,33 +4957,35 @@ this.session.lineWidgets[i.row] && (i.row > 0 || e > 0) && i.row++, - this.moveCursorTo(i.row, i.column + t, t === 0); + this.moveCursorTo(i.row, i.column + t, t === 0)); }), (this.moveCursorToPosition = function (e) { this.moveCursorTo(e.row, e.column); }), (this.moveCursorTo = function (e, t, n) { var r = this.session.getFoldAt(e, t, 1); - r && ((e = r.start.row), (t = r.start.column)), - (this.$keepDesiredColumnOnChange = !0); + (r && ((e = r.start.row), (t = r.start.column)), + (this.$keepDesiredColumnOnChange = !0)); var i = this.session.getLine(e); - /[\uDC00-\uDFFF]/.test(i.charAt(t)) && + (/[\uDC00-\uDFFF]/.test(i.charAt(t)) && i.charAt(t - 1) && (this.lead.row == e && this.lead.column == t + 1 ? (t -= 1) : (t += 1)), this.lead.setPosition(e, t), (this.$keepDesiredColumnOnChange = !1), - n || (this.$desiredColumn = null); + n || (this.$desiredColumn = null)); }), (this.moveCursorToScreen = function (e, t, n) { var r = this.session.screenToDocumentPosition(e, t); this.moveCursorTo(r.row, r.column, n); }), (this.detach = function () { - this.lead.detach(), this.anchor.detach(), (this.session = this.doc = null); + (this.lead.detach(), + this.anchor.detach(), + (this.session = this.doc = null)); }), (this.fromOrientedRange = function (e) { - this.setSelectionRange(e, e.cursor == e.start), - (this.$desiredColumn = e.desiredColumn || this.$desiredColumn); + (this.setSelectionRange(e, e.cursor == e.start), + (this.$desiredColumn = e.desiredColumn || this.$desiredColumn)); }), (this.toOrientedRange = function (e) { var t = this.getRange(); @@ -5013,7 +5017,7 @@ if (this.rangeCount) var e = this.ranges.map(function (e) { var t = e.clone(); - return (t.isBackwards = e.cursor == e.start), t; + return ((t.isBackwards = e.cursor == e.start), t); }); else { var e = this.getRange(); @@ -5027,14 +5031,15 @@ this.toSingleRange(e[0]); for (var t = e.length; t--; ) { var n = o.fromPoints(e[t].start, e[t].end); - e[t].isBackwards && (n.cursor = n.start), this.addRange(n, !0); + (e[t].isBackwards && (n.cursor = n.start), + this.addRange(n, !0)); } return; } e = e[0]; } - this.rangeList && this.toSingleRange(e), - this.setSelectionRange(e, e.isBackwards); + (this.rangeList && this.toSingleRange(e), + this.setSelectionRange(e, e.isBackwards)); }), (this.isEqual = function (e) { if ((e.length || this.rangeCount) && e.length != this.rangeCount) return !1; @@ -5042,9 +5047,9 @@ for (var t = this.ranges.length; t--; ) if (!this.ranges[t].isEqual(e[t])) return !1; return !0; - }); + })); }).call(u.prototype), - (t.Selection = u); + (t.Selection = u)); }, ), define("ace/tokenizer", ["require", "exports", "module", "ace/config"], function (e, t, n) { @@ -5052,7 +5057,7 @@ var r = e("./config"), i = 2e3, s = function (e) { - (this.states = e), (this.regExps = {}), (this.matchMappings = {}); + ((this.states = e), (this.regExps = {}), (this.matchMappings = {})); for (var t in this.states) { var n = this.states[t], r = [], @@ -5062,13 +5067,13 @@ u = []; for (var a = 0; a < n.length; a++) { var f = n[a]; - f.defaultToken && (s.defaultToken = f.defaultToken), - f.caseInsensitive && (o = "gi"); + (f.defaultToken && (s.defaultToken = f.defaultToken), + f.caseInsensitive && (o = "gi")); if (f.regex == null) continue; f.regex instanceof RegExp && (f.regex = f.regex.toString().slice(1, -1)); var l = f.regex, c = new RegExp("(?:(" + l + ")|(.))").exec("a").length - 2; - Array.isArray(f.token) + (Array.isArray(f.token) ? f.token.length == 1 || c == 1 ? (f.token = f.token[0]) : c - 1 != f.token.length @@ -5093,17 +5098,17 @@ (s[i] = a), (i += c), r.push(l), - f.onMatch || (f.onMatch = null); + f.onMatch || (f.onMatch = null)); } - r.length || ((s[0] = 0), r.push("$")), + (r.length || ((s[0] = 0), r.push("$")), u.forEach(function (e) { e.splitRegex = this.createSplitterRegexp(e.regex, o); }, this), - (this.regExps[t] = new RegExp("(" + r.join(")|(") + ")|($)", o)); + (this.regExps[t] = new RegExp("(" + r.join(")|(") + ")|($)", o))); } }; - (function () { - (this.$setMaxTokenCount = function (e) { + ((function () { + ((this.$setMaxTokenCount = function (e) { i = e | 0; }), (this.$applyToken = function (e) { @@ -5136,7 +5141,7 @@ var n = 0, r = !1, i = {}; - e.replace( + (e.replace( /(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function (e, t, s, o, u, a) { return ( @@ -5156,7 +5161,7 @@ ), i.end != null && /^\)*$/.test(e.substr(i.end)) && - (e = e.substring(0, i.start) + e.substr(i.end)); + (e = e.substring(0, i.start) + e.substr(i.end))); } return ( e.charAt(0) != "^" && (e = "^" + e), @@ -5167,7 +5172,7 @@ (this.getLineTokens = function (e, t) { if (t && typeof t != "string") { var n = t.slice(0); - (t = n[0]), t === "#tmp" && (n.shift(), (t = n.shift())); + ((t = n[0]), t === "#tmp" && (n.shift(), (t = n.shift()))); } else var n = []; var r = t || "start", s = this.states[r]; @@ -5193,7 +5198,7 @@ } for (var y = 0; y < a.length - 2; y++) { if (a[y + 1] === undefined) continue; - (d = s[o[y]]), + ((d = s[o[y]]), d.onMatch ? (p = d.onMatch(v, r, n, e)) : (p = d.token), d.next && (typeof d.next == "string" ? (r = d.next) : (r = d.next(r, n)), @@ -5206,7 +5211,7 @@ (l = m), (u = this.regExps[r]), (u.lastIndex = m)), - d.consumeLineEnd && (l = m); + d.consumeLineEnd && (l = m)); break; } if (v) @@ -5215,7 +5220,7 @@ ? (h.type && f.push(h), (h = { type: p, value: v })) : (h.value += v); else if (p) { - h.type && f.push(h), (h = { type: null, value: "" }); + (h.type && f.push(h), (h = { type: null, value: "" })); for (var y = 0; y < p.length; y++) f.push(p[y]); } if (l == e.length) break; @@ -5227,9 +5232,9 @@ line: e, }); while (l < e.length) - h.type && f.push(h), - (h = { value: e.substring(l, (l += 2e3)), type: "overflow" }); - (r = "start"), (n = []); + (h.type && f.push(h), + (h = { value: e.substring(l, (l += 2e3)), type: "overflow" })); + ((r = "start"), (n = [])); break; } } @@ -5239,9 +5244,9 @@ { tokens: f, state: n.length ? n : r } ); }), - (this.reportError = r.reportError); + (this.reportError = r.reportError)); }).call(s.prototype), - (t.Tokenizer = s); + (t.Tokenizer = s)); }), define( "ace/mode/text_highlight_rules", @@ -5254,8 +5259,8 @@ start: [{ token: "empty_line", regex: "^$" }, { defaultToken: "text" }], }; }; - (function () { - (this.addRules = function (e, t) { + ((function () { + ((this.addRules = function (e, t) { if (!t) { for (var n in e) this.$rules[n] = e[n]; return; @@ -5265,12 +5270,12 @@ for (var i = 0; i < r.length; i++) { var s = r[i]; if (s.next || s.onMatch) - typeof s.next == "string" && + (typeof s.next == "string" && s.next.indexOf(t) !== 0 && (s.next = t + s.next), s.nextState && s.nextState.indexOf(t) !== 0 && - (s.nextState = t + s.nextState); + (s.nextState = t + s.nextState)); } this.$rules[t + n] = r; } @@ -5291,11 +5296,11 @@ for (var u = 0; u < i.length; u++) f.apply(this.$rules[i[u]], r.deepCopy(n)); } - this.$embeds || (this.$embeds = []), this.$embeds.push(t); + (this.$embeds || (this.$embeds = []), this.$embeds.push(t)); }), (this.getEmbeds = function () { return this.$embeds; - }); + })); var e = function (e, t) { return ( (e != "start" || t.length) && t.unshift(this.nextState, e), @@ -5303,16 +5308,16 @@ ); }, t = function (e, t) { - return t.shift(), t.shift() || "start"; + return (t.shift(), t.shift() || "start"); }; - (this.normalizeRules = function () { + ((this.normalizeRules = function () { function i(s) { var o = r[s]; o.processed = !0; for (var u = 0; u < o.length; u++) { var a = o[u], f = null; - Array.isArray(a) && ((f = a), (a = {})), + (Array.isArray(a) && ((f = a), (a = {})), !a.regex && a.start && ((a.regex = a.start), @@ -5326,17 +5331,17 @@ }, ), (a.token = a.token + ".start"), - (a.push = !0)); + (a.push = !0))); var l = a.next || a.push; if (l && Array.isArray(l)) { var c = a.stateName; - c || + (c || ((c = a.token), typeof c != "string" && (c = c[0] || ""), r[c] && (c += n++)), (r[c] = l), (a.next = c), - i(c); + i(c)); } else l == "pop" && (a.next = t); a.push && ((a.nextState = a.next || a.push), (a.next = e), delete a.push); @@ -5354,12 +5359,12 @@ : (f = r[p])); if (f) { var d = [u, 1].concat(f); - a.noEscape && + (a.noEscape && (d = d.filter(function (e) { return !e.next; })), o.splice.apply(o, d), - u--; + u--); } a.keywordMap && ((a.token = this.createKeywordMapper( @@ -5397,9 +5402,9 @@ }), (this.getKeywords = function () { return this.$keywords; - }); + })); }).call(i.prototype), - (t.TextHighlightRules = i); + (t.TextHighlightRules = i)); }, ), define("ace/mode/behaviour", ["require", "exports", "module"], function (e, t, n) { @@ -5407,8 +5412,8 @@ var r = function () { this.$behaviours = {}; }; - (function () { - (this.add = function (e, t, n) { + ((function () { + ((this.add = function (e, t, n) { switch (undefined) { case this.$behaviours: this.$behaviours = {}; @@ -5434,26 +5439,26 @@ for (var n = 0; n < e.length; n++) this.$behaviours[e[n]] && (t[e[n]] = this.$behaviours[e[n]]); return t; - }); + })); }).call(r.prototype), - (t.Behaviour = r); + (t.Behaviour = r)); }), define("ace/token_iterator", ["require", "exports", "module", "ace/range"], function (e, t, n) { "use strict"; var r = e("./range").Range, i = function (e, t, n) { - (this.$session = e), (this.$row = t), (this.$rowTokens = e.getTokens(t)); + ((this.$session = e), (this.$row = t), (this.$rowTokens = e.getTokens(t))); var r = e.getTokenAt(t, n); this.$tokenIndex = r ? r.index : -1; }; - (function () { - (this.stepBackward = function () { + ((function () { + ((this.stepBackward = function () { this.$tokenIndex -= 1; while (this.$tokenIndex < 0) { this.$row -= 1; - if (this.$row < 0) return (this.$row = 0), null; - (this.$rowTokens = this.$session.getTokens(this.$row)), - (this.$tokenIndex = this.$rowTokens.length - 1); + if (this.$row < 0) return ((this.$row = 0), null); + ((this.$rowTokens = this.$session.getTokens(this.$row)), + (this.$tokenIndex = this.$rowTokens.length - 1)); } return this.$rowTokens[this.$tokenIndex]; }), @@ -5461,10 +5466,10 @@ this.$tokenIndex += 1; var e; while (this.$tokenIndex >= this.$rowTokens.length) { - (this.$row += 1), e || (e = this.$session.getLength()); - if (this.$row >= e) return (this.$row = e - 1), null; - (this.$rowTokens = this.$session.getTokens(this.$row)), - (this.$tokenIndex = 0); + ((this.$row += 1), e || (e = this.$session.getLength())); + if (this.$row >= e) return ((this.$row = e - 1), null); + ((this.$rowTokens = this.$session.getTokens(this.$row)), + (this.$tokenIndex = 0)); } return this.$rowTokens[this.$tokenIndex]; }), @@ -5480,7 +5485,7 @@ n = e[t].start; if (n !== undefined) return n; n = 0; - while (t > 0) (t -= 1), (n += e[t].value.length); + while (t > 0) ((t -= 1), (n += e[t].value.length)); return n; }), (this.getCurrentTokenPosition = function () { @@ -5490,9 +5495,9 @@ var e = this.$rowTokens[this.$tokenIndex], t = this.getCurrentTokenColumn(); return new r(this.$row, t, this.$row, t + e.value.length); - }); + })); }).call(i.prototype), - (t.TokenIterator = i); + (t.TokenIterator = i)); }), define( "ace/mode/behaviour/cstyle", @@ -5541,7 +5546,7 @@ }; }, d = function (e) { - this.add("braces", "insertion", function (t, n, r, i, s) { + (this.add("braces", "insertion", function (t, n, r, i, s) { var u = r.getCursorPosition(), a = i.doc.getLine(u.row); if (s == "{") { @@ -5568,7 +5573,8 @@ }); if (m !== null && d.isAutoInsertedClosing(u, a, s)) return ( - d.popAutoInsertedClosing(), { text: "", selection: [1, 1] } + d.popAutoInsertedClosing(), + { text: "", selection: [1, 1] } ); } } else { @@ -5608,7 +5614,7 @@ h(n); var o = r.doc.getLine(i.start.row), u = o.substring(i.end.column, i.end.column + 1); - if (u == "}") return i.end.column++, i; + if (u == "}") return (i.end.column++, i); f.maybeInsertedBrackets--; } }), @@ -5648,7 +5654,7 @@ h(n); var o = r.doc.getLine(i.start.row), u = o.substring(i.start.column + 1, i.start.column + 2); - if (u == ")") return i.end.column++, i; + if (u == ")") return (i.end.column++, i); } }), this.add("brackets", "insertion", function (e, t, n, r, i) { @@ -5687,7 +5693,7 @@ h(n); var o = r.doc.getLine(i.start.row), u = o.substring(i.start.column + 1, i.start.column + 2); - if (u == "]") return i.end.column++, i; + if (u == "]") return (i.end.column++, i); } }), this.add("string_dquotes", "insertion", function (e, t, n, r, i) { @@ -5717,7 +5723,8 @@ b = !g || /string|escape/.test(g.type), w; if (v == o) - (w = y !== b), w && /string\.end/.test(g.type) && (w = !1); + ((w = y !== b), + w && /string\.end/.test(g.type) && (w = !1)); else { if (y && !b) return null; if (y && b) return null; @@ -5741,11 +5748,11 @@ h(n); var u = r.doc.getLine(i.start.row), a = u.substring(i.start.column + 1, i.start.column + 2); - if (a == o) return i.end.column++, i; + if (a == o) return (i.end.column++, i); } - }); + })); }; - (d.isSaneInsertion = function (e, t) { + ((d.isSaneInsertion = function (e, t) { var n = e.getCursorPosition(), r = new s(t, n.row, n.column); if (!this.$matchTokenType(r.getCurrentToken() || "text", u)) { @@ -5764,20 +5771,20 @@ (d.recordAutoInsert = function (e, t, n) { var r = e.getCursorPosition(), i = t.doc.getLine(r.row); - this.isAutoInsertedClosing(r, i, f.autoInsertedLineEnd[0]) || + (this.isAutoInsertedClosing(r, i, f.autoInsertedLineEnd[0]) || (f.autoInsertedBrackets = 0), (f.autoInsertedRow = r.row), (f.autoInsertedLineEnd = n + i.substr(r.column)), - f.autoInsertedBrackets++; + f.autoInsertedBrackets++); }), (d.recordMaybeInsert = function (e, t, n) { var r = e.getCursorPosition(), i = t.doc.getLine(r.row); - this.isMaybeInsertedClosing(r, i) || (f.maybeInsertedBrackets = 0), + (this.isMaybeInsertedClosing(r, i) || (f.maybeInsertedBrackets = 0), (f.maybeInsertedRow = r.row), (f.maybeInsertedLineStart = i.substr(0, r.column) + n), (f.maybeInsertedLineEnd = i.substr(r.column)), - f.maybeInsertedBrackets++; + f.maybeInsertedBrackets++); }), (d.isAutoInsertedClosing = function (e, t, n) { return ( @@ -5796,14 +5803,14 @@ ); }), (d.popAutoInsertedClosing = function () { - (f.autoInsertedLineEnd = f.autoInsertedLineEnd.substr(1)), - f.autoInsertedBrackets--; + ((f.autoInsertedLineEnd = f.autoInsertedLineEnd.substr(1)), + f.autoInsertedBrackets--); }), (d.clearMaybeInsertedClosing = function () { f && ((f.maybeInsertedBrackets = 0), (f.maybeInsertedRow = -1)); }), r.inherits(d, i), - (t.CstyleBehaviour = d); + (t.CstyleBehaviour = d)); }, ), define("ace/unicode", ["require", "exports", "module"], function (e, t, n) { @@ -5847,7 +5854,7 @@ i = 0, s = []; for (var o = 0; o < r.length; o += 2) - s.push((i += r[o])), r[o + 1] && s.push(45, (i += r[o + 1])); + (s.push((i += r[o])), r[o + 1] && s.push(45, (i += r[o + 1]))); t.wordChars = String.fromCharCode.apply(null, s); }), define( @@ -5878,8 +5885,8 @@ c = function () { this.HighlightRules = s; }; - (function () { - (this.$defaultBehaviour = new o()), + ((function () { + ((this.$defaultBehaviour = new o()), (this.tokenRe = new RegExp("^[" + u.wordChars + "\\$_]+", "g")), (this.nonTokenRe = new RegExp("^(?:[^" + u.wordChars + "\\$_]|\\s])+", "g")), (this.getTokenizer = function () { @@ -5913,15 +5920,15 @@ v = function (e, t) { if (g(e, t)) return; if (!s || /\S/.test(e)) - i.insertInLine({ row: t, column: e.length }, h), - i.insertInLine({ row: t, column: u }, c); + (i.insertInLine({ row: t, column: e.length }, h), + i.insertInLine({ row: t, column: u }, c)); }, m = function (e, t) { var n; - (n = e.match(d)) && + ((n = e.match(d)) && i.removeInLine(t, e.length - n[0].length, e.length), (n = e.match(p)) && - i.removeInLine(t, n[1].length, n[0].length); + i.removeInLine(t, n[1].length, n[0].length)); }, g = function (e, n) { if (p.test(e)) return !0; @@ -5936,14 +5943,14 @@ else var p = a.escapeRegExp(this.lineCommentStart), c = this.lineCommentStart; - (p = new RegExp("^(\\s*)(?:" + p + ") ?")), (l = t.getUseSoftTabs()); + ((p = new RegExp("^(\\s*)(?:" + p + ") ?")), (l = t.getUseSoftTabs())); var m = function (e, t) { var n = e.match(p); if (!n) return; var r = n[1].length, s = n[0].length; - !b(e, r, s) && n[0][s - 1] == " " && s--, - i.removeInLine(t, r, s); + (!b(e, r, s) && n[0][s - 1] == " " && s--, + i.removeInLine(t, r, s)); }, y = c + " ", v = function (e, t) { @@ -5965,7 +5972,7 @@ }; } var E = Infinity; - w(function (e, t) { + (w(function (e, t) { var n = e.search(/\S/); n !== -1 ? (n < u && (u = n), o && !g(e, t) && (o = !1)) @@ -5973,7 +5980,7 @@ }), u == Infinity && ((u = E), (s = !1), (o = !1)), l && u % f != 0 && (u = Math.floor(u / f) * f), - w(o ? m : v); + w(o ? m : v)); }), (this.toggleBlockComment = function (e, t, n, r) { var i = this.blockComment; @@ -6009,16 +6016,16 @@ } o = s.stepForward(); } - d && t.remove(d), - p && (t.remove(p), (c = p.start.row), (h = -i.start.length)); + (d && t.remove(d), + p && (t.remove(p), (c = p.start.row), (h = -i.start.length))); } else - (h = i.start.length), + ((h = i.start.length), (c = n.start.row), t.insert(n.end, i.end), - t.insert(n.start, i.start); - a.start.row == c && (a.start.column += h), + t.insert(n.start, i.start)); + (a.start.row == c && (a.start.column += h), a.end.row == c && (a.end.column += h), - t.selection.fromOrientedRange(a); + t.selection.fromOrientedRange(a)); }), (this.getNextLineIndent = function (e, t, n) { return this.$getIndent(t); @@ -6034,16 +6041,16 @@ return null; }), (this.createModeDelegates = function (e) { - (this.$embeds = []), (this.$modes = {}); + ((this.$embeds = []), (this.$modes = {})); for (var t in e) if (e[t]) { var n = e[t], i = n.prototype.$id, s = r.$modes[i]; - s || (r.$modes[i] = s = new n()), + (s || (r.$modes[i] = s = new n()), r.$modes[t] || (r.$modes[t] = s), this.$embeds.push(t), - (this.$modes[t] = s); + (this.$modes[t] = s)); } var o = [ "toggleBlockComment", @@ -6128,9 +6135,9 @@ return { name: e, value: e, score: 0, meta: "keyword" }; }); }), - (this.$id = "ace/mode/text"); + (this.$id = "ace/mode/text")); }).call(c.prototype), - (t.Mode = c); + (t.Mode = c)); }, ), define("ace/apply_delta", ["require", "exports", "module"], function (e, t, n) { @@ -6142,11 +6149,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -6168,9 +6175,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -6190,11 +6197,11 @@ var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -6213,7 +6220,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -6232,16 +6239,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -6259,7 +6266,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }, ), @@ -6283,19 +6290,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -6312,7 +6319,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -6328,7 +6335,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -6356,8 +6363,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); @@ -6439,10 +6446,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -6485,8 +6492,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -6521,7 +6528,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -6549,7 +6556,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -6558,12 +6565,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -6589,9 +6596,9 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }, ), define( @@ -6602,11 +6609,11 @@ var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = function (e, t) { - (this.running = !1), + ((this.running = !1), (this.lines = []), (this.states = []), (this.currentLine = 0), - (this.tokenizer = e); + (this.tokenizer = e)); var n = this; this.$worker = function () { if (!n.running) return; @@ -6620,7 +6627,7 @@ u = 0; n.running = !1; while (t < o) { - n.$tokenizeRow(t), (r = t); + (n.$tokenizeRow(t), (r = t)); do t++; while (n.lines[t]); u++; @@ -6629,23 +6636,28 @@ break; } } - (n.currentLine = t), r == -1 && (r = t), s <= r && n.fireUpdateEvent(s, r); + ((n.currentLine = t), + r == -1 && (r = t), + s <= r && n.fireUpdateEvent(s, r)); }; }; - (function () { - r.implement(this, i), + ((function () { + (r.implement(this, i), (this.setTokenizer = function (e) { - (this.tokenizer = e), (this.lines = []), (this.states = []), this.start(0); + ((this.tokenizer = e), + (this.lines = []), + (this.states = []), + this.start(0)); }), (this.setDocument = function (e) { - (this.doc = e), (this.lines = []), (this.states = []), this.stop(); + ((this.doc = e), (this.lines = []), (this.states = []), this.stop()); }), (this.fireUpdateEvent = function (e, t) { var n = { first: e, last: t }; this._signal("update", { data: n }); }), (this.start = function (e) { - (this.currentLine = Math.min( + ((this.currentLine = Math.min( e || 0, this.currentLine, this.doc.getLength(), @@ -6653,7 +6665,7 @@ this.lines.splice(this.currentLine, this.lines.length), this.states.splice(this.currentLine, this.states.length), this.stop(), - (this.running = setTimeout(this.$worker, 700)); + (this.running = setTimeout(this.$worker, 700))); }), (this.scheduleStart = function () { this.running || (this.running = setTimeout(this.$worker, 700)); @@ -6663,25 +6675,26 @@ n = e.end.row - t; if (n === 0) this.lines[t] = null; else if (e.action == "remove") - this.lines.splice(t, n + 1, null), this.states.splice(t, n + 1, null); + (this.lines.splice(t, n + 1, null), this.states.splice(t, n + 1, null)); else { var r = Array(n + 1); - r.unshift(t, 1), + (r.unshift(t, 1), this.lines.splice.apply(this.lines, r), - this.states.splice.apply(this.states, r); + this.states.splice.apply(this.states, r)); } - (this.currentLine = Math.min(t, this.currentLine, this.doc.getLength())), - this.stop(); + ((this.currentLine = Math.min(t, this.currentLine, this.doc.getLength())), + this.stop()); }), (this.stop = function () { - this.running && clearTimeout(this.running), (this.running = !1); + (this.running && clearTimeout(this.running), (this.running = !1)); }), (this.getTokens = function (e) { return this.lines[e] || this.$tokenizeRow(e); }), (this.getState = function (e) { return ( - this.currentLine == e && this.$tokenizeRow(e), this.states[e] || "start" + this.currentLine == e && this.$tokenizeRow(e), + this.states[e] || "start" ); }), (this.$tokenizeRow = function (e) { @@ -6696,9 +6709,9 @@ : this.currentLine == e && (this.currentLine = e + 1), (this.lines[e] = r.tokens) ); - }); + })); }).call(s.prototype), - (t.BackgroundTokenizer = s); + (t.BackgroundTokenizer = s)); }, ), define( @@ -6710,13 +6723,13 @@ i = e("./lib/oop"), s = e("./range").Range, o = function (e, t, n) { - this.setRegexp(e), (this.clazz = t), (this.type = n || "text"); + (this.setRegexp(e), (this.clazz = t), (this.type = n || "text")); }; - (function () { - (this.MAX_RANGES = 500), + ((function () { + ((this.MAX_RANGES = 500), (this.setRegexp = function (e) { if (this.regExp + "" == e + "") return; - (this.regExp = e), (this.cache = []); + ((this.regExp = e), (this.cache = [])); }), (this.update = function (e, t, n, i) { if (!this.regExp) return; @@ -6734,9 +6747,9 @@ for (var l = f.length; l--; ) t.drawSingleLineMarker(e, f[l].toScreenRange(n), this.clazz, i); } - }); + })); }).call(o.prototype), - (t.SearchHighlight = o); + (t.SearchHighlight = o)); }, ), define( @@ -6745,23 +6758,23 @@ function (e, t, n) { "use strict"; function i(e, t) { - (this.foldData = e), Array.isArray(t) ? (this.folds = t) : (t = this.folds = [t]); + ((this.foldData = e), Array.isArray(t) ? (this.folds = t) : (t = this.folds = [t])); var n = t[t.length - 1]; - (this.range = new r(t[0].start.row, t[0].start.column, n.end.row, n.end.column)), + ((this.range = new r(t[0].start.row, t[0].start.column, n.end.row, n.end.column)), (this.start = this.range.start), (this.end = this.range.end), this.folds.forEach(function (e) { e.setFoldLine(this); - }, this); + }, this)); } var r = e("../range").Range; - (function () { - (this.shiftRow = function (e) { - (this.start.row += e), + ((function () { + ((this.shiftRow = function (e) { + ((this.start.row += e), (this.end.row += e), this.folds.forEach(function (t) { - (t.start.row += e), (t.end.row += e); - }); + ((t.start.row += e), (t.end.row += e)); + })); }), (this.addFold = function (e) { if (e.sameRow) { @@ -6769,7 +6782,7 @@ throw new Error( "Can't add a fold to this FoldLine as it has no connection", ); - this.folds.push(e), + (this.folds.push(e), this.folds.sort(function (e, t) { return -e.range.compareEnd(t.start.row, t.start.column); }), @@ -6777,19 +6790,19 @@ ? ((this.end.row = e.end.row), (this.end.column = e.end.column)) : this.range.compareStart(e.end.row, e.end.column) < 0 && ((this.start.row = e.start.row), - (this.start.column = e.start.column)); + (this.start.column = e.start.column))); } else if (e.start.row == this.end.row) - this.folds.push(e), + (this.folds.push(e), (this.end.row = e.end.row), - (this.end.column = e.end.column); + (this.end.column = e.end.column)); else { if (e.end.row != this.start.row) throw new Error( "Trying to add fold to FoldRow that doesn't have a matching row", ); - this.folds.unshift(e), + (this.folds.unshift(e), (this.start.row = e.start.row), - (this.start.column = e.start.column); + (this.start.column = e.start.column)); } e.foldLine = this; }), @@ -6805,22 +6818,22 @@ a = !0; t == null && ((t = this.end.row), (n = this.end.column)); for (var f = 0; f < i.length; f++) { - (s = i[f]), (o = s.range.compareStart(t, n)); + ((s = i[f]), (o = s.range.compareStart(t, n))); if (o == -1) { e(null, t, n, r, a); return; } - (u = e(null, s.start.row, s.start.column, r, a)), - (u = !u && e(s.placeholder, s.start.row, s.start.column, r)); + ((u = e(null, s.start.row, s.start.column, r, a)), + (u = !u && e(s.placeholder, s.start.row, s.start.column, r))); if (u || o === 0) return; - (a = !s.sameRow), (r = s.end.column); + ((a = !s.sameRow), (r = s.end.column)); } e(null, t, n, r, a); }), (this.getNextFoldTo = function (e, t) { var n, r; for (var i = 0; i < this.folds.length; i++) { - (n = this.folds[i]), (r = n.range.compareEnd(e, t)); + ((n = this.folds[i]), (r = n.range.compareEnd(e, t))); if (r == -1) return { fold: n, kind: "after" }; if (r === 0) return { fold: n, kind: "inside" }; } @@ -6839,7 +6852,7 @@ var o = s.indexOf(i); o === 0 && (this.start.column += n); for (o; o < s.length; o++) { - (i = s[o]), (i.start.column += n); + ((i = s[o]), (i.start.column += n)); if (!i.sameRow) return; i.end.column += n; } @@ -6855,11 +6868,11 @@ o = this.foldData, u = s.indexOf(r), a = s[u - 1]; - (this.end.row = a.end.row), + ((this.end.row = a.end.row), (this.end.column = a.end.column), - (s = s.splice(u, s.length - u)); + (s = s.splice(u, s.length - u))); var f = new i(o, s); - return o.splice(o.indexOf(this) + 1, 0, f), f; + return (o.splice(o.indexOf(this) + 1, 0, f), f); }), (this.merge = function (e) { var t = e.folds; @@ -6888,9 +6901,9 @@ t = r.end.column; } return { row: this.end.row, column: this.end.column + e }; - }); + })); }).call(i.prototype), - (t.FoldLine = i); + (t.FoldLine = i)); }, ), define("ace/range_list", ["require", "exports", "module", "ace/range"], function (e, t, n) { @@ -6900,8 +6913,8 @@ s = function () { this.ranges = []; }; - (function () { - (this.comparePoints = i), + ((function () { + ((this.comparePoints = i), (this.pointIndex = function (e, t, n) { var r = this.ranges; for (var s = n || 0; s < r.length; s++) { @@ -6924,7 +6937,7 @@ n = this.pointIndex(e.start, t); n < 0 && (n = -n - 1); var r = this.pointIndex(e.end, t, n); - return r < 0 ? (r = -r - 1) : r++, this.ranges.splice(n, r - n, e); + return (r < 0 ? (r = -r - 1) : r++, this.ranges.splice(n, r - n, e)); }), (this.addList = function (e) { var t = []; @@ -6944,18 +6957,18 @@ var n = t[0], r; for (var s = 1; s < t.length; s++) { - (r = n), (n = t[s]); + ((r = n), (n = t[s])); var o = i(r.end, n.start); if (o < 0) continue; if (o == 0 && !r.isEmpty() && !n.isEmpty()) continue; - i(r.end, n.end) < 0 && + (i(r.end, n.end) < 0 && ((r.end.row = n.end.row), (r.end.column = n.end.column)), t.splice(s, 1), e.push(n), (n = r), - s--; + s--); } - return (this.ranges = t), e; + return ((this.ranges = t), e); }), (this.contains = function (e, t) { return this.pointIndex({ row: e, column: t }) >= 0; @@ -6982,14 +6995,14 @@ return this.ranges.splice(0, this.ranges.length); }), (this.attach = function (e) { - this.session && this.detach(), + (this.session && this.detach(), (this.session = e), (this.onChange = this.$onChange.bind(this)), - this.session.on("change", this.onChange); + this.session.on("change", this.onChange)); }), (this.detach = function () { if (!this.session) return; - this.session.removeListener("change", this.onChange), (this.session = null); + (this.session.removeListener("change", this.onChange), (this.session = null)); }), (this.$onChange = function (e) { var t = e.start, @@ -7013,14 +7026,14 @@ ((a.start.column += l), (a.start.row += f)); if (a.end.row == r && a.end.column >= t.column) { if (a.end.column == t.column && this.$insertRight) continue; - a.end.column == t.column && + (a.end.column == t.column && l > 0 && o < u - 1 && a.end.column > a.start.column && a.end.column == s[o + 1].start.column && (a.end.column -= l), (a.end.column += l), - (a.end.row += f); + (a.end.row += f)); } } } else { @@ -7031,27 +7044,27 @@ if (a.start.row > i) break; a.end.row < i && ((a.end.row = r), (a.end.column = t.column)); if (a.start.row < i || (a.start.row == i && a.start.column <= n.colum)) - (a.start.row = r), (a.start.column = t.column); + ((a.start.row = r), (a.start.column = t.column)); if (a.end.row == i) if (a.end.column <= n.column) { if (f || a.end.column > t.column) - (a.end.column = t.column), (a.end.row = t.row); - } else (a.end.column += l), (a.end.row += f); + ((a.end.column = t.column), (a.end.row = t.row)); + } else ((a.end.column += l), (a.end.row += f)); if (a.start.row == i) if (a.start.column <= n.column) { if (f || a.start.column > t.column) - (a.start.column = t.column), (a.start.row = t.row); - } else (a.start.column += l), (a.start.row += f); + ((a.start.column = t.column), (a.start.row = t.row)); + } else ((a.start.column += l), (a.start.row += f)); } } if (f != 0 && o < u) for (; o < u; o++) { var a = s[o]; - (a.start.row += f), (a.end.row += f); + ((a.start.row += f), (a.end.row += f)); } - }); + })); }).call(s.prototype), - (t.RangeList = s); + (t.RangeList = s)); }), define( "ace/edit_session/fold", @@ -7059,39 +7072,39 @@ function (e, t, n) { "use strict"; function u(e, t) { - (e.row -= t.row), e.row == 0 && (e.column -= t.column); + ((e.row -= t.row), e.row == 0 && (e.column -= t.column)); } function a(e, t) { - u(e.start, t), u(e.end, t); + (u(e.start, t), u(e.end, t)); } function f(e, t) { - e.row == 0 && (e.column += t.column), (e.row += t.row); + (e.row == 0 && (e.column += t.column), (e.row += t.row)); } function l(e, t) { - f(e.start, t), f(e.end, t); + (f(e.start, t), f(e.end, t)); } var r = e("../range").Range, i = e("../range_list").RangeList, s = e("../lib/oop"), o = (t.Fold = function (e, t) { - (this.foldLine = null), + ((this.foldLine = null), (this.placeholder = t), (this.range = e), (this.start = e.start), (this.end = e.end), (this.sameRow = e.start.row == e.end.row), - (this.subFolds = this.ranges = []); + (this.subFolds = this.ranges = [])); }); - s.inherits(o, i), + (s.inherits(o, i), function () { - (this.toString = function () { + ((this.toString = function () { return '"' + this.placeholder + '" ' + this.range.toString(); }), (this.setFoldLine = function (e) { - (this.foldLine = e), + ((this.foldLine = e), this.subFolds.forEach(function (t) { t.setFoldLine(e); - }); + })); }), (this.clone = function () { var e = this.range.clone(), @@ -7135,12 +7148,12 @@ this.range, ); var f = this.subFolds.splice(r, o - r, e); - return e.setFoldLine(this.foldLine), e; + return (e.setFoldLine(this.foldLine), e); }), (this.restoreRange = function (e) { return l(e, this.start); - }); - }.call(o.prototype); + })); + }.call(o.prototype)); }, ), define( @@ -7157,7 +7170,7 @@ function (e, t, n) { "use strict"; function u() { - (this.getFoldAt = function (e, t, n) { + ((this.getFoldAt = function (e, t, n) { var r = this.getFoldLine(e); if (!r) return null; var i = r.folds; @@ -7175,7 +7188,7 @@ n = e.end, r = this.$foldData, i = []; - (t.column += 1), (n.column -= 1); + ((t.column += 1), (n.column -= 1)); for (var s = 0; s < r.length; s++) { var o = r[s].range.compareRange(e); if (o == 2) continue; @@ -7190,7 +7203,7 @@ i.push(f); } } - return (t.column -= 1), (n.column += 1), i; + return ((t.column -= 1), (n.column += 1), i); }), (this.getFoldsInRangeList = function (e) { if (Array.isArray(e)) { @@ -7239,7 +7252,7 @@ (this.getFoldLine = function (e, t) { var n = this.$foldData, r = 0; - t && (r = n.indexOf(t)), r == -1 && (r = 0); + (t && (r = n.indexOf(t)), r == -1 && (r = 0)); for (r; r < n.length; r++) { var i = n[r]; if (i.start.row <= e && i.end.row >= e) return i; @@ -7250,7 +7263,7 @@ (this.getNextFoldLine = function (e, t) { var n = this.$foldData, r = 0; - t && (r = n.indexOf(t)), r == -1 && (r = 0); + (t && (r = n.indexOf(t)), r == -1 && (r = 0)); for (r; r < n.length; r++) { var i = n[r]; if (i.end.row >= e) return i; @@ -7285,10 +7298,10 @@ var n = this.$foldData, r = !1, o; - e instanceof s + (e instanceof s ? (o = e) : ((o = new s(t, e)), (o.collapseChildren = t.collapseChildren)), - this.$clipRangeToDocument(o.range); + this.$clipRangeToDocument(o.range)); var u = o.start.row, a = o.start.column, f = o.end.row, @@ -7297,8 +7310,8 @@ var c = this.getFoldAt(u, a, 1), h = this.getFoldAt(f, l, -1); if (c && h == c) return c.addSubFold(o); - c && !c.range.isStart(u, a) && this.removeFold(c), - h && !h.range.isEnd(f, l) && this.removeFold(h); + (c && !c.range.isStart(u, a) && this.removeFold(c), + h && !h.range.isEnd(f, l) && this.removeFold(h)); var p = this.getFoldsInRange(o.range); p.length > 0 && (this.removeFolds(p), @@ -7308,11 +7321,11 @@ for (var d = 0; d < n.length; d++) { var v = n[d]; if (f == v.start.row) { - v.addFold(o), (r = !0); + (v.addFold(o), (r = !0)); break; } if (u == v.end.row) { - v.addFold(o), (r = !0); + (v.addFold(o), (r = !0)); if (!o.sameRow) { var m = n[d + 1]; if (m && m.start.row == f) { @@ -7349,44 +7362,44 @@ s = t.folds; if (s.length == 1) i.splice(i.indexOf(t), 1); else if (t.range.isEnd(e.end.row, e.end.column)) - s.pop(), + (s.pop(), (t.end.row = s[s.length - 1].end.row), - (t.end.column = s[s.length - 1].end.column); + (t.end.column = s[s.length - 1].end.column)); else if (t.range.isStart(e.start.row, e.start.column)) - s.shift(), + (s.shift(), (t.start.row = s[0].start.row), - (t.start.column = s[0].start.column); + (t.start.column = s[0].start.column)); else if (e.sameRow) s.splice(s.indexOf(e), 1); else { var o = t.split(e.start.row, e.start.column); - (s = o.folds), + ((s = o.folds), s.shift(), (o.start.row = s[0].start.row), - (o.start.column = s[0].start.column); + (o.start.column = s[0].start.column)); } - this.$updating || + (this.$updating || (this.$useWrapMode ? this.$updateWrapData(n, r) : this.$updateRowLengthCache(n, r)), (this.$modified = !0), - this._signal("changeFold", { data: e, action: "remove" }); + this._signal("changeFold", { data: e, action: "remove" })); }), (this.removeFolds = function (e) { var t = []; for (var n = 0; n < e.length; n++) t.push(e[n]); - t.forEach(function (e) { + (t.forEach(function (e) { this.removeFold(e); }, this), - (this.$modified = !0); + (this.$modified = !0)); }), (this.expandFold = function (e) { - this.removeFold(e), + (this.removeFold(e), e.subFolds.forEach(function (t) { - e.restoreRange(t), this.addFold(t); + (e.restoreRange(t), this.addFold(t)); }, this), e.collapseChildren > 0 && this.foldAll(e.start.row + 1, e.end.row, e.collapseChildren - 1), - (e.subFolds = []); + (e.subFolds = [])); }), (this.expandFolds = function (e) { e.forEach(function (e) { @@ -7395,18 +7408,19 @@ }), (this.unfold = function (e, t) { var n, i; - e == null + (e == null ? ((n = new r(0, 0, this.getLength(), 0)), (t = !0)) : typeof e == "number" ? (n = new r(e, 0, e, this.getLine(e).length)) : "row" in e ? (n = r.fromPoints(e, e)) : (n = e), - (i = this.getFoldsInRangeList(n)); + (i = this.getFoldsInRangeList(n))); if (t) this.removeFolds(i); else { var s = i; - while (s.length) this.expandFolds(s), (s = this.getFoldsInRangeList(n)); + while (s.length) + (this.expandFolds(s), (s = this.getFoldsInRangeList(n))); } if (i.length) return i; }), @@ -7422,10 +7436,10 @@ return n ? n.start.row : e; }), (this.getFoldDisplayLine = function (e, t, n, r, i) { - r == null && (r = e.start.row), + (r == null && (r = e.start.row), i == null && (i = 0), t == null && (t = e.end.row), - n == null && (n = this.getLine(t).length); + n == null && (n = this.getLine(t).length)); var s = this.doc, o = ""; return ( @@ -7448,7 +7462,7 @@ var i = this.getFoldLine(e); if (!i) { var s; - return (s = this.doc.getLine(e)), s.substring(r || 0, t || s.length); + return ((s = this.doc.getLine(e)), s.substring(r || 0, t || s.length)); } return this.getFoldDisplayLine(i, e, t, n, r); }), @@ -7513,8 +7527,8 @@ s = i.getCurrentToken(), u = s.type; if (s && /^comment|string/.test(u)) { - (u = u.match(/comment|string/)[0]), - u == "comment" && (u += "|doc-start"); + ((u = u.match(/comment|string/)[0]), + u == "comment" && (u += "|doc-start")); var a = new RegExp(u), f = new r(); if (n != 1) { @@ -7522,9 +7536,9 @@ while (s && a.test(s.type)); i.stepForward(); } - (f.start.row = i.getCurrentTokenRow()), + ((f.start.row = i.getCurrentTokenRow()), (f.start.column = i.getCurrentTokenColumn() + 2), - (i = new o(this, e, t)); + (i = new o(this, e, t))); if (n != -1) { var l = -1; do { @@ -7547,7 +7561,7 @@ n == undefined && (n = 1e5); var r = this.foldWidgets; if (!r) return; - (t = t || this.getLength()), (e = e || 0); + ((t = t || this.getLength()), (e = e || 0)); for (var i = e; i < t; i++) { r[i] == null && (r[i] = this.getFoldWidget(i)); if (r[i] != "start") continue; @@ -7573,21 +7587,21 @@ "]", ); if (this.$foldStyle == e) return; - (this.$foldStyle = e), e == "manual" && this.unfold(); + ((this.$foldStyle = e), e == "manual" && this.unfold()); var t = this.$foldMode; - this.$setFolding(null), this.$setFolding(t); + (this.$setFolding(null), this.$setFolding(t)); }), (this.$setFolding = function (e) { if (this.$foldMode == e) return; - (this.$foldMode = e), + ((this.$foldMode = e), this.off("change", this.$updateFoldWidgets), this.off("tokenizerUpdate", this.$tokenizerUpdateFoldWidgets), - this._signal("changeAnnotation"); + this._signal("changeAnnotation")); if (!e || this.$foldStyle == "manual") { this.foldWidgets = null; return; } - (this.foldWidgets = []), + ((this.foldWidgets = []), (this.getFoldWidget = e.getFoldWidget.bind(e, this, this.$foldStyle)), (this.getFoldWidgetRange = e.getFoldWidgetRange.bind( e, @@ -7598,7 +7612,7 @@ (this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this)), this.on("change", this.$updateFoldWidgets), - this.on("tokenizerUpdate", this.$tokenizerUpdateFoldWidgets); + this.on("tokenizerUpdate", this.$tokenizerUpdateFoldWidgets)); }), (this.getParentFoldRangeData = function (e, t) { var n = this.foldWidgets; @@ -7639,11 +7653,14 @@ i = n === "end" ? -1 : 1, s = this.getFoldAt(e, i === -1 ? 0 : r.length, i); if (s) - return t.children || t.all ? this.removeFold(s) : this.expandFold(s), s; + return ( + t.children || t.all ? this.removeFold(s) : this.expandFold(s), + s + ); var o = this.getFoldWidgetRange(e, !0); if (o && !o.isMultiLine()) { s = this.getFoldAt(o.start.row, o.start.column, 1); - if (s && o.isEqual(s.range)) return this.removeFold(s), s; + if (s && o.isEqual(s.range)) return (this.removeFold(s), s); } if (t.siblings) { var u = this.getParentFoldRangeData(e); @@ -7679,7 +7696,7 @@ else if (e.action == "remove") this.foldWidgets.splice(t, n + 1, null); else { var r = Array(n + 1); - r.unshift(t, 1), this.foldWidgets.splice.apply(this.foldWidgets, r); + (r.unshift(t, 1), this.foldWidgets.splice.apply(this.foldWidgets, r)); } }), (this.tokenizerUpdateFoldWidgets = function (e) { @@ -7687,7 +7704,7 @@ t.first != t.last && this.foldWidgets.length > t.first && this.foldWidgets.splice(t.first, this.foldWidgets.length); - }); + })); } var r = e("../range").Range, i = e("./fold_line").FoldLine, @@ -7702,7 +7719,7 @@ function (e, t, n) { "use strict"; function s() { - (this.findMatchingBracket = function (e, t) { + ((this.findMatchingBracket = function (e, t) { if (e.column == 0) return null; var n = t || this.getLine(e.row).charAt(e.column - 1); if (n == "") return null; @@ -7728,15 +7745,15 @@ if (o[1]) { var u = this.$findClosingBracket(o[1], e); if (!u) return null; - (r = i.fromPoints(e, u)), + ((r = i.fromPoints(e, u)), n || (r.end.column++, r.start.column--), - (r.cursor = r.end); + (r.cursor = r.end)); } else { var u = this.$findOpeningBracket(o[2], e); if (!u) return null; - (r = i.fromPoints(u, e)), + ((r = i.fromPoints(u, e)), n || (r.start.column++, r.end.column--), - (r.cursor = r.start); + (r.cursor = r.start)); } return r; }), @@ -7782,7 +7799,7 @@ do u = o.stepBackward(); while (u && !n.test(u.type)); if (u == null) break; - (f = u.value), (a = f.length - 1); + ((f = u.value), (a = f.length - 1)); } return null; }), @@ -7824,7 +7841,7 @@ a = 0; } return null; - }); + })); } var r = e("../token_iterator").TokenIterator, i = e("../range").Range; @@ -7865,7 +7882,7 @@ h = e("./background_tokenizer").BackgroundTokenizer, p = e("./search_highlight").SearchHighlight, d = function (e, t) { - (this.$breakpoints = []), + ((this.$breakpoints = []), (this.$decorations = []), (this.$frontMarkers = {}), (this.$backMarkers = {}), @@ -7877,16 +7894,16 @@ return this.join("\n"); }), this.on("changeFold", this.onChangeFold.bind(this)), - (this.$onChange = this.onChange.bind(this)); + (this.$onChange = this.onChange.bind(this))); if (typeof e != "object" || !e.getLine) e = new c(e); - this.setDocument(e), + (this.setDocument(e), (this.selection = new a(this)), (this.$bidiHandler = new s(this)), o.resetOptions(this), this.setMode(t), - o._signal("session", this); + o._signal("session", this)); }; - (d.$uid = 0), + ((d.$uid = 0), function () { function m(e) { return e < 4352 @@ -7924,21 +7941,21 @@ (e >= 65281 && e <= 65376) || (e >= 65504 && e <= 65510); } - r.implement(this, u), + (r.implement(this, u), (this.setDocument = function (e) { - this.doc && this.doc.removeListener("change", this.$onChange), + (this.doc && this.doc.removeListener("change", this.$onChange), (this.doc = e), e.on("change", this.$onChange), this.bgTokenizer && this.bgTokenizer.setDocument(this.getDocument()), - this.resetCaches(); + this.resetCaches()); }), (this.getDocument = function () { return this.doc; }), (this.$resetRowCache = function (e) { if (!e) { - (this.$docRowCache = []), (this.$screenRowCache = []); + ((this.$docRowCache = []), (this.$screenRowCache = [])); return; } var t = this.$docRowCache.length, @@ -7961,22 +7978,22 @@ return n - 1; }), (this.resetCaches = function () { - (this.$modified = !0), + ((this.$modified = !0), (this.$wrapData = []), (this.$rowLengthCache = []), this.$resetRowCache(0), - this.bgTokenizer && this.bgTokenizer.start(0); + this.bgTokenizer && this.bgTokenizer.start(0)); }), (this.onChangeFold = function (e) { var t = e.data; this.$resetRowCache(t.start.row); }), (this.onChange = function (e) { - (this.$modified = !0), + ((this.$modified = !0), this.$bidiHandler.onChange(e), - this.$resetRowCache(e.start.row); + this.$resetRowCache(e.start.row)); var t = this.$updateInternalDataOnChange(e); - !this.$fromUndo && + (!this.$fromUndo && this.$undoManager && (t && t.length && @@ -7989,14 +8006,14 @@ (this.mergeUndoDeltas = !0), this.$informUndoManager.schedule()), this.bgTokenizer && this.bgTokenizer.$updateOnChange(e), - this._signal("change", e); + this._signal("change", e)); }), (this.setValue = function (e) { - this.doc.setValue(e), + (this.doc.setValue(e), this.selection.moveTo(0, 0), this.$resetRowCache(0), this.setUndoManager(this.$undoManager), - this.getUndoManager().reset(); + this.getUndoManager().reset()); }), (this.getValue = this.toString = function () { @@ -8029,17 +8046,17 @@ ); }), (this.setUndoManager = function (e) { - (this.$undoManager = e), - this.$informUndoManager && this.$informUndoManager.cancel(); + ((this.$undoManager = e), + this.$informUndoManager && this.$informUndoManager.cancel()); if (e) { var t = this; - e.addSession(this), + (e.addSession(this), (this.$syncInformUndoManager = function () { - t.$informUndoManager.cancel(), (t.mergeUndoDeltas = !1); + (t.$informUndoManager.cancel(), (t.mergeUndoDeltas = !1)); }), (this.$informUndoManager = i.delayedCall( this.$syncInformUndoManager, - )); + ))); } else this.$syncInformUndoManager = function () {}; }), (this.markUndoGroup = function () { @@ -8094,16 +8111,16 @@ this.setOverwrite(!this.$overwrite); }), (this.addGutterDecoration = function (e, t) { - this.$decorations[e] || (this.$decorations[e] = ""), + (this.$decorations[e] || (this.$decorations[e] = ""), (this.$decorations[e] += " " + t), - this._signal("changeBreakpoint", {}); + this._signal("changeBreakpoint", {})); }), (this.removeGutterDecoration = function (e, t) { - (this.$decorations[e] = (this.$decorations[e] || "").replace( + ((this.$decorations[e] = (this.$decorations[e] || "").replace( " " + t, "", )), - this._signal("changeBreakpoint", {}); + this._signal("changeBreakpoint", {})); }), (this.getBreakpoints = function () { return this.$breakpoints; @@ -8115,15 +8132,15 @@ this._signal("changeBreakpoint", {}); }), (this.clearBreakpoints = function () { - (this.$breakpoints = []), this._signal("changeBreakpoint", {}); + ((this.$breakpoints = []), this._signal("changeBreakpoint", {})); }), (this.setBreakpoint = function (e, t) { - t === undefined && (t = "ace_breakpoint"), + (t === undefined && (t = "ace_breakpoint"), t ? (this.$breakpoints[e] = t) : delete this.$breakpoints[e], - this._signal("changeBreakpoint", {}); + this._signal("changeBreakpoint", {})); }), (this.clearBreakpoint = function (e) { - delete this.$breakpoints[e], this._signal("changeBreakpoint", {}); + (delete this.$breakpoints[e], this._signal("changeBreakpoint", {})); }), (this.addMarker = function (e, t, n, r) { var i = this.$markerId++, @@ -8162,8 +8179,8 @@ var t = this.$frontMarkers[e] || this.$backMarkers[e]; if (!t) return; var n = t.inFront ? this.$frontMarkers : this.$backMarkers; - delete n[e], - this._signal(t.inFront ? "changeFrontMarker" : "changeBackMarker"); + (delete n[e], + this._signal(t.inFront ? "changeFrontMarker" : "changeBackMarker")); }), (this.getMarkers = function (e) { return e ? this.$frontMarkers : this.$backMarkers; @@ -8176,12 +8193,12 @@ this.$searchHighlight.setRegexp(e); }), (this.highlightLines = function (e, t, n, r) { - typeof t != "number" && ((n = t), (t = e)), n || (n = "ace_step"); + (typeof t != "number" && ((n = t), (t = e)), n || (n = "ace_step")); var i = new l(e, 0, t, Infinity); - return (i.id = this.addMarker(i, n, "fullLine", r)), i; + return ((i.id = this.addMarker(i, n, "fullLine", r)), i); }), (this.setAnnotations = function (e) { - (this.$annotations = e), this._signal("changeAnnotation", {}); + ((this.$annotations = e), this._signal("changeAnnotation", {})); }), (this.getAnnotations = function () { return this.$annotations || []; @@ -8196,8 +8213,8 @@ (this.getWordRange = function (e, t) { var n = this.getLine(e), r = !1; - t > 0 && (r = !!n.charAt(t - 1).match(this.tokenRe)), - r || (r = !!n.charAt(t).match(this.tokenRe)); + (t > 0 && (r = !!n.charAt(t - 1).match(this.tokenRe)), + r || (r = !!n.charAt(t).match(this.tokenRe))); if (r) var i = this.tokenRe; else if (/^\s+$/.test(n.slice(t - 1, t + 1))) var i = /\s/; else var i = this.nonTokenRe; @@ -8231,7 +8248,7 @@ }), (this.onReloadTokenizer = function (e) { var t = e.data; - this.bgTokenizer.start(t.first), this._signal("tokenizerUpdate", e); + (this.bgTokenizer.start(t.first), this._signal("tokenizerUpdate", e)); }), (this.$modes = o.$modes), (this.$mode = null), @@ -8245,32 +8262,32 @@ this.$modes["ace/mode/text"] || (this.$modes["ace/mode/text"] = new f()); if (this.$modes[r] && !n) { - this.$onChangeMode(this.$modes[r]), t && t(); + (this.$onChangeMode(this.$modes[r]), t && t()); return; } - (this.$modeId = r), + ((this.$modeId = r), o.loadModule( ["mode", r], function (e) { if (this.$modeId !== r) return t && t(); - this.$modes[r] && !n + (this.$modes[r] && !n ? this.$onChangeMode(this.$modes[r]) : e && e.Mode && ((e = new e.Mode(n)), n || ((this.$modes[r] = e), (e.$id = r)), this.$onChangeMode(e)), - t && t(); + t && t()); }.bind(this), ), - this.$mode || this.$onChangeMode(this.$modes["ace/mode/text"], !0); + this.$mode || this.$onChangeMode(this.$modes["ace/mode/text"], !0)); }), (this.$onChangeMode = function (e, t) { t || (this.$modeId = e.$id); if (this.$mode === e) return; - (this.$mode = e), + ((this.$mode = e), this.$stopWorker(), - this.$useWorker && this.$startWorker(); + this.$useWorker && this.$startWorker()); var n = e.getTokenizer(); if (n.addEventListener !== undefined) { var r = this.onReloadTokenizer.bind(this); @@ -8283,7 +8300,7 @@ i._signal("tokenizerUpdate", e); }); } else this.bgTokenizer.setTokenizer(n); - this.bgTokenizer.setDocument(this.getDocument()), + (this.bgTokenizer.setDocument(this.getDocument()), (this.tokenRe = e.tokenRe), (this.nonTokenRe = e.nonTokenRe), t || @@ -8291,7 +8308,7 @@ this.$options.wrapMethod.set.call(this, this.$wrapMethod), this.$setFolding(e.foldingRules), this.bgTokenizer.start(0), - this._emit("changeMode")); + this._emit("changeMode"))); }), (this.$stopWorker = function () { this.$worker && (this.$worker.terminate(), (this.$worker = null)); @@ -8300,7 +8317,7 @@ try { this.$worker = this.$mode.createWorker(this); } catch (e) { - o.warn("Could not load worker", e), (this.$worker = null); + (o.warn("Could not load worker", e), (this.$worker = null)); } }), (this.getMode = function () { @@ -8309,7 +8326,7 @@ (this.$scrollTop = 0), (this.setScrollTop = function (e) { if (this.$scrollTop === e || isNaN(e)) return; - (this.$scrollTop = e), this._signal("changeScrollTop", e); + ((this.$scrollTop = e), this._signal("changeScrollTop", e)); }), (this.getScrollTop = function () { return this.$scrollTop; @@ -8317,7 +8334,7 @@ (this.$scrollLeft = 0), (this.setScrollLeft = function (e) { if (this.$scrollLeft === e || isNaN(e)) return; - (this.$scrollLeft = e), this._signal("changeScrollLeft", e); + ((this.$scrollLeft = e), this._signal("changeScrollLeft", e)); }), (this.getScrollLeft = function () { return this.$scrollLeft; @@ -8355,10 +8372,11 @@ if (a > o) { a = s.end.row + 1; if (a >= u) break; - (s = this.$foldData[i++]), (o = s ? s.start.row : Infinity); + ((s = this.$foldData[i++]), + (o = s ? s.start.row : Infinity)); } - n[a] == null && (n[a] = this.$getStringScreenWidth(t[a])[0]), - n[a] > r && (r = n[a]); + (n[a] == null && (n[a] = this.$getStringScreenWidth(t[a])[0]), + n[a] > r && (r = n[a])); } this.screenWidth = r; } @@ -8393,12 +8411,12 @@ ? this.doc.revertDelta(r) : r.folds && this.addFolds(r.folds); } - !t && + (!t && this.$undoSelect && (e.selectionBefore ? this.selection.fromJSON(e.selectionBefore) : this.selection.setRange(this.$getUndoSelection(e, !0))), - (this.$fromUndo = !1); + (this.$fromUndo = !1)); }), (this.redoChanges = function (e, t) { if (!e.length) return; @@ -8408,12 +8426,12 @@ (r.action == "insert" || r.action == "remove") && this.doc.applyDelta(r); } - !t && + (!t && this.$undoSelect && (e.selectionAfter ? this.selection.fromJSON(e.selectionAfter) : this.selection.setRange(this.$getUndoSelection(e, !1))), - (this.$fromUndo = !1); + (this.$fromUndo = !1)); }), (this.setUndoSelect = function (e) { this.$undoSelect = e; @@ -8456,7 +8474,7 @@ this.remove(e); var o = e.start.row - e.end.row, u = o ? -e.end.column : e.start.column - e.end.column; - u && + (u && (s.start.row == e.end.row && s.start.column > e.end.column && (s.start.column += u), @@ -8465,7 +8483,7 @@ (s.end.column += u)), o && s.start.row >= e.end.row && - ((s.start.row += o), (s.end.row += o)); + ((s.start.row += o), (s.end.row += o))); } s.end = this.insert(s.start, r); if (i.length) { @@ -8499,16 +8517,16 @@ r = this.getTabSize(); for (var i = t.start.row; i <= t.end.row; ++i) { var s = this.getLine(i); - (n.start.row = i), (n.end.row = i); + ((n.start.row = i), (n.end.row = i)); for (var o = 0; o < r; ++o) if (s.charAt(o) != " ") break; - o < r && s.charAt(o) == " " + (o < r && s.charAt(o) == " " ? ((n.start.column = o), (n.end.column = o + 1)) : ((n.start.column = 0), (n.end.column = o)), - this.remove(n); + this.remove(n)); } }), (this.$moveLines = function (e, t, n) { - (e = this.getRowFoldStart(e)), (t = this.getRowFoldEnd(t)); + ((e = this.getRowFoldStart(e)), (t = this.getRowFoldEnd(t))); if (n < 0) { var r = this.getRowFoldStart(e + n); if (r < 0) return 0; @@ -8518,19 +8536,27 @@ if (r > this.doc.getLength() - 1) return 0; var i = r - t; } else { - (e = this.$clipRowToDocument(e)), (t = this.$clipRowToDocument(t)); + ((e = this.$clipRowToDocument(e)), + (t = this.$clipRowToDocument(t))); var i = t - e + 1; } var s = new l(e, 0, t, Number.MAX_VALUE), o = this.getFoldsInRange(s).map(function (e) { - return (e = e.clone()), (e.start.row += i), (e.end.row += i), e; + return ( + (e = e.clone()), + (e.start.row += i), + (e.end.row += i), + e + ); }), u = n == 0 ? this.doc.getLines(e, t) : this.doc.removeFullLines(e, t); return ( - this.doc.insertFullLines(e + i, u), o.length && this.addFolds(o), i + this.doc.insertFullLines(e + i, u), + o.length && this.addFolds(o), + i ); }), (this.moveLinesUp = function (e, t) { @@ -8550,7 +8576,7 @@ }), (this.$clipPositionToDocument = function (e, t) { t = Math.max(0, t); - if (e < 0) (e = 0), (t = 0); + if (e < 0) ((e = 0), (t = 0)); else { var n = this.doc.getLength(); e >= n @@ -8582,12 +8608,12 @@ (this.$wrapLimitRange = { min: null, max: null }), (this.setUseWrapMode = function (e) { if (e != this.$useWrapMode) { - (this.$useWrapMode = e), + ((this.$useWrapMode = e), (this.$modified = !0), - this.$resetRowCache(0); + this.$resetRowCache(0)); if (e) { var t = this.getLength(); - (this.$wrapData = Array(t)), this.$updateWrapData(0, t - 1); + ((this.$wrapData = Array(t)), this.$updateWrapData(0, t - 1)); } this._signal("changeWrapMode"); } @@ -8597,10 +8623,10 @@ }), (this.setWrapLimitRange = function (e, t) { if (this.$wrapLimitRange.min !== e || this.$wrapLimitRange.max !== t) - (this.$wrapLimitRange = { min: e, max: t }), + ((this.$wrapLimitRange = { min: e, max: t }), (this.$modified = !0), this.$bidiHandler.markAsDirty(), - this.$useWrapMode && this._signal("changeWrapMode"); + this.$useWrapMode && this._signal("changeWrapMode")); }), (this.adjustWrapLimit = function (e, t) { var n = this.$wrapLimitRange; @@ -8617,7 +8643,7 @@ : !1; }), (this.$constrainWrapLimit = function (e, t, n) { - return t && (e = Math.max(t, e)), n && (e = Math.min(n, e)), e; + return (t && (e = Math.max(t, e)), n && (e = Math.min(n, e)), e); }), (this.getWrapLimit = function () { return this.$wrapLimit; @@ -8642,15 +8668,15 @@ if (n === "remove") { this[t ? "$wrapData" : "$rowLengthCache"].splice(s, u); var f = this.$foldData; - (a = this.getFoldsInRange(e)), this.removeFolds(a); + ((a = this.getFoldsInRange(e)), this.removeFolds(a)); var l = this.getFoldLine(i.row), c = 0; if (l) { - l.addRemoveChars(i.row, i.column, r.column - i.column), - l.shiftRow(-u); + (l.addRemoveChars(i.row, i.column, r.column - i.column), + l.shiftRow(-u)); var h = this.getFoldLine(s); - h && h !== l && (h.merge(l), (l = h)), - (c = f.indexOf(l) + 1); + (h && h !== l && (h.merge(l), (l = h)), + (c = f.indexOf(l) + 1)); } for (c; c < f.length; c++) { var l = f[c]; @@ -8667,7 +8693,7 @@ c = 0; if (l) { var v = l.range.compareInside(r.row, r.column); - v == 0 + (v == 0 ? ((l = l.split(r.row, r.column)), l && (l.shiftRow(u), @@ -8675,7 +8701,7 @@ : v == -1 && (l.addRemoveChars(s, 0, i.column - r.column), l.shiftRow(u)), - (c = f.indexOf(l) + 1); + (c = f.indexOf(l) + 1)); } for (c; c < f.length; c++) { var l = f[c]; @@ -8683,11 +8709,11 @@ } } else { - (u = Math.abs(e.start.column - e.end.column)), + ((u = Math.abs(e.start.column - e.end.column)), n === "remove" && ((a = this.getFoldsInRange(e)), this.removeFolds(a), - (u = -u)); + (u = -u))); var l = this.getFoldLine(s); l && l.addRemoveChars(s, r.column, u); } @@ -8703,7 +8729,7 @@ ); }), (this.$updateRowLengthCache = function (e, t, n) { - (this.$rowLengthCache[e] = null), (this.$rowLengthCache[t] = null); + ((this.$rowLengthCache[e] = null), (this.$rowLengthCache[t] = null)); }), (this.$updateWrapData = function (e, t) { var r = this.doc.getAllLines(), @@ -8715,15 +8741,15 @@ l = e; t = Math.min(t, r.length - 1); while (l <= t) - (f = this.getFoldLine(l, f)), + ((f = this.getFoldLine(l, f)), f ? ((a = []), f.walk( function (e, t, i, o) { var u; if (e != null) { - (u = this.$getDisplayTokens(e, a.length)), - (u[0] = n); + ((u = this.$getDisplayTokens(e, a.length)), + (u[0] = n)); for (var f = 1; f < u.length; f++) u[f] = s; } else u = this.$getDisplayTokens( @@ -8739,8 +8765,8 @@ (l = f.end.row + 1)) : ((a = this.$getDisplayTokens(r[l])), (o[l] = this.$computeWrapSplits(a, u, i)), - l++); - }); + l++)); + })); var e = 1, t = 2, n = 3, @@ -8749,7 +8775,7 @@ c = 10, d = 11, v = 12; - (this.$computeWrapSplits = function (e, r, i) { + ((this.$computeWrapSplits = function (e, r, i) { function g() { var t = 0; if (m === 0) return t; @@ -8765,7 +8791,7 @@ t += i; } } - return h && p !== !1 && (t += i), Math.min(t, m); + return (h && p !== !1 && (t += i), Math.min(t, m)); } function y(t) { var n = t - f; @@ -8773,7 +8799,7 @@ var i = e[r]; if (i === 12 || i === 2) n -= 1; } - o.length || ((b = g()), (o.indent = b)), (l += n), o.push(l), (f = t); + (o.length || ((b = g()), (o.indent = b)), (l += n), o.push(l), (f = t)); } if (e.length == 0) return []; var o = [], @@ -8812,7 +8838,7 @@ y(++w); continue; } - (w = f + r), e[w] == t && w--, y(w - b); + ((w = f + r), e[w] == t && w--, y(w - b)); } return o; }), @@ -8823,7 +8849,7 @@ for (var o = 0; o < n.length; o++) { var u = n.charCodeAt(o); if (u == 9) { - (s = this.getScreenTabSize(i.length + r)), i.push(d); + ((s = this.getScreenTabSize(i.length + r)), i.push(d)); for (var f = 1; f < s; f++) i.push(v); } else u == 32 @@ -8838,15 +8864,15 @@ }), (this.$getStringScreenWidth = function (e, t, n) { if (t == 0) return [0, 0]; - t == null && (t = Infinity), (n = n || 0); + (t == null && (t = Infinity), (n = n || 0)); var r, i; for (i = 0; i < e.length; i++) { - (r = e.charCodeAt(i)), + ((r = e.charCodeAt(i)), r == 9 ? (n += this.getScreenTabSize(n)) : r >= 4352 && m(r) ? (n += 2) - : (n += 1); + : (n += 1)); if (n > t) break; } return [n, i]; @@ -8919,20 +8945,20 @@ while (u <= e) { a = this.getRowLength(i); if (u + a > e || i >= p) break; - (u += a), + ((u += a), i++, i > v && ((i = d.end.row + 1), (d = this.getNextFoldLine(i, d)), (v = d ? d.start.row : Infinity)), - h && (this.$docRowCache.push(i), this.$screenRowCache.push(u)); + h && (this.$docRowCache.push(i), this.$screenRowCache.push(u))); } if (d && d.start.row <= i) - (r = this.getFoldDisplayLine(d)), (i = d.start.row); + ((r = this.getFoldDisplayLine(d)), (i = d.start.row)); else { if (u + a <= e || i > p) return { row: p, column: this.getLine(p).length }; - (r = this.getLine(i)), (d = null); + ((r = this.getLine(i)), (d = null)); } var m = 0, g = Math.floor(e - u); @@ -8959,12 +8985,12 @@ if (typeof t == "undefined") var n = this.$clipPositionToDocument(e.row, e.column); else n = this.$clipPositionToDocument(e, t); - (e = n.row), (t = n.column); + ((e = n.row), (t = n.column)); var r = 0, i = null, s = null; - (s = this.getFoldAt(e, t, 1)), - s && ((e = s.start.row), (t = s.start.column)); + ((s = this.getFoldAt(e, t, 1)), + s && ((e = s.start.row), (t = s.start.column))); var o, u = 0, a = this.$docRowCache, @@ -8981,12 +9007,12 @@ if (u >= p) { o = h.end.row + 1; if (o > e) break; - (h = this.getNextFoldLine(o, h)), - (p = h ? h.start.row : Infinity); + ((h = this.getNextFoldLine(o, h)), + (p = h ? h.start.row : Infinity)); } else o = u + 1; - (r += this.getRowLength(u)), + ((r += this.getRowLength(u)), (u = o), - c && (this.$docRowCache.push(u), this.$screenRowCache.push(r)); + c && (this.$docRowCache.push(u), this.$screenRowCache.push(r))); } var d = ""; h && u >= p @@ -8997,9 +9023,9 @@ var m = this.$wrapData[i]; if (m) { var g = 0; - while (d.length >= m[g]) r++, g++; - (d = d.substring(m[g - 1] || 0, d.length)), - (v = g > 0 ? m.indent : 0); + while (d.length >= m[g]) (r++, g++); + ((d = d.substring(m[g - 1] || 0, d.length)), + (v = g > 0 ? m.indent : 0)); } } return { row: r, column: v + this.$getStringScreenWidth(d)[0] }; @@ -9017,7 +9043,7 @@ e = this.getLength(); var n = this.$foldData; for (var r = 0; r < n.length; r++) - (t = n[r]), (e -= t.end.row - t.start.row); + ((t = n[r]), (e -= t.end.row - t.start.row)); } else { var i = this.$wrapData.length, s = 0, @@ -9026,38 +9052,38 @@ o = t ? t.start.row : Infinity; while (s < i) { var u = this.$wrapData[s]; - (e += u ? u.length + 1 : 1), + ((e += u ? u.length + 1 : 1), s++, s > o && ((s = t.end.row + 1), (t = this.$foldData[r++]), - (o = t ? t.start.row : Infinity)); + (o = t ? t.start.row : Infinity))); } } - return this.lineWidgets && (e += this.$getWidgetScreenLength()), e; + return (this.lineWidgets && (e += this.$getWidgetScreenLength()), e); }), (this.$setFontMetrics = function (e) { if (!this.$enableVarChar) return; this.$getStringScreenWidth = function (t, n, r) { if (n === 0) return [0, 0]; - n || (n = Infinity), (r = r || 0); + (n || (n = Infinity), (r = r || 0)); var i, s; for (s = 0; s < t.length; s++) { - (i = t.charAt(s)), + ((i = t.charAt(s)), i === " " ? (r += this.getScreenTabSize(r)) - : (r += e.getCharacterWidth(i)); + : (r += e.getCharacterWidth(i))); if (r > n) break; } return [r, s]; }; }), (this.destroy = function () { - this.bgTokenizer && + (this.bgTokenizer && (this.bgTokenizer.setDocument(null), (this.bgTokenizer = null)), - this.$stopWorker(); + this.$stopWorker()); }), - (this.isFullWidth = m); + (this.isFullWidth = m)); }.call(d.prototype), e("./edit_session/folding").Folding.call(d.prototype), e("./edit_session/bracket_match").BracketMatch.call(d.prototype), @@ -9076,7 +9102,7 @@ if (!e) this.setUseWrapMode(!1); else { var t = typeof e == "number" ? e : null; - this.setWrapLimitRange(t, t), this.setUseWrapMode(!0); + (this.setWrapLimitRange(t, t), this.setUseWrapMode(!0)); } }, get: function () { @@ -9092,11 +9118,11 @@ }, wrapMethod: { set: function (e) { - (e = e == "auto" ? this.$mode.type != "text" : e != "text"), + ((e = e == "auto" ? this.$mode.type != "text" : e != "text"), e != this.$wrapAsCode && ((this.$wrapAsCode = e), this.$useWrapMode && - ((this.$useWrapMode = !1), this.setUseWrapMode(!0))); + ((this.$useWrapMode = !1), this.setUseWrapMode(!0)))); }, initialValue: "auto", }, @@ -9115,7 +9141,7 @@ }, useWorker: { set: function (e) { - (this.$useWorker = e), this.$stopWorker(), e && this.$startWorker(); + ((this.$useWorker = e), this.$stopWorker(), e && this.$startWorker()); }, initialValue: !0, }, @@ -9123,10 +9149,10 @@ tabSize: { set: function (e) { if (isNaN(e) || this.$tabSize === e) return; - (this.$modified = !0), + ((this.$modified = !0), (this.$rowLengthCache = []), (this.$tabSize = e), - this._signal("changeTabSize"); + this._signal("changeTabSize")); }, initialValue: 4, handlesSet: !0, @@ -9163,7 +9189,7 @@ handlesSet: !0, }, }), - (t.EditSession = d); + (t.EditSession = d)); }, ), define( @@ -9183,9 +9209,9 @@ o = function () { this.$options = {}; }; - (function () { - (this.set = function (e) { - return i.mixin(this.$options, e), this; + ((function () { + ((this.set = function (e) { + return (i.mixin(this.$options, e), this); }), (this.getOptions = function () { return r.copyObject(this.$options); @@ -9234,7 +9260,7 @@ v = p.length - p.match(u[0])[0].length, m = d.match(u[a - 1])[0].length; if (l && l.end.row === c && l.end.column > v) continue; - o.push((l = new s(c, v, c + a - 1, m))), a > 2 && (c = c + a - 2); + (o.push((l = new s(c, v, c + a - 1, m))), a > 2 && (c = c + a - 2)); } } else for (var g = 0; g < i.length; g++) { @@ -9254,7 +9280,7 @@ while (g < h && o[h].end.column > E && o[h].end.row == n.end.row) h--; o = o.slice(g, h + 1); for (g = 0, h = o.length; g < h; g++) - (o[g].start.row += n.start.row), (o[g].end.row += n.start.row); + ((o[g].start.row += n.start.row), (o[g].end.row += n.start.row)); } return o; }), @@ -9282,7 +9308,7 @@ if (e.needle instanceof RegExp) return (e.re = e.needle); var n = e.needle; if (!e.needle) return (e.re = !1); - e.regExp || (n = r.escapeRegExp(n)), e.wholeWord && (n = u(n, e)); + (e.regExp || (n = r.escapeRegExp(n)), e.wholeWord && (n = u(n, e))); var i = e.caseSensitive ? "gm" : "gmi"; e.$isMultiLine = !t && /[\n\r]/.test(n); if (e.$isMultiLine) return (e.re = this.$assembleMultilineRegExp(n, i)); @@ -9311,8 +9337,8 @@ i = t.skipCurrent != 0, s = t.range, o = t.start; - o || (o = s ? s[r ? "end" : "start"] : e.selection.getRange()), - o.start && (o = o[i != r ? "end" : "start"]); + (o || (o = s ? s[r ? "end" : "start"] : e.selection.getRange()), + o.start && (o = o[i != r ? "end" : "start"])); var u = s ? s.start.row : 0, a = s ? s.end.row : e.getLength() - 1; if (r) @@ -9388,9 +9414,9 @@ } }; return { forEach: f }; - }); + })); }).call(o.prototype), - (t.Search = o); + (t.Search = o)); }, ), define( @@ -9399,19 +9425,19 @@ function (e, t, n) { "use strict"; function o(e, t) { - (this.platform = t || (i.isMac ? "mac" : "win")), + ((this.platform = t || (i.isMac ? "mac" : "win")), (this.commands = {}), (this.commandKeyBinding = {}), this.addCommands(e), - (this.$singleCommand = !0); + (this.$singleCommand = !0)); } function u(e, t) { - o.call(this, e, t), (this.$singleCommand = !1); + (o.call(this, e, t), (this.$singleCommand = !1)); } var r = e("../lib/keys"), i = e("../lib/useragent"), s = r.KEY_MODS; - (u.prototype = o.prototype), + ((u.prototype = o.prototype), function () { function e(e) { return ( @@ -9419,14 +9445,14 @@ (e.isDefault ? -100 : 0) ); } - (this.addCommand = function (e) { - this.commands[e.name] && this.removeCommand(e), + ((this.addCommand = function (e) { + (this.commands[e.name] && this.removeCommand(e), (this.commands[e.name] = e), - e.bindKey && this._buildKeyHash(e); + e.bindKey && this._buildKeyHash(e)); }), (this.removeCommand = function (e, t) { var n = e && (typeof e == "string" ? e : e.name); - (e = this.commands[n]), t || delete this.commands[n]; + ((e = this.commands[n]), t || delete this.commands[n]); var r = this.commandKeyBinding; for (var i in r) { var s = r[i]; @@ -9448,14 +9474,14 @@ var r = ""; if (e.indexOf(" ") != -1) { var i = e.split(/\s+/); - (e = i.pop()), + ((e = i.pop()), i.forEach(function (e) { var t = this.parseKeys(e), n = s[t.hashId] + t.key; - (r += (r ? " " : "") + n), - this._addCommandToBinding(r, "chainKeys"); + ((r += (r ? " " : "") + n), + this._addCommandToBinding(r, "chainKeys")); }, this), - (r += " "); + (r += " ")); } var o = this.parseKeys(e), u = s[o.hashId] + o.key; @@ -9468,10 +9494,10 @@ if (!n) delete i[t]; else if (!i[t] || this.$singleCommand) i[t] = n; else { - Array.isArray(i[t]) + (Array.isArray(i[t]) ? (s = i[t].indexOf(n)) != -1 && i[t].splice(s, 1) : (i[t] = [i[t]]), - typeof r != "number" && (r = e(n)); + typeof r != "number" && (r = e(n))); var o = i[t]; for (s = 0; s < o.length; s++) { var u = o[s], @@ -9489,7 +9515,7 @@ if (typeof n == "string") return this.bindKey(n, t); typeof n == "function" && (n = { exec: n }); if (typeof n != "object") return; - n.name || (n.name = t), this.addCommand(n); + (n.name || (n.name = t), this.addCommand(n)); }, this); }), (this.removeCommands = function (e) { @@ -9546,7 +9572,7 @@ (o = this.commandKeyBinding[e.$keyChain] || o)); if (o) if (o == "chainKeys" || o[o.length - 1] == "chainKeys") - return (e.$keyChain = e.$keyChain || i), { command: "null" }; + return ((e.$keyChain = e.$keyChain || i), { command: "null" }); if (e.$keyChain) if ((!!t && t != 4) || n.length != 1) { if (t == -1 || r > 0) e.$keyChain = ""; @@ -9555,10 +9581,10 @@ }), (this.getStatusText = function (e, t) { return t.$keyChain || ""; - }); + })); }.call(o.prototype), (t.HashHandler = o), - (t.MultiHashHandler = u); + (t.MultiHashHandler = u)); }, ), define( @@ -9577,15 +9603,15 @@ i = e("../keyboard/hash_handler").MultiHashHandler, s = e("../lib/event_emitter").EventEmitter, o = function (e, t) { - i.call(this, t, e), + (i.call(this, t, e), (this.byName = this.commands), this.setDefaultHandler("exec", function (e) { return e.command.exec(e.editor, e.args || {}); - }); + })); }; - r.inherits(o, i), + (r.inherits(o, i), function () { - r.implement(this, s), + (r.implement(this, s), (this.exec = function (e, t, n) { if (Array.isArray(e)) { for (var r = e.length; r--; ) if (this.exec(e[r], t, n)) return !0; @@ -9626,12 +9652,12 @@ if (this.$inReplay || !this.macro) return; if (this.recording) return this.toggleRecording(e); try { - (this.$inReplay = !0), + ((this.$inReplay = !0), this.macro.forEach(function (t) { typeof t == "string" ? this.exec(t, e) : this.exec(t[0], e, t[1]); - }, this); + }, this)); } finally { this.$inReplay = !1; } @@ -9644,9 +9670,9 @@ e ); }); - }); + })); }.call(o.prototype), - (t.CommandManager = o); + (t.CommandManager = o)); }, ), define( @@ -9666,7 +9692,7 @@ bindKey: o("Ctrl-,", "Command-,"), exec: function (e) { i.loadModule("ace/ext/settings_menu", function (t) { - t.init(e), e.showSettingsMenu(); + (t.init(e), e.showSettingsMenu()); }); }, readOnly: !0, @@ -9713,8 +9739,8 @@ name: "gotoline", bindKey: o("Ctrl-L", "Command-L"), exec: function (e, t) { - typeof t != "number" && (t = parseInt(prompt("Enter line number:"), 10)), - isNaN(t) || e.gotoLine(t); + (typeof t != "number" && (t = parseInt(prompt("Enter line number:"), 10)), + isNaN(t) || e.gotoLine(t)); }, readOnly: !0, }, @@ -9771,7 +9797,7 @@ name: "foldOther", bindKey: o("Alt-0", "Command-Option-0"), exec: function (e) { - e.session.foldAll(), e.session.unfold(e.selection.getAllRanges()); + (e.session.foldAll(), e.session.unfold(e.selection.getAllRanges())); }, scrollIntoView: "center", readOnly: !0, @@ -10186,7 +10212,7 @@ exec: function (e) { var t = e.$copyWithEmptySelection && e.selection.isEmpty(), n = t ? e.selection.getLineRange() : e.selection.getRange(); - e._emit("cut", n), n.isEmpty() || e.session.remove(n), e.clearSelection(); + (e._emit("cut", n), n.isEmpty() || e.session.remove(n), e.clearSelection()); }, scrollIntoView: "cursor", multiSelectAction: "forEach", @@ -10370,7 +10396,7 @@ bindKey: o("Ctrl-Shift-Backspace", null), exec: function (e) { var t = e.selection.getRange(); - (t.start.column = 0), e.session.remove(t); + ((t.start.column = 0), e.session.remove(t)); }, multiSelectAction: "forEach", scrollIntoView: "cursor", @@ -10380,7 +10406,7 @@ bindKey: o("Ctrl-Shift-Delete", null), exec: function (e) { var t = e.selection.getRange(); - (t.end.column = Number.MAX_VALUE), e.session.remove(t); + ((t.end.column = Number.MAX_VALUE), e.session.remove(t)); }, multiSelectAction: "forEach", scrollIntoView: "cursor", @@ -10498,9 +10524,9 @@ bindKey: o("Ctrl-Shift-L", "Command-Shift-L"), exec: function (e) { var t = e.selection.getRange(); - (t.start.column = t.end.column = 0), + ((t.start.column = t.end.column = 0), t.end.row++, - e.selection.setRange(t, !1); + e.selection.setRange(t, !1)); }, multiSelectAction: "forEach", scrollIntoView: "cursor", @@ -10523,9 +10549,9 @@ f = e.session.doc.getLine(n.row); for (var l = n.row + 1; l <= i.row + 1; l++) { var c = r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l))); - c.length !== 0 && (c = " " + c), (f += c); + (c.length !== 0 && (c = " " + c), (f += c)); } - i.row + 1 < e.session.doc.getLength() - 1 && + (i.row + 1 < e.session.doc.getLength() - 1 && (f += e.session.doc.getNewLineCharacter()), e.clearSelection(), e.session.doc.replace(new s(n.row, 0, i.row + 2, 0), f), @@ -10533,7 +10559,7 @@ ? (e.selection.moveCursorTo(n.row, n.column), e.selection.selectTo(n.row, n.column + a)) : ((o = e.session.doc.getLine(n.row).length > o ? o + 1 : o), - e.selection.moveCursorTo(n.row, o)); + e.selection.moveCursorTo(n.row, o))); }, multiSelectAction: "forEach", readOnly: !0, @@ -10548,7 +10574,7 @@ i = []; r.length < 1 && (r = [e.selection.getRange()]); for (var o = 0; o < r.length; o++) - o == r.length - 1 && + (o == r.length - 1 && (r[o].end.row !== t || r[o].end.column !== n) && i.push(new s(r[o].end.row, r[o].end.column, t, n)), o === 0 @@ -10561,8 +10587,8 @@ r[o].start.row, r[o].start.column, ), - ); - e.exitMultiSelectMode(), e.clearSelection(); + )); + (e.exitMultiSelectMode(), e.clearSelection()); for (var o = 0; o < i.length; o++) e.selection.addRange(i[o], !1); }, readOnly: !0, @@ -10622,7 +10648,7 @@ b = e("./clipboard"), w = function (e, t, n) { var r = e.getContainerElement(); - (this.container = r), + ((this.container = r), (this.renderer = e), (this.id = "editor" + ++w.$uid), (this.commands = new v(o.isMac ? "mac" : "win", m)), @@ -10638,10 +10664,10 @@ this.$initOperationListeners(), (this._$emitInputEvent = s.delayedCall( function () { - this._signal("input", {}), + (this._signal("input", {}), this.session && this.session.bgTokenizer && - this.session.bgTokenizer.scheduleStart(); + this.session.bgTokenizer.scheduleStart()); }.bind(this), )), this.on("change", function (e, t) { @@ -10650,13 +10676,13 @@ this.setSession(t || (n && n.session) || new c("")), g.resetOptions(this), n && this.setOptions(n), - g._signal("editor", this); + g._signal("editor", this)); }; - (w.$uid = 0), + ((w.$uid = 0), function () { - r.implement(this, d), + (r.implement(this, d), (this.$initOperationListeners = function () { - this.commands.on("exec", this.startOperation.bind(this), !0), + (this.commands.on("exec", this.startOperation.bind(this), !0), this.commands.on("afterExec", this.endOperation.bind(this), !0), (this.$opResetTimer = s.delayedCall( this.endOperation.bind(this, !0), @@ -10664,23 +10690,23 @@ this.on( "change", function () { - this.curOp || + (this.curOp || (this.startOperation(), (this.curOp.selectionBefore = this.$lastSel)), - (this.curOp.docChanged = !0); + (this.curOp.docChanged = !0)); }.bind(this), !0, ), this.on( "changeSelection", function () { - this.curOp || + (this.curOp || (this.startOperation(), (this.curOp.selectionBefore = this.$lastSel)), - (this.curOp.selectionChanged = !0); + (this.curOp.selectionChanged = !0)); }.bind(this), !0, - ); + )); }), (this.curOp = null), (this.prevOp = {}), @@ -10689,7 +10715,7 @@ if (!e || this.curOp.command) return; this.prevOp = this.curOp; } - e || ((this.previousCommand = null), (e = {})), + (e || ((this.previousCommand = null), (e = {})), this.$opResetTimer.schedule(), (this.curOp = this.session.curOp = { @@ -10697,7 +10723,7 @@ args: e.args, scrollTop: this.renderer.scrollTop, }), - (this.curOp.selectionBefore = this.selection.toJSON()); + (this.curOp.selectionBefore = this.selection.toJSON())); }), (this.endOperation = function (e) { if (this.curOp) { @@ -10738,11 +10764,11 @@ this.renderer.animateScrolling(this.curOp.scrollTop); } var s = this.selection.toJSON(); - (this.curOp.selectionAfter = s), + ((this.curOp.selectionAfter = s), (this.$lastSel = this.selection.toJSON()), this.session.getUndoManager().addSelection(s), (this.prevOp = this.curOp), - (this.curOp = null); + (this.curOp = null)); } }), (this.$mergeableCommands = ["backspace", "del", "insertstring"]), @@ -10753,44 +10779,45 @@ r = t.command && e.command.name == t.command.name; if (e.command.name == "insertstring") { var i = e.args; - this.mergeNextCommand === undefined && (this.mergeNextCommand = !0), + (this.mergeNextCommand === undefined && + (this.mergeNextCommand = !0), (r = r && this.mergeNextCommand && (!/\s/.test(i) || /\s/.test(t.args))), - (this.mergeNextCommand = !0); + (this.mergeNextCommand = !0)); } else r = r && n.indexOf(e.command.name) !== -1; - this.$mergeUndoDeltas != "always" && + (this.$mergeUndoDeltas != "always" && Date.now() - this.sequenceStartTime > 2e3 && (r = !1), r ? (this.session.mergeUndoDeltas = !0) : n.indexOf(e.command.name) !== -1 && - (this.sequenceStartTime = Date.now()); + (this.sequenceStartTime = Date.now())); }), (this.setKeyboardHandler = function (e, t) { if (e && typeof e == "string" && e != "ace") { this.$keybindingId = e; var n = this; g.loadModule(["keybinding", e], function (r) { - n.$keybindingId == e && + (n.$keybindingId == e && n.keyBinding.setKeyboardHandler(r && r.handler), - t && t(); + t && t()); }); } else - (this.$keybindingId = null), + ((this.$keybindingId = null), this.keyBinding.setKeyboardHandler(e), - t && t(); + t && t()); }), (this.getKeyboardHandler = function () { return this.keyBinding.getKeyboardHandler(); }), (this.setSession = function (e) { if (this.session == e) return; - this.curOp && this.endOperation(), (this.curOp = {}); + (this.curOp && this.endOperation(), (this.curOp = {})); var t = this.session; if (t) { - this.session.off("change", this.$onDocumentChange), + (this.session.off("change", this.$onDocumentChange), this.session.off("changeMode", this.$onChangeMode), this.session.off("tokenizerUpdate", this.$onTokenizerUpdate), this.session.off("changeTabSize", this.$onChangeTabSize), @@ -10806,12 +10833,12 @@ this.session.off("changeAnnotation", this.$onChangeAnnotation), this.session.off("changeOverwrite", this.$onCursorChange), this.session.off("changeScrollTop", this.$onScrollTopChange), - this.session.off("changeScrollLeft", this.$onScrollLeftChange); + this.session.off("changeScrollLeft", this.$onScrollLeftChange)); var n = this.session.getSelection(); - n.off("changeCursor", this.$onCursorChange), - n.off("changeSelection", this.$onSelectionChange); + (n.off("changeCursor", this.$onCursorChange), + n.off("changeSelection", this.$onSelectionChange)); } - (this.session = e), + ((this.session = e), e ? ((this.$onDocumentChange = this.onDocumentChange.bind(this)), e.on("change", this.$onDocumentChange), @@ -10873,7 +10900,7 @@ (this.curOp = null), t && t._signal("changeEditor", { oldEditor: this }), e && e._signal("changeEditor", { editor: this }), - e && e.bgTokenizer && e.bgTokenizer.scheduleStart(); + e && e.bgTokenizer && e.bgTokenizer.scheduleStart()); }), (this.getSession = function () { return this.session; @@ -10925,7 +10952,7 @@ (this.session.$bracketHighlight = null)); if (this.$highlightPending) return; var e = this; - (this.$highlightPending = !0), + ((this.$highlightPending = !0), setTimeout(function () { e.$highlightPending = !1; var t = e.session; @@ -10940,12 +10967,12 @@ "ace_bracket", "text", )); - }, 50); + }, 50)); }), (this.$highlightTags = function () { if (this.$highlightTagPending) return; var e = this; - (this.$highlightTagPending = !0), + ((this.$highlightTagPending = !0), setTimeout(function () { e.$highlightTagPending = !1; var t = e.session; @@ -10954,7 +10981,7 @@ r = new y(e.session, n.row, n.column), i = r.getCurrentToken(); if (!i || !/\b(?:tag-open|tag-name)/.test(i.type)) { - t.removeMarker(t.$tagHighlight), (t.$tagHighlight = null); + (t.removeMarker(t.$tagHighlight), (t.$tagHighlight = null)); return; } if (i.type.indexOf("tag-open") != -1) { @@ -10966,37 +10993,37 @@ u = r.stepBackward(); if (u.value == "<") { do - (u = i), + ((u = i), (i = r.stepForward()), i && i.value === s && i.type.indexOf("tag-name") !== -1 && (u.value === "<" ? o++ - : u.value === "= 0); } else { do - (i = u), + ((i = u), (u = r.stepBackward()), i && i.value === s && i.type.indexOf("tag-name") !== -1 && (u.value === "<" ? o++ - : u.value === " 1) && - (t = !1); + (t = !1)); } if (e.$highlightLineMarker && !t) - e.removeMarker(e.$highlightLineMarker.id), - (e.$highlightLineMarker = null); + (e.removeMarker(e.$highlightLineMarker.id), + (e.$highlightLineMarker = null)); else if (!e.$highlightLineMarker && t) { var n = new p(t.row, t.column, t.row, Infinity); - (n.id = e.addMarker(n, "ace_active-line", "screenLine")), - (e.$highlightLineMarker = n); + ((n.id = e.addMarker(n, "ace_active-line", "screenLine")), + (e.$highlightLineMarker = n)); } else t && ((e.$highlightLineMarker.start.row = t.row), @@ -11094,8 +11121,8 @@ }), (this.onSelectionChange = function (e) { var t = this.session; - t.$selectionMarker && t.removeMarker(t.$selectionMarker), - (t.$selectionMarker = null); + (t.$selectionMarker && t.removeMarker(t.$selectionMarker), + (t.$selectionMarker = null)); if (!this.selection.isEmpty()) { var n = this.selection.getRange(), r = this.getSelectionStyle(); @@ -11103,7 +11130,7 @@ } else this.$updateHighlightActiveLine(); var i = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); - this.session.highlight(i), this._signal("changeSelection"); + (this.session.highlight(i), this._signal("changeSelection")); }), (this.$getSelectionHighLightRegexp = function () { var e = this.session, @@ -11136,7 +11163,7 @@ this.renderer.setAnnotations(this.session.getAnnotations()); }), (this.onChangeMode = function (e) { - this.renderer.updateText(), this._emit("changeMode", e); + (this.renderer.updateText(), this._emit("changeMode", e)); }), (this.onChangeWrapLimit = function () { this.renderer.updateFull(); @@ -11145,7 +11172,7 @@ this.renderer.onResize(!0); }), (this.onChangeFold = function () { - this.$updateHighlightActiveLine(), this.renderer.updateFull(); + (this.$updateHighlightActiveLine(), this.renderer.updateFull()); }), (this.getSelectedText = function () { return this.session.getTextRange(this.getSelectionRange()); @@ -11164,7 +11191,11 @@ } } var o = { text: e }; - return this._signal("copy", o), (b.lineMode = n ? o.text : ""), o.text; + return ( + this._signal("copy", o), + (b.lineMode = n ? o.text : ""), + o.text + ); }), (this.onCopy = function () { this.commands.exec("copy", this); @@ -11177,7 +11208,7 @@ this.commands.exec("paste", this, n); }), (this.$handlePaste = function (e) { - typeof e == "string" && (e = { text: e }), this._signal("paste", e); + (typeof e == "string" && (e = { text: e }), this._signal("paste", e)); var t = e.text, n = t == b.lineMode, r = this.session; @@ -11196,7 +11227,7 @@ return this.commands.exec("insertstring", this, t); for (var o = s.length; o--; ) { var u = s[o]; - u.isEmpty() || r.remove(u), r.insert(u.start, i[o]); + (u.isEmpty() || r.remove(u), r.insert(u.start, i[o])); } } }), @@ -11225,10 +11256,10 @@ e == " " && (e = this.session.getTabString()); if (!this.selection.isEmpty()) { var o = this.getSelectionRange(); - (i = this.session.remove(o)), this.clearSelection(); + ((i = this.session.remove(o)), this.clearSelection()); } else if (this.session.getOverwrite() && e.indexOf("\n") == -1) { var o = new p.fromPoints(i, i); - (o.end.column += e.length), this.session.remove(o); + ((o.end.column += e.length), this.session.remove(o)); } if (e == "\n" || e == "\r\n") { var u = n.getLine(i.row); @@ -11276,23 +11307,23 @@ if (!t) return this.keyBinding.onTextInput(e); this.startOperation({ command: { name: "insertstring" } }); var n = this.applyComposition.bind(this, e, t); - this.selection.rangeCount ? this.forEachSelection(n) : n(), - this.endOperation(); + (this.selection.rangeCount ? this.forEachSelection(n) : n(), + this.endOperation()); }), (this.applyComposition = function (e, t) { if (t.extendLeft || t.extendRight) { var n = this.selection.getRange(); - (n.start.column -= t.extendLeft), + ((n.start.column -= t.extendLeft), (n.end.column += t.extendRight), this.selection.setRange(n), - !e && !n.isEmpty() && this.remove(); + !e && !n.isEmpty() && this.remove()); } (e || !this.selection.isEmpty()) && this.insert(e, !0); if (t.restoreStart || t.restoreEnd) { var n = this.selection.getRange(); - (n.start.column -= t.restoreStart), + ((n.start.column -= t.restoreStart), (n.end.column -= t.restoreEnd), - this.selection.setRange(n); + this.selection.setRange(n)); } }), (this.onCommandKey = function (e, t, n) { @@ -11422,38 +11453,38 @@ } i && (t = i); } - this.session.remove(t), this.clearSelection(); + (this.session.remove(t), this.clearSelection()); }), (this.removeWordRight = function () { - this.selection.isEmpty() && this.selection.selectWordRight(), + (this.selection.isEmpty() && this.selection.selectWordRight(), this.session.remove(this.getSelectionRange()), - this.clearSelection(); + this.clearSelection()); }), (this.removeWordLeft = function () { - this.selection.isEmpty() && this.selection.selectWordLeft(), + (this.selection.isEmpty() && this.selection.selectWordLeft(), this.session.remove(this.getSelectionRange()), - this.clearSelection(); + this.clearSelection()); }), (this.removeToLineStart = function () { - this.selection.isEmpty() && this.selection.selectLineStart(), + (this.selection.isEmpty() && this.selection.selectLineStart(), this.session.remove(this.getSelectionRange()), - this.clearSelection(); + this.clearSelection()); }), (this.removeToLineEnd = function () { this.selection.isEmpty() && this.selection.selectLineEnd(); var e = this.getSelectionRange(); - e.start.column == e.end.column && + (e.start.column == e.end.column && e.start.row == e.end.row && ((e.end.column = 0), e.end.row++), this.session.remove(e), - this.clearSelection(); + this.clearSelection()); }), (this.splitLine = function () { this.selection.isEmpty() || (this.session.remove(this.getSelectionRange()), this.clearSelection()); var e = this.getCursorPosition(); - this.insert("\n"), this.moveCursorToPosition(e); + (this.insert("\n"), this.moveCursorToPosition(e)); }), (this.transposeLetters = function () { if (!this.selection.isEmpty()) return; @@ -11463,29 +11494,29 @@ var n = this.session.getLine(e.row), r, i; - t < n.length + (t < n.length ? ((r = n.charAt(t) + n.charAt(t - 1)), (i = new p(e.row, t - 1, e.row, t + 1))) : ((r = n.charAt(t - 1) + n.charAt(t - 2)), (i = new p(e.row, t - 2, e.row, t))), this.session.replace(i, r), - this.session.selection.moveToPosition(i.end); + this.session.selection.moveToPosition(i.end)); }), (this.toLowerCase = function () { var e = this.getSelectionRange(); this.selection.isEmpty() && this.selection.selectWord(); var t = this.getSelectionRange(), n = this.session.getTextRange(t); - this.session.replace(t, n.toLowerCase()), - this.selection.setSelectionRange(e); + (this.session.replace(t, n.toLowerCase()), + this.selection.setSelectionRange(e)); }), (this.toUpperCase = function () { var e = this.getSelectionRange(); this.selection.isEmpty() && this.selection.selectWord(); var t = this.getSelectionRange(), n = this.session.getTextRange(t); - this.session.replace(t, n.toUpperCase()), - this.selection.setSelectionRange(e); + (this.session.replace(t, n.toUpperCase()), + this.selection.setSelectionRange(e)); }), (this.indent = function () { var e = this.session, @@ -11512,8 +11543,8 @@ l = s.stringRepeat(" ", f); else { var f = a % u; - while (i[t.start.column - 1] == " " && f) t.start.column--, f--; - this.selection.setSelectionRange(t), (l = " "); + while (i[t.start.column - 1] == " " && f) (t.start.column--, f--); + (this.selection.setSelectionRange(t), (l = " ")); } return this.insert(l); }), @@ -11540,10 +11571,10 @@ var i = new p(0, 0, 0, 0); for (var r = e.first; r <= e.last; r++) { var s = t.getLine(r); - (i.start.row = r), + ((i.start.row = r), (i.end.row = r), (i.end.column = s.length), - t.replace(i, n[r - e.first]); + t.replace(i, n[r - e.first])); } }), (this.toggleCommentLines = function () { @@ -11590,19 +11621,19 @@ : s.end, u = s.start + s.value.length - o, a = parseFloat(s.value); - (a *= Math.pow(10, u)), + ((a *= Math.pow(10, u)), o !== s.end && n < o ? (e *= Math.pow(10, s.end - n - 1)) : (e *= Math.pow(10, s.end - n)), (a += e), - (a /= Math.pow(10, u)); + (a /= Math.pow(10, u))); var f = a.toFixed(u), l = new p(t, s.start, t, s.end); - this.session.replace(l, f), + (this.session.replace(l, f), this.moveCursorTo( t, Math.max(s.start + 1, n + f.length - s.value.length), - ); + )); } } else this.toggleWord(); }), @@ -11644,14 +11675,14 @@ f = this; n.match(/[A-Za-z0-9_]+/) && i.forEach(function (t, i) { - (a = u + t.length), + ((a = u + t.length), o >= u && o <= a && ((n = t), f.selection.clearSelection(), f.moveCursorTo(e, u + r), f.selection.selectTo(e, a + r)), - (u = a); + (u = a)); }); var l = this.$toggleWordPairs, c; @@ -11698,7 +11729,7 @@ }), (this.removeLines = function () { var e = this.$getSelectedRows(); - this.session.removeFullLines(e.first, e.last), this.clearSelection(); + (this.session.removeFullLines(e.first, e.last), this.clearSelection()); }), (this.duplicateSelection = function () { var e = this.selection, @@ -11711,7 +11742,7 @@ } else { var s = r ? n.start : n.end, o = t.insert(s, t.getTextRange(n), !1); - (n.start = s), (n.end = o), e.setSelectionRange(n, r); + ((n.start = s), (n.end = o), e.setSelectionRange(n, r)); } }), (this.moveLinesDown = function () { @@ -11735,21 +11766,21 @@ i = this.selection; if (!i.inMultiSelectMode || this.inVirtualSelectionMode) { var s = i.toOrientedRange(); - (n = this.$getSelectedRows(s)), + ((n = this.$getSelectedRows(s)), (r = this.session.$moveLines(n.first, n.last, t ? 0 : e)), t && e == -1 && (r = 0), s.moveBy(r, 0), - i.fromOrientedRange(s); + i.fromOrientedRange(s)); } else { var o = i.rangeList.ranges; - i.rangeList.detach(this.session), - (this.inVirtualSelectionMode = !0); + (i.rangeList.detach(this.session), + (this.inVirtualSelectionMode = !0)); var u = 0, a = 0, f = o.length; for (var l = 0; l < f; l++) { var c = l; - o[l].moveBy(u, 0), (n = this.$getSelectedRows(o[l])); + (o[l].moveBy(u, 0), (n = this.$getSelectedRows(o[l]))); var h = n.first, p = n.last; while (++l < f) { @@ -11759,15 +11790,15 @@ if (!t && d.first > p + 1) break; p = d.last; } - l--, + (l--, (u = this.session.$moveLines(h, p, t ? 0 : e)), - t && e == -1 && (c = l + 1); - while (c <= l) o[c].moveBy(u, 0), c++; - t || (u = 0), (a += u); + t && e == -1 && (c = l + 1)); + while (c <= l) (o[c].moveBy(u, 0), c++); + (t || (u = 0), (a += u)); } - i.fromOrientedRange(i.ranges[0]), + (i.fromOrientedRange(i.ranges[0]), i.rangeList.attach(this.session), - (this.inVirtualSelectionMode = !1); + (this.inVirtualSelectionMode = !1)); } }), (this.$getSelectedRows = function (e) { @@ -11822,9 +11853,9 @@ (this.selection.moveCursorBy(i, 0), this.selection.clearSelection()); var s = n.scrollTop; - n.scrollBy(0, i * r.lineHeight), + (n.scrollBy(0, i * r.lineHeight), t != null && n.scrollCursorIntoView(null, 0.5), - n.animateScrolling(s); + n.animateScrolling(s)); }), (this.selectPageDown = function () { this.$moveByPage(1, !0); @@ -11897,11 +11928,11 @@ if (s.value.match(/[{}()\[\]]/g)) for (; f < s.value.length && !u; f++) { if (!c[s.value[f]]) continue; - (l = + ((l = c[s.value[f]] + "." + s.type.replace("rparen", "lparen")), - isNaN(a[l]) && (a[l] = 0); + isNaN(a[l]) && (a[l] = 0)); switch (s.value[f]) { case "(": case "[": @@ -11911,7 +11942,8 @@ case ")": case "]": case "}": - a[l]--, a[l] === -1 && ((o = "bracket"), (u = !0)); + (a[l]--, + a[l] === -1 && ((o = "bracket"), (u = !0))); } } else @@ -11928,13 +11960,13 @@ if (o === "bracket") { h = this.session.getBracketRange(n); if (!h) { - (h = new p( + ((h = new p( r.getCurrentTokenRow(), r.getCurrentTokenColumn() + f - 1, r.getCurrentTokenRow(), r.getCurrentTokenColumn() + f - 1, )), - (d = h.start); + (d = h.start)); if (t || (d.row === n.row && Math.abs(d.column - n.column) < 2)) h = this.session.getBracketRange(d); } @@ -11950,7 +11982,7 @@ if (h.compare(n.row, n.column) === 0) { u = !1; do - (s = i), + ((s = i), (i = r.stepBackward()), i && (i.type.indexOf("tag-close") !== -1 && @@ -11963,7 +11995,7 @@ (i.value === "<" ? a[v]++ : i.value === "= 0; --s) this.$tryReplace(n[s], e) && r++; - return this.selection.setSelectionRange(i), r; + return (this.selection.setSelectionRange(i), r); }), (this.$tryReplace = function (e, t) { var n = this.session.getTextRange(e); @@ -12079,24 +12112,24 @@ return this.$search.getOptions(); }), (this.find = function (e, t, n) { - t || (t = {}), + (t || (t = {}), typeof e == "string" || e instanceof RegExp ? (t.needle = e) - : typeof e == "object" && r.mixin(t, e); + : typeof e == "object" && r.mixin(t, e)); var i = this.selection.getRange(); - t.needle == null && + (t.needle == null && ((e = this.session.getTextRange(i) || this.$search.$options.needle), e || ((i = this.session.getWordRange(i.start.row, i.start.column)), (e = this.session.getTextRange(i))), this.$search.set({ needle: e })), this.$search.set(t), - t.start || this.$search.set({ start: i }); + t.start || this.$search.set({ start: i })); var s = this.$search.find(this.session); if (t.preventScroll) return s; - if (s) return this.revealRange(s, n), s; - t.backwards ? (i.start = i.end) : (i.end = i.start), - this.selection.setRange(i); + if (s) return (this.revealRange(s, n), s); + (t.backwards ? (i.start = i.end) : (i.end = i.start), + this.selection.setRange(i)); }), (this.findNext = function (e, t) { this.find({ skipCurrent: !0, backwards: !1 }, e, t); @@ -12105,23 +12138,23 @@ this.find(e, { skipCurrent: !0, backwards: !0 }, t); }), (this.revealRange = function (e, t) { - this.session.unfold(e), this.selection.setSelectionRange(e); + (this.session.unfold(e), this.selection.setSelectionRange(e)); var n = this.renderer.scrollTop; - this.renderer.scrollSelectionIntoView(e.start, e.end, 0.5), - t !== !1 && this.renderer.animateScrolling(n); + (this.renderer.scrollSelectionIntoView(e.start, e.end, 0.5), + t !== !1 && this.renderer.animateScrolling(n)); }), (this.undo = function () { - this.session.getUndoManager().undo(this.session), - this.renderer.scrollCursorIntoView(null, 0.5); + (this.session.getUndoManager().undo(this.session), + this.renderer.scrollCursorIntoView(null, 0.5)); }), (this.redo = function () { - this.session.getUndoManager().redo(this.session), - this.renderer.scrollCursorIntoView(null, 0.5); + (this.session.getUndoManager().redo(this.session), + this.renderer.scrollCursorIntoView(null, 0.5)); }), (this.destroy = function () { - this.renderer.destroy(), + (this.renderer.destroy(), this._signal("destroy", this), - this.session && this.session.destroy(); + this.session && this.session.destroy()); }), (this.setAutoScrollEditorIntoView = function (e) { if (!e) return; @@ -12131,8 +12164,8 @@ this.$scrollAnchor || (this.$scrollAnchor = document.createElement("div")); var i = this.$scrollAnchor; - (i.style.cssText = "position:absolute"), - this.container.insertBefore(i, this.container.firstChild); + ((i.style.cssText = "position:absolute"), + this.container.insertBefore(i, this.container.firstChild)); var s = this.on("changeSelection", function () { r = !0; }), @@ -12149,7 +12182,7 @@ s = e.$cursorLayer.$pixelPos, o = e.layerConfig, u = s.top - o.offset; - s.top >= 0 && u + t.top < 0 + (s.top >= 0 && u + t.top < 0 ? (r = !0) : s.top < o.height && s.top + t.top + o.lineHeight > window.innerHeight @@ -12160,31 +12193,31 @@ (i.style.left = s.left + "px"), (i.style.height = o.lineHeight + "px"), i.scrollIntoView(r)), - (r = t = null); + (r = t = null)); } }); this.setAutoScrollEditorIntoView = function (e) { if (e) return; - delete this.setAutoScrollEditorIntoView, + (delete this.setAutoScrollEditorIntoView, this.off("changeSelection", s), this.renderer.off("afterRender", u), - this.renderer.off("beforeRender", o); + this.renderer.off("beforeRender", o)); }; }), (this.$resetCursorStyle = function () { var e = this.$cursorStyle || "ace", t = this.renderer.$cursorLayer; if (!t) return; - t.setSmoothBlinking(/smooth/.test(e)), + (t.setSmoothBlinking(/smooth/.test(e)), (t.isBlinking = !this.$readOnly && e != "wide"), - i.setCssClass(t.element, "ace_slim-cursors", /slim/.test(e)); - }); + i.setCssClass(t.element, "ace_slim-cursors", /slim/.test(e))); + })); }.call(w.prototype), g.defineOptions(w.prototype, "editor", { selectionStyle: { set: function (e) { - this.onSelectionChange(), - this._signal("changeSelectionStyle", { data: e }); + (this.onSelectionChange(), + this._signal("changeSelectionStyle", { data: e })); }, initialValue: "line", }, @@ -12202,7 +12235,7 @@ }, readOnly: { set: function (e) { - this.textInput.setReadOnly(e), this.$resetCursorStyle(); + (this.textInput.setReadOnly(e), this.$resetCursorStyle()); }, initialValue: !1, }, @@ -12258,9 +12291,9 @@ }, showLineNumbers: { set: function (e) { - this.renderer.$gutterLayer.setShowLineNumbers(e), + (this.renderer.$gutterLayer.setShowLineNumbers(e), this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER), - e && this.$relativeLineNumbers ? E.attach(this) : E.detach(this); + e && this.$relativeLineNumbers ? E.attach(this) : E.detach(this)); }, initialValue: !0, }, @@ -12307,7 +12340,7 @@ indentedSoftWrap: "session", foldStyle: "session", mode: "session", - }); + })); var E = { getText: function (e, t) { return ( @@ -12324,15 +12357,15 @@ t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER); }, attach: function (e) { - (e.renderer.$gutterLayer.$renderer = this), + ((e.renderer.$gutterLayer.$renderer = this), e.on("changeSelection", this.update), - this.update(null, e); + this.update(null, e)); }, detach: function (e) { - e.renderer.$gutterLayer.$renderer == this && + (e.renderer.$gutterLayer.$renderer == this && (e.renderer.$gutterLayer.$renderer = null), e.off("changeSelection", this.update), - this.update(null, e); + this.update(null, e)); }, }; t.Editor = w; @@ -12346,7 +12379,7 @@ if (r && !r[0].ignore) { while (n < t - 1) { var i = d(e[n], e[n + 1]); - (e[n] = i[0]), (e[n + 1] = i[1]), n++; + ((e[n] = i[0]), (e[n + 1] = i[1]), n++); } return !0; } @@ -12372,7 +12405,7 @@ } var l = t ? f : u(a, r); if (l > 0) { - (a.row += i), (a.column += a.row == r.row ? s : 0); + ((a.row += i), (a.column += a.row == r.row ? s : 0)); continue; } !t && l <= 0 && ((a.row = n.row), (a.column = n.column), l === 0 && (a.bias = 1)); @@ -12388,11 +12421,11 @@ e = e || this; if (Array.isArray(e)) return e.map(c).join("\n"); var t = ""; - e.action + (e.action ? ((t = e.action == "insert" ? "+" : "-"), (t += "[" + e.lines + "]")) : e.value && (Array.isArray(e.value) ? (t = e.value.map(h).join("\n")) : (t = h(e.value))), - e.start && (t += h(e)); + e.start && (t += h(e))); if (e.id || e.rev) t += " (" + (e.id || e.rev) + ")"; return t; } @@ -12434,7 +12467,7 @@ if (!p(e[n], t[r])) { while (n < e.length) { while (r--) p(t[r], e[n]); - (r = t.length), n++; + ((r = t.length), n++); } return [e, t]; } @@ -12486,11 +12519,11 @@ return [t, e]; } function m(e, t, n) { - g(e.start, t.start, t.end, n), g(e.end, t.start, t.end, n); + (g(e.start, t.start, t.end, n), g(e.end, t.start, t.end, n)); } function g(e, t, n, r) { - e.row == (r == 1 ? t : n).row && (e.column += r * (n.column - t.column)), - (e.row += r * (n.row - t.row)); + (e.row == (r == 1 ? t : n).row && (e.column += r * (n.column - t.column)), + (e.row += r * (n.row - t.row))); } function y(e, t) { var n = e.lines, @@ -12499,7 +12532,7 @@ var i = e.end.row - e.start.row, s = n.splice(i, n.length), o = i ? t.column : t.column - e.start.column; - n.push(s[0].substring(0, o)), (s[0] = s[0].substr(o)); + (n.push(s[0].substring(0, o)), (s[0] = s[0].substr(o))); var u = { start: f(t), end: r, lines: s, action: e.action }; return u; } @@ -12510,11 +12543,11 @@ for (var i = 0; i < r.length; i++) { var s = r[i], o = v(s, t); - (t = o[0]), + ((t = o[0]), o.length != 2 && (o[2] ? (r.splice(i + 1, 1, o[1], o[2]), i++) - : o[1] || (r.splice(i, 1), i--)); + : o[1] || (r.splice(i, 1), i--))); } r.length || e.splice(n, 1); } @@ -12527,19 +12560,19 @@ } } var r = function () { - (this.$maxRev = 0), (this.$fromUndo = !1), this.reset(); + ((this.$maxRev = 0), (this.$fromUndo = !1), this.reset()); }; (function () { - (this.addSession = function (e) { + ((this.addSession = function (e) { this.$session = e; }), (this.add = function (e, t, n) { if (this.$fromUndo) return; if (e == this.$lastDelta) return; if (t === !1 || !this.lastDeltas) - (this.lastDeltas = []), + ((this.lastDeltas = []), this.$undoStack.push(this.lastDeltas), - (e.id = this.$rev = ++this.$maxRev); + (e.id = this.$rev = ++this.$maxRev)); if (e.action == "remove" || e.action == "insert") this.$lastDelta = e; this.lastDeltas.push(e); }), @@ -12547,7 +12580,7 @@ this.selections.push({ value: e, rev: t || this.$rev }); }), (this.startNewGroup = function () { - return (this.lastDeltas = null), this.$rev; + return ((this.lastDeltas = null), this.$rev); }), (this.markIgnored = function (e, t) { t == null && (t = this.$rev + 1); @@ -12563,7 +12596,7 @@ var n = this.selections; for (var r = n.length; r--; ) { var i = n[r]; - if (i.rev < e) return t && (i = n[r + 1]), i; + if (i.rev < e) return (t && (i = n[r + 1]), i); } }), (this.getRevision = function () { @@ -12594,11 +12627,11 @@ this.lastDeltas = null; var n = this.$undoStack; if (!i(n, n.length)) return; - e || (e = this.$session), + (e || (e = this.$session), this.$redoStackBaseRev !== this.$rev && this.$redoStack.length && (this.$redoStack = []), - (this.$fromUndo = !0); + (this.$fromUndo = !0)); var r = n.pop(), s = null; return ( @@ -12610,14 +12643,14 @@ ); }), (this.redo = function (e, t) { - (this.lastDeltas = null), e || (e = this.$session), (this.$fromUndo = !0); + ((this.lastDeltas = null), e || (e = this.$session), (this.$fromUndo = !0)); if (this.$redoStackBaseRev != this.$rev) { var n = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1); - w(this.$redoStack, n), + (w(this.$redoStack, n), (this.$redoStackBaseRev = this.$rev), this.$redoStack.forEach(function (e) { e[0].id = ++this.$maxRev; - }, this); + }, this)); } var r = this.$redoStack.pop(), i = null; @@ -12631,17 +12664,17 @@ var e = this.$undoStack, t = e[e.length - 1], n = (t && t[0].id) || 0; - (this.$redoStackBaseRev = n), (this.$rev = n); + ((this.$redoStackBaseRev = n), (this.$rev = n)); }), (this.reset = function () { - (this.lastDeltas = null), + ((this.lastDeltas = null), (this.$lastDelta = null), (this.$undoStack = []), (this.$redoStack = []), (this.$rev = 0), (this.mark = 0), (this.$redoStackBaseRev = this.$rev), - (this.selections = []); + (this.selections = [])); }), (this.canUndo = function () { return this.$undoStack.length > 0; @@ -12650,7 +12683,7 @@ return this.$redoStack.length > 0; }), (this.bookmark = function (e) { - e == undefined && (e = this.$rev), (this.mark = e); + (e == undefined && (e = this.$rev), (this.mark = e)); }), (this.isAtBookmark = function () { return this.$rev === this.mark; @@ -12663,7 +12696,7 @@ (this.markClean = this.bookmark), (this.$prettyPrint = function (e) { return e ? c(e) : c(this.$undoStack) + "\n---\n" + c(this.$redoStack); - }); + })); }).call(r.prototype); var s = e("./range").Range, o = s.comparePoints, @@ -12674,15 +12707,15 @@ "use strict"; var r = e("../lib/dom"), i = function (e, t) { - (this.element = e), + ((this.element = e), (this.canvasHeight = t || 5e5), (this.element.style.height = this.canvasHeight * 2 + "px"), (this.cells = []), (this.cellCache = []), - (this.$offsetCoefficient = 0); + (this.$offsetCoefficient = 0)); }; - (function () { - (this.moveContainer = function (e) { + ((function () { + ((this.moveContainer = function (e) { r.translate( this.element, 0, @@ -12723,7 +12756,7 @@ var t = r.createFragment(this.element); for (var n = 0; n < e.length; n++) t.appendChild(e[n].element); this.element.appendChild(t); - } else this.cells.push(e), this.element.appendChild(e.element); + } else (this.cells.push(e), this.element.appendChild(e.element)); }), (this.unshift = function (e) { if (Array.isArray(e)) { @@ -12734,28 +12767,28 @@ ? this.element.insertBefore(t, this.element.firstChild) : this.element.appendChild(t); } else - this.cells.unshift(e), - this.element.insertAdjacentElement("afterbegin", e.element); + (this.cells.unshift(e), + this.element.insertAdjacentElement("afterbegin", e.element)); }), (this.last = function () { return this.cells.length ? this.cells[this.cells.length - 1] : null; }), (this.$cacheCell = function (e) { if (!e) return; - e.element.remove(), this.cellCache.push(e); + (e.element.remove(), this.cellCache.push(e)); }), (this.createCell = function (e, t, n, i) { var s = this.cellCache.pop(); if (!s) { var o = r.createElement("div"); - i && i(o), + (i && i(o), this.element.appendChild(o), - (s = { element: o, text: "", row: e }); + (s = { element: o, text: "", row: e })); } - return (s.row = e), s; - }); + return ((s.row = e), s); + })); }).call(i.prototype), - (t.Lines = i); + (t.Lines = i)); }), define( "ace/layer/gutter", @@ -12775,7 +12808,7 @@ var t = document.createTextNode(""); e.appendChild(t); var n = r.createElement("span"); - return e.appendChild(n), e; + return (e.appendChild(n), e); } var r = e("../lib/dom"), i = e("../lib/oop"), @@ -12783,7 +12816,7 @@ o = e("../lib/event_emitter").EventEmitter, u = e("./lines").Lines, a = function (e) { - (this.element = r.createElement("div")), + ((this.element = r.createElement("div")), (this.element.className = "ace_layer ace_gutter-layer"), e.appendChild(this.element), this.setShowFoldWidgets(this.$showFoldWidgets), @@ -12791,27 +12824,27 @@ (this.$annotations = []), (this.$updateAnnotations = this.$updateAnnotations.bind(this)), (this.$lines = new u(this.element)), - (this.$lines.$offsetCoefficient = 1); + (this.$lines.$offsetCoefficient = 1)); }; - (function () { - i.implement(this, o), + ((function () { + (i.implement(this, o), (this.setSession = function (e) { - this.session && + (this.session && this.session.removeEventListener("change", this.$updateAnnotations), (this.session = e), - e && e.on("change", this.$updateAnnotations); + e && e.on("change", this.$updateAnnotations)); }), (this.addGutterDecoration = function (e, t) { - window.console && + (window.console && console.warn && console.warn("deprecated use session.addGutterDecoration"), - this.session.addGutterDecoration(e, t); + this.session.addGutterDecoration(e, t)); }), (this.removeGutterDecoration = function (e, t) { - window.console && + (window.console && console.warn && console.warn("deprecated use session.removeGutterDecoration"), - this.session.removeGutterDecoration(e, t); + this.session.removeGutterDecoration(e, t)); }), (this.setAnnotations = function (e) { this.$annotations = []; @@ -12821,8 +12854,8 @@ i = this.$annotations[r]; i || (i = this.$annotations[r] = { text: [] }); var o = n.text; - (o = o ? s.escapeHTML(o) : n.html || ""), - i.text.indexOf(o) === -1 && i.text.push(o); + ((o = o ? s.escapeHTML(o) : n.html || ""), + i.text.indexOf(o) === -1 && i.text.push(o)); var u = n.type; u == "error" ? (i.className = " ace_error") @@ -12839,8 +12872,8 @@ if (e.action == "remove") this.$annotations.splice(t, n + 1, null); else { var r = new Array(n + 1); - r.unshift(t, 1), - this.$annotations.splice.apply(this.$annotations, r); + (r.unshift(t, 1), + this.$annotations.splice.apply(this.$annotations, r)); } }), (this.update = function (e) { @@ -12848,10 +12881,10 @@ var t = this.session, n = e.firstRow, r = Math.min(e.lastRow + e.gutterOffset, t.getLength() - 1); - (this.oldLastRow = r), + ((this.oldLastRow = r), (this.config = e), this.$lines.moveContainer(e), - this.$updateCursorRow(); + this.$updateCursorRow()); var i = t.getNextFoldLine(n), s = i ? i.start.row : Infinity, o = null, @@ -12866,15 +12899,15 @@ while (this.$lines.getLength() > u + 1) this.$lines.pop(); break; } - (o = this.$lines.get(++u)), + ((o = this.$lines.get(++u)), o ? (o.row = a) : ((o = this.$lines.createCell(a, e, this.session, f)), this.$lines.push(o)), this.$renderCell(o, e, i, a), - a++; + a++); } - this._signal("afterRender"), this.$updateGutterWidth(e); + (this._signal("afterRender"), this.$updateGutterWidth(e)); }), (this.$updateGutterWidth = function (e) { var t = this.session, @@ -12884,13 +12917,13 @@ if (this.$fixedWidth || t.$useWrapMode) i = t.getLength() + r; var s = n ? n.getWidth(t, i, e) : i.toString().length * e.characterWidth, o = this.$padding || this.$computePadding(); - (s += o.left + o.right), + ((s += o.left + o.right), s !== this.gutterWidth && !isNaN(s) && ((this.gutterWidth = s), (this.element.parentNode.style.width = this.element.style.width = Math.ceil(this.gutterWidth) + "px"), - this._signal("changeGutterWidth", s)); + this._signal("changeGutterWidth", s))); }), (this.$updateCursorRow = function () { if (!this.$highlightGutterLine) return; @@ -12919,16 +12952,16 @@ if (!(n > 0 && i && i.start.row == t[n - 1].row)) break; r = t[n - 1]; } - (r.element.className = + ((r.element.className = "ace_gutter-active-line " + r.element.className), - (this.$cursorCell = r); + (this.$cursorCell = r)); break; } } }), (this.scrollLines = function (e) { var t = this.config; - (this.config = e), this.$updateCursorRow(); + ((this.config = e), this.$updateCursorRow()); if (this.$lines.pageChanged(t, e)) return this.update(e); this.$lines.moveContainer(e); var n = Math.min(e.lastRow + e.gutterOffset, this.session.getLength() - 1), @@ -12946,12 +12979,12 @@ if (r > n) for (var i = this.session.getFoldedRowCount(n + 1, r); i > 0; i--) this.$lines.pop(); - e.firstRow < t.firstRow && + (e.firstRow < t.firstRow && this.$lines.unshift(this.$renderLines(e, e.firstRow, t.firstRow - 1)), n > r && this.$lines.push(this.$renderLines(e, r + 1, n)), this.updateLineHighlight(), this._signal("afterRender"), - this.$updateGutterWidth(e); + this.$updateGutterWidth(e)); }), (this.$renderLines = function (e, t, n) { var r = [], @@ -12965,7 +12998,7 @@ (o = s ? s.start.row : Infinity)); if (i > n) break; var u = this.$lines.createCell(i, e, this.session, f); - this.$renderCell(u, e, s, i), r.push(u), i++; + (this.$renderCell(u, e, s, i), r.push(u), i++); } return r; }), @@ -12981,7 +13014,7 @@ p = this.$showFoldWidgets && o.foldWidgets, d = n ? n.start.row : Number.MAX_VALUE, v = "ace_gutter-cell "; - this.$highlightGutterLine && + (this.$highlightGutterLine && (i == this.$cursorRow || (n && i < this.$cursorRow && @@ -12999,20 +13032,20 @@ l[i] && (v += l[i]), c[i] && (v += c[i]), this.$annotations[i] && (v += this.$annotations[i].className), - s.className != v && (s.className = v); + s.className != v && (s.className = v)); if (p) { var m = p[i]; m == null && (m = p[i] = o.getFoldWidget(i)); } if (m) { var v = "ace_fold-widget ace_" + m; - m == "start" && i == d && i < n.end.row + (m == "start" && i == d && i < n.end.row ? (v += " ace_closed") : (v += " ace_open"), - a.className != v && (a.className = v); + a.className != v && (a.className = v)); var g = t.lineHeight + "px"; - r.setStyle(a.style, "height", g), - r.setStyle(a.style, "display", "inline-block"); + (r.setStyle(a.style, "height", g), + r.setStyle(a.style, "display", "inline-block")); } else a && r.setStyle(a.style, "display", "none"); var y = (h ? h.getText(o, i) : i + f).toString(); return ( @@ -13054,11 +13087,11 @@ }), (this.$showFoldWidgets = !0), (this.setShowFoldWidgets = function (e) { - e + (e ? r.addCssClass(this.element, "ace_folding-enabled") : r.removeCssClass(this.element, "ace_folding-enabled"), (this.$showFoldWidgets = e), - (this.$padding = null); + (this.$padding = null)); }), (this.getShowFoldWidgets = function () { return this.$showFoldWidgets; @@ -13083,9 +13116,9 @@ n = this.element.getBoundingClientRect(); if (e.x < t.left + n.left) return "markers"; if (this.$showFoldWidgets && e.x > n.right - t.right) return "foldWidgets"; - }); + })); }).call(a.prototype), - (t.Gutter = a); + (t.Gutter = a)); }, ), define( @@ -13096,15 +13129,15 @@ var r = e("../range").Range, i = e("../lib/dom"), s = function (e) { - (this.element = i.createElement("div")), + ((this.element = i.createElement("div")), (this.element.className = "ace_layer ace_marker-layer"), - e.appendChild(this.element); + e.appendChild(this.element)); }; - (function () { + ((function () { function e(e, t, n, r) { return (e ? 1 : 0) | (t ? 2 : 0) | (n ? 4 : 0) | (r ? 8 : 0); } - (this.$padding = 0), + ((this.$padding = 0), (this.setPadding = function (e) { this.$padding = e; }), @@ -13116,17 +13149,17 @@ }), (this.elt = function (e, t) { var n = this.i != -1 && this.element.childNodes[this.i]; - n + (n ? this.i++ : ((n = document.createElement("div")), this.element.appendChild(n), (this.i = -1)), (n.style.cssText = t), - (n.className = e); + (n.className = e)); }), (this.update = function (e) { if (!e) return; - (this.config = e), (this.i = 0); + ((this.config = e), (this.i = 0)); var t; for (var n in this.markers) { var r = this.markers[n]; @@ -13174,7 +13207,7 @@ p = u.getScreenLastRowColumn(l), d = new r(l, n.start.column, l, h); for (; l <= f; l++) - (d.start.row = d.end.row = l), + ((d.start.row = d.end.row = l), (d.start.column = l == a ? n.start.column : u.getRowWrapIndent(l)), (d.end.column = p), (c = h), @@ -13200,7 +13233,7 @@ s, l == f ? 0 : 1, o, - ); + )); }), (this.drawMultiLineMarker = function (e, t, n, r, i) { var s = this.$padding, @@ -13210,7 +13243,7 @@ i = i || ""; if (this.session.$bidiHandler.isBidiRow(t.start.row)) { var f = t.clone(); - (f.end.row = f.start.row), + ((f.end.row = f.start.row), (f.end.column = this.session.getLine(f.start.row).length), this.drawBidiSingleLineMarker( e, @@ -13219,7 +13252,7 @@ r, null, i, - ); + )); } else this.elt( n + " ace_br1 ace_start", @@ -13236,9 +13269,9 @@ ); if (this.session.$bidiHandler.isBidiRow(t.end.row)) { var f = t.clone(); - (f.start.row = f.end.row), + ((f.start.row = f.end.row), (f.start.column = 0), - this.drawBidiSingleLineMarker(e, f, n + " ace_br12", r, null, i); + this.drawBidiSingleLineMarker(e, f, n + " ace_br12", r, null, i)); } else { u = this.$getTop(t.end.row, r); var l = t.end.column * r.characterWidth; @@ -13333,7 +13366,7 @@ (this.drawFullLineMarker = function (e, t, n, r, i) { var s = this.$getTop(t.start.row, r), o = r.lineHeight; - t.start.row != t.end.row && (o += this.$getTop(t.end.row, r) - s), + (t.start.row != t.end.row && (o += this.$getTop(t.end.row, r) - s), this.elt( n, "height:" + @@ -13344,7 +13377,7 @@ "px;" + "left:0;right:0;" + (i || ""), - ); + )); }), (this.drawScreenLineMarker = function (e, t, n, r, i) { var s = this.$getTop(t.start.row, r), @@ -13360,9 +13393,9 @@ "left:0;right:0;" + (i || ""), ); - }); + })); }).call(s.prototype), - (t.Marker = s); + (t.Marker = s)); }, ), define( @@ -13385,15 +13418,15 @@ o = e("./lines").Lines, u = e("../lib/event_emitter").EventEmitter, a = function (e) { - (this.dom = i), + ((this.dom = i), (this.element = this.dom.createElement("div")), (this.element.className = "ace_layer ace_text-layer"), e.appendChild(this.element), (this.$updateEolChar = this.$updateEolChar.bind(this)), - (this.$lines = new o(this.element)); + (this.$lines = new o(this.element))); }; - (function () { - r.implement(this, u), + ((function () { + (r.implement(this, u), (this.EOF_CHAR = "\u00b6"), (this.EOL_CHAR_LF = "\u00ac"), (this.EOL_CHAR_CRLF = "\u00a4"), @@ -13406,10 +13439,10 @@ var e = this.session.doc, t = e.getNewLineCharacter() == "\n" && e.getNewLineMode() != "windows", n = t ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF; - if (this.EOL_CHAR != n) return (this.EOL_CHAR = n), !0; + if (this.EOL_CHAR != n) return ((this.EOL_CHAR = n), !0); }), (this.setPadding = function (e) { - (this.$padding = e), (this.element.style.margin = "0 " + e + "px"); + ((this.$padding = e), (this.element.style.margin = "0 " + e + "px")); }), (this.getLineHeight = function () { return this.$fontMetrics.$characterSize.height || 0; @@ -13418,14 +13451,14 @@ return this.$fontMetrics.$characterSize.width || 0; }), (this.$setFontMetrics = function (e) { - (this.$fontMetrics = e), + ((this.$fontMetrics = e), this.$fontMetrics.on( "changeCharacterSize", function (e) { this._signal("changeCharacterSize", e); }.bind(this), ), - this.$pollSizeChanges(); + this.$pollSizeChanges()); }), (this.checkForSizeChanges = function () { this.$fontMetrics.checkForSizeChanges(); @@ -13434,7 +13467,7 @@ return (this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges()); }), (this.setSession = function (e) { - (this.session = e), e && this.$computeTabString(); + ((this.session = e), e && this.$computeTabString()); }), (this.showInvisibles = !1), (this.setShowInvisibles = function (e) { @@ -13457,9 +13490,9 @@ for (var n = 1; n < e + 1; n++) if (this.showInvisibles) { var r = this.dom.createElement("span"); - (r.className = "ace_invisible ace_invisible_tab"), + ((r.className = "ace_invisible ace_invisible_tab"), (r.textContent = s.stringRepeat(this.TAB_CHAR, n)), - t.push(r); + t.push(r)); } else t.push( this.dom.createTextNode( @@ -13473,22 +13506,22 @@ o = "", u = ""; if (this.showInvisibles) { - (i += " ace_invisible"), + ((i += " ace_invisible"), (o = " ace_invisible_space"), - (u = " ace_invisible_tab"); + (u = " ace_invisible_tab")); var a = s.stringRepeat(this.SPACE_CHAR, this.tabSize), f = s.stringRepeat(this.TAB_CHAR, this.tabSize); } else var a = s.stringRepeat(" ", this.tabSize), f = a; var r = this.dom.createElement("span"); - (r.className = i + o), + ((r.className = i + o), (r.textContent = a), - (this.$tabStrings[" "] = r); + (this.$tabStrings[" "] = r)); var r = this.dom.createElement("span"); - (r.className = i + u), + ((r.className = i + u), (r.textContent = f), - (this.$tabStrings[" "] = r); + (this.$tabStrings[" "] = r)); } }), (this.updateLines = function (e, t, n) { @@ -13522,7 +13555,8 @@ if (u > i) break; var c = s[o++]; if (c) { - this.dom.removeChildren(c), this.$renderLine(c, u, u == l ? a : !1); + (this.dom.removeChildren(c), + this.$renderLine(c, u, u == l ? a : !1)); var h = e.lineHeight * this.session.getRowLength(u) + "px"; c.style.height != h && ((f = !0), (c.style.height = h)); } @@ -13560,14 +13594,14 @@ i-- ) this.$lines.pop(); - e.firstRow < t.firstRow && + (e.firstRow < t.firstRow && this.$lines.unshift( this.$renderLinesFragment(e, e.firstRow, t.firstRow - 1), ), e.lastRow > t.lastRow && this.$lines.push( this.$renderLinesFragment(e, t.lastRow + 1, e.lastRow), - ); + )); }), (this.$renderLinesFragment = function (e, t, n) { var r = [], @@ -13582,7 +13616,7 @@ if (s > n) break; var a = this.$lines.createCell(s, e, this.session), f = a.element; - this.dom.removeChildren(f), + (this.dom.removeChildren(f), i.setStyle( f.style, "height", @@ -13598,12 +13632,12 @@ ? (f.className = "ace_line_group") : (f.className = "ace_line"), r.push(a), - s++; + s++); } return r; }), (this.update = function (e) { - this.$lines.moveContainer(e), (this.config = e); + (this.$lines.moveContainer(e), (this.config = e)); var t = e.firstRow, n = e.lastRow, r = this.$lines; @@ -13626,52 +13660,52 @@ v = f[5]; if (!o.showInvisibles && h) continue; var m = l != f.index ? r.slice(l, f.index) : ""; - (l = f.index + f[0].length), - m && a.appendChild(this.dom.createTextNode(m, this.element)); + ((l = f.index + f[0].length), + m && a.appendChild(this.dom.createTextNode(m, this.element))); if (c) { var g = o.session.getScreenTabSize(t + f.index); - a.appendChild(o.$tabStrings[g].cloneNode(!0)), (t += g - 1); + (a.appendChild(o.$tabStrings[g].cloneNode(!0)), (t += g - 1)); } else if (h) if (o.showInvisibles) { var y = this.dom.createElement("span"); - (y.className = "ace_invisible ace_invisible_space"), + ((y.className = "ace_invisible ace_invisible_space"), (y.textContent = s.stringRepeat(o.SPACE_CHAR, h.length)), - a.appendChild(y); + a.appendChild(y)); } else a.appendChild(this.com.createTextNode(h, this.element)); else if (p) { var y = this.dom.createElement("span"); - (y.className = "ace_invisible ace_invisible_space ace_invalid"), + ((y.className = "ace_invisible ace_invisible_space ace_invalid"), (y.textContent = s.stringRepeat(o.SPACE_CHAR, p.length)), - a.appendChild(y); + a.appendChild(y)); } else if (d) { var b = o.showInvisibles ? o.SPACE_CHAR : ""; t += 1; var y = this.dom.createElement("span"); - (y.style.width = o.config.characterWidth * 2 + "px"), + ((y.style.width = o.config.characterWidth * 2 + "px"), (y.className = o.showInvisibles ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk"), (y.textContent = o.showInvisibles ? o.SPACE_CHAR : ""), - a.appendChild(y); + a.appendChild(y)); } else if (v) { t += 1; var y = i.createElement("span"); - (y.style.width = o.config.characterWidth * 2 + "px"), + ((y.style.width = o.config.characterWidth * 2 + "px"), (y.className = "ace_cjk"), (y.textContent = v), - a.appendChild(y); + a.appendChild(y)); } } a.appendChild(this.dom.createTextNode(l ? r.slice(l) : r, this.element)); if (!this.$textToken[n.type]) { var w = "ace_" + n.type.replace(/\./g, " ace_"), y = this.dom.createElement("span"); - n.type == "fold" && + (n.type == "fold" && (y.style.width = n.value.length * this.config.characterWidth + "px"), (y.className = w), y.appendChild(a), - e.appendChild(y); + e.appendChild(y)); } else e.appendChild(a); return t + r.length; }), @@ -13711,15 +13745,15 @@ var l = t[f], c = l.value; if (f == 0 && this.displayIndentGuides) { - (r = c.length), (c = this.renderIndentGuide(a, c, o)); + ((r = c.length), (c = this.renderIndentGuide(a, c, o))); if (!c) continue; r -= c.length; } if (r + c.length < o) - (u = this.$renderToken(a, u, l, c)), (r += c.length); + ((u = this.$renderToken(a, u, l, c)), (r += c.length)); else { while (r + c.length >= o) - (u = this.$renderToken(a, u, l, c.substring(0, o - r))), + ((u = this.$renderToken(a, u, l, c.substring(0, o - r))), (c = c.substring(o - r)), (r = o), (a = this.$createLineElement()), @@ -13732,7 +13766,7 @@ ), i++, (u = 0), - (o = n[i] || Number.MAX_VALUE); + (o = n[i] || Number.MAX_VALUE)); c.length != 0 && ((r += c.length), (u = this.$renderToken(a, u, l, c))); } @@ -13742,10 +13776,10 @@ var n = 0, r = t[0], i = r.value; - this.displayIndentGuides && (i = this.renderIndentGuide(e, i)), - i && (n = this.$renderToken(e, n, r, i)); + (this.displayIndentGuides && (i = this.renderIndentGuide(e, i)), + i && (n = this.$renderToken(e, n, r, i))); for (var s = 1; s < t.length; s++) { - (r = t[s]), (i = r.value); + ((r = t[s]), (i = r.value)); if (n + i.length > this.MAX_LINE_LENGTH) return this.$renderOverflowMessage(e, n, r, i); n = this.$renderToken(e, n, r, i); @@ -13754,11 +13788,11 @@ (this.$renderOverflowMessage = function (e, t, n, r) { this.$renderToken(e, t, n, r.slice(0, this.MAX_LINE_LENGTH - t)); var i = this.dom.createElement("span"); - (i.className = "ace_inline_button ace_keyword ace_toggle_wrap"), + ((i.className = "ace_inline_button ace_keyword ace_toggle_wrap"), (i.style.position = "absolute"), (i.style.right = "0"), (i.textContent = ""), - e.appendChild(i); + e.appendChild(i)); }), (this.$renderLine = function (e, t, n) { !n && n != 0 && (n = this.session.getFoldLine(t)); @@ -13772,9 +13806,9 @@ var i = e.lastChild; } else { var i = e; - this.$useLineGroups() && + (this.$useLineGroups() && ((i = this.$createLineElement()), e.appendChild(i)), - this.$renderSimpleLine(i, r); + this.$renderSimpleLine(i, r)); } } else this.$useLineGroups() && @@ -13782,12 +13816,12 @@ if (this.showInvisibles && i) { n && (t = n.end.row); var o = this.dom.createElement("span"); - (o.className = "ace_invisible ace_invisible_eol"), + ((o.className = "ace_invisible ace_invisible_eol"), (o.textContent = t == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR), - i.appendChild(o); + i.appendChild(o)); } }), (this.$getFoldLineTokens = function (e, t) { @@ -13795,23 +13829,23 @@ var i = 0, s = 0; while (s + e[i].value.length < t) { - (s += e[i].value.length), i++; + ((s += e[i].value.length), i++); if (i == e.length) return; } if (s != t) { var o = e[i].value.substring(t - s); - o.length > n - t && (o = o.substring(0, n - t)), + (o.length > n - t && (o = o.substring(0, n - t)), r.push({ type: e[i].type, value: o }), (s = t + o.length), - (i += 1); + (i += 1)); } while (s < n && i < e.length) { var o = e[i].value; - o.length + s > n + (o.length + s > n ? r.push({ type: e[i].type, value: o.substring(0, n - s) }) : r.push(e[i]), (s += o.length), - (i += 1); + (i += 1)); } } var n = this.session, @@ -13833,16 +13867,16 @@ (this.$useLineGroups = function () { return this.session.getUseWrapMode(); }), - (this.destroy = function () {}); + (this.destroy = function () {})); }).call(a.prototype), - (t.Text = a); + (t.Text = a)); }, ), define("ace/layer/cursor", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { "use strict"; var r = e("../lib/dom"), i = function (e) { - (this.element = r.createElement("div")), + ((this.element = r.createElement("div")), (this.element.className = "ace_layer ace_cursor-layer"), e.appendChild(this.element), (this.isVisible = !1), @@ -13852,10 +13886,10 @@ (this.cursors = []), (this.cursor = this.addCursor()), r.addCssClass(this.element, "ace_hidden-cursors"), - (this.$updateCursors = this.$updateOpacity.bind(this)); + (this.$updateCursors = this.$updateOpacity.bind(this))); }; - (function () { - (this.$updateOpacity = function (e) { + ((function () { + ((this.$updateOpacity = function (e) { var t = this.cursors; for (var n = t.length; n--; ) r.setStyle(t[n].style, "opacity", e ? "" : "0"); }), @@ -13904,27 +13938,27 @@ (this.removeCursor = function () { if (this.cursors.length > 1) { var e = this.cursors.pop(); - return e.parentNode.removeChild(e), e; + return (e.parentNode.removeChild(e), e); } }), (this.hideCursor = function () { - (this.isVisible = !1), + ((this.isVisible = !1), r.addCssClass(this.element, "ace_hidden-cursors"), - this.restartTimer(); + this.restartTimer()); }), (this.showCursor = function () { - (this.isVisible = !0), + ((this.isVisible = !0), r.removeCssClass(this.element, "ace_hidden-cursors"), - this.restartTimer(); + this.restartTimer()); }), (this.restartTimer = function () { var e = this.$updateCursors; - clearInterval(this.intervalId), + (clearInterval(this.intervalId), clearTimeout(this.timeoutId), this.$stopCssAnimation(), this.smoothBlinking && r.removeCssClass(this.element, "ace_smooth-blinking"), - e(!0); + e(!0)); if (!this.isBlinking || !this.blinkInterval || !this.isVisible) { this.$stopCssAnimation(); return; @@ -13942,10 +13976,10 @@ e(!1); }, 0.6 * this.blinkInterval); }.bind(this); - (this.intervalId = setInterval(function () { - e(!0), t(); + ((this.intervalId = setInterval(function () { + (e(!0), t()); }, this.blinkInterval)), - t(); + t()); } }), (this.getPixelPosition = function (e, t) { @@ -13985,7 +14019,7 @@ } while (this.cursors.length > i) this.removeCursor(); var f = this.session.getOverwrite(); - this.$setOverwrite(f), (this.$pixelPos = o), this.restartTimer(); + (this.$setOverwrite(f), (this.$pixelPos = o), this.restartTimer()); }), (this.drawCursor = null), (this.$setOverwrite = function (e) { @@ -13996,10 +14030,10 @@ : r.removeCssClass(this.element, "ace_overwrite-cursors")); }), (this.destroy = function () { - clearInterval(this.intervalId), clearTimeout(this.timeoutId); - }); + (clearInterval(this.intervalId), clearTimeout(this.timeoutId)); + })); }).call(i.prototype), - (t.Cursor = i); + (t.Cursor = i)); }), define( "ace/scrollbar", @@ -14020,7 +14054,7 @@ o = e("./lib/event_emitter").EventEmitter, u = 32768, a = function (e) { - (this.element = i.createElement("div")), + ((this.element = i.createElement("div")), (this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix), (this.inner = i.createElement("div")), (this.inner.className = "ace_scrollbar-inner"), @@ -14029,28 +14063,28 @@ this.setVisible(!1), (this.skipEvent = !1), s.addListener(this.element, "scroll", this.onScroll.bind(this)), - s.addListener(this.element, "mousedown", s.preventDefault); + s.addListener(this.element, "mousedown", s.preventDefault)); }; (function () { - r.implement(this, o), + (r.implement(this, o), (this.setVisible = function (e) { - (this.element.style.display = e ? "" : "none"), + ((this.element.style.display = e ? "" : "none"), (this.isVisible = e), - (this.coeff = 1); - }); + (this.coeff = 1)); + })); }).call(a.prototype); var f = function (e, t) { - a.call(this, e), + (a.call(this, e), (this.scrollTop = 0), (this.scrollHeight = 0), (t.$scrollbarWidth = this.width = i.scrollbarWidth(e.ownerDocument)), (this.inner.style.width = this.element.style.width = (this.width || 15) + 5 + "px"), - (this.$minWidth = 0); + (this.$minWidth = 0)); }; - r.inherits(f, a), + (r.inherits(f, a), function () { - (this.classSuffix = "-v"), + ((this.classSuffix = "-v"), (this.onScroll = function () { if (!this.skipEvent) { this.scrollTop = this.element.scrollTop; @@ -14070,34 +14104,34 @@ }), (this.setInnerHeight = this.setScrollHeight = function (e) { - (this.scrollHeight = e), + ((this.scrollHeight = e), e > u ? ((this.coeff = u / e), (e = u)) : this.coeff != 1 && (this.coeff = 1), - (this.inner.style.height = e + "px"); + (this.inner.style.height = e + "px")); }), (this.setScrollTop = function (e) { this.scrollTop != e && ((this.skipEvent = !0), (this.scrollTop = e), (this.element.scrollTop = e * this.coeff)); - }); - }.call(f.prototype); + })); + }.call(f.prototype)); var l = function (e, t) { - a.call(this, e), + (a.call(this, e), (this.scrollLeft = 0), (this.height = t.$scrollbarWidth), (this.inner.style.height = this.element.style.height = - (this.height || 15) + 5 + "px"); + (this.height || 15) + 5 + "px")); }; - r.inherits(l, a), + (r.inherits(l, a), function () { - (this.classSuffix = "-h"), + ((this.classSuffix = "-h"), (this.onScroll = function () { - this.skipEvent || + (this.skipEvent || ((this.scrollLeft = this.element.scrollLeft), this._emit("scroll", { data: this.scrollLeft })), - (this.skipEvent = !1); + (this.skipEvent = !1)); }), (this.getHeight = function () { return this.isVisible ? this.height : 0; @@ -14115,36 +14149,36 @@ this.scrollLeft != e && ((this.skipEvent = !0), (this.scrollLeft = this.element.scrollLeft = e)); - }); + })); }.call(l.prototype), (t.ScrollBar = f), (t.ScrollBarV = f), (t.ScrollBarH = l), (t.VScrollBar = f), - (t.HScrollBar = l); + (t.HScrollBar = l)); }, ), define("ace/renderloop", ["require", "exports", "module", "ace/lib/event"], function (e, t, n) { "use strict"; var r = e("./lib/event"), i = function (e, t) { - (this.onRender = e), + ((this.onRender = e), (this.pending = !1), (this.changes = 0), - (this.window = t || window); + (this.window = t || window)); var n = this; this._flush = function (e) { var t = n.changes; - t && (r.blockIdle(100), (n.changes = 0), n.onRender(t)), - n.changes && n.schedule(); + (t && (r.blockIdle(100), (n.changes = 0), n.onRender(t)), + n.changes && n.schedule()); }; }; - (function () { + ((function () { this.schedule = function (e) { - (this.changes = this.changes | e), this.changes && r.nextFrame(this._flush); + ((this.changes = this.changes | e), this.changes && r.nextFrame(this._flush)); }; }).call(i.prototype), - (t.RenderLoop = i); + (t.RenderLoop = i)); }), define( "ace/layer/font_metrics", @@ -14170,7 +14204,7 @@ l = typeof ResizeObserver == "function", c = 200, h = (t.FontMetrics = function (e) { - (this.el = i.createElement("div")), + ((this.el = i.createElement("div")), this.$setMeasureNodeStyles(this.el.style, !0), (this.$main = i.createElement("div")), this.$setMeasureNodeStyles(this.$main.style), @@ -14181,19 +14215,19 @@ e.appendChild(this.el), (this.$measureNode.innerHTML = s.stringRepeat("X", f)), (this.$characterSize = { width: 0, height: 0 }), - l ? this.$addObserver() : this.checkForSizeChanges(); + l ? this.$addObserver() : this.checkForSizeChanges()); }); (function () { - r.implement(this, a), + (r.implement(this, a), (this.$characterSize = { width: 0, height: 0 }), (this.$setMeasureNodeStyles = function (e, t) { - (e.width = e.height = "auto"), + ((e.width = e.height = "auto"), (e.left = e.top = "0px"), (e.visibility = "hidden"), (e.position = "absolute"), (e.whiteSpace = "pre"), u.isIE < 8 ? (e["font-family"] = "inherit") : (e.font = "inherit"), - (e.overflow = t ? "hidden" : "visible"); + (e.overflow = t ? "hidden" : "visible")); }), (this.checkForSizeChanges = function (e) { e === undefined && (e = this.$measureSizes()); @@ -14204,28 +14238,28 @@ ) { this.$measureNode.style.fontWeight = "bold"; var t = this.$measureSizes(); - (this.$measureNode.style.fontWeight = ""), + ((this.$measureNode.style.fontWeight = ""), (this.$characterSize = e), (this.charSizes = Object.create(null)), (this.allowBoldFonts = t && t.width === e.width && t.height === e.height), - this._emit("changeCharacterSize", { data: e }); + this._emit("changeCharacterSize", { data: e })); } }), (this.$addObserver = function () { var e = this; - (this.$observer = new window.ResizeObserver(function (t) { + ((this.$observer = new window.ResizeObserver(function (t) { var n = t[0].contentRect; e.checkForSizeChanges({ height: n.height, width: n.width / f }); })), - this.$observer.observe(this.$measureNode); + this.$observer.observe(this.$measureNode)); }), (this.$pollSizeChanges = function () { if (this.$pollSizeChangesTimer || this.$observer) return this.$pollSizeChangesTimer; var e = this; return (this.$pollSizeChangesTimer = o.onIdle(function t() { - e.checkForSizeChanges(), o.onIdle(t, 500); + (e.checkForSizeChanges(), o.onIdle(t, 500)); }, 500)); }), (this.setPolling = function (e) { @@ -14257,11 +14291,11 @@ ); }), (this.destroy = function () { - clearInterval(this.$pollSizeChangesTimer), + (clearInterval(this.$pollSizeChangesTimer), this.$observer && this.$observer.disconnect(), this.el && this.el.parentNode && - this.el.parentNode.removeChild(this.el); + this.el.parentNode.removeChild(this.el)); }), (this.$getZoom = function e(t) { return t ? (window.getComputedStyle(t).zoom || 1) * e(t.parentElement) : 1; @@ -14317,7 +14351,7 @@ var b = i(e, a), w = r(i(d, o(p[0], b)), i(v, o(p[1], b)), b); return o(c, w); - }); + })); }).call(h.prototype); }, ), @@ -14362,7 +14396,7 @@ i.importCssString(v, "ace_editor.css"); var y = function (e, t) { var n = this; - (this.container = e || i.createElement("div")), + ((this.container = e || i.createElement("div")), i.addCssClass(this.container, "ace_editor"), i.HI_DPI && i.addCssClass(this.container, "ace_hidpi"), this.setTheme(t), @@ -14378,9 +14412,9 @@ this.scroller.appendChild(this.content), (this.$gutterLayer = new o(this.$gutter)), this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)), - (this.$markerBack = new u(this.content)); + (this.$markerBack = new u(this.content))); var r = (this.$textLayer = new a(this.content)); - (this.canvas = r.element), + ((this.canvas = r.element), (this.$markerFront = new u(this.content)), (this.$cursorLayer = new f(this.content)), (this.$horizScroll = !1), @@ -14399,9 +14433,9 @@ (this.$fontMetrics = new p(this.container)), this.$textLayer.$setFontMetrics(this.$fontMetrics), this.$textLayer.addEventListener("changeCharacterSize", function (e) { - n.updateCharacterSize(), + (n.updateCharacterSize(), n.onResize(!0, n.gutterWidth, n.$size.width, n.$size.height), - n._signal("changeCharacterSize", e); + n._signal("changeCharacterSize", e)); }), (this.$size = { width: 0, @@ -14435,10 +14469,10 @@ this.updateCharacterSize(), this.setPadding(4), s.resetOptions(this), - s._emit("renderer", this); + s._emit("renderer", this)); }; - (function () { - (this.CHANGE_CURSOR = 1), + ((function () { + ((this.CHANGE_CURSOR = 1), (this.CHANGE_MARKER = 2), (this.CHANGE_GUTTER = 4), (this.CHANGE_SCROLL = 8), @@ -14451,17 +14485,17 @@ (this.CHANGE_H_SCROLL = 1024), r.implement(this, d), (this.updateCharacterSize = function () { - this.$textLayer.allowBoldFonts != this.$allowBoldFonts && + (this.$textLayer.allowBoldFonts != this.$allowBoldFonts && ((this.$allowBoldFonts = this.$textLayer.allowBoldFonts), this.setStyle("ace_nobold", !this.$allowBoldFonts)), (this.layerConfig.characterWidth = this.characterWidth = this.$textLayer.getCharacterWidth()), (this.layerConfig.lineHeight = this.lineHeight = this.$textLayer.getLineHeight()), - this.$updatePrintMargin(); + this.$updatePrintMargin()); }), (this.setSession = function (e) { - this.session && + (this.session && this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode), (this.session = e), e && @@ -14472,23 +14506,23 @@ this.$markerBack.setSession(e), this.$markerFront.setSession(e), this.$gutterLayer.setSession(e), - this.$textLayer.setSession(e); + this.$textLayer.setSession(e)); if (!e) return; - this.$loop.schedule(this.CHANGE_FULL), + (this.$loop.schedule(this.CHANGE_FULL), this.session.$setFontMetrics(this.$fontMetrics), (this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null), (this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this)), this.onChangeNewLineMode(), - this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); + this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode)); }), (this.updateLines = function (e, t, n) { - t === undefined && (t = Infinity), + (t === undefined && (t = Infinity), this.$changedLines ? (this.$changedLines.firstRow > e && (this.$changedLines.firstRow = e), this.$changedLines.lastRow < t && (this.$changedLines.lastRow = t)) - : (this.$changedLines = { firstRow: e, lastRow: t }); + : (this.$changedLines = { firstRow: e, lastRow: t })); if (this.$changedLines.lastRow < this.layerConfig.firstRow) { if (!n) return; this.$changedLines.lastRow = this.layerConfig.lastRow; @@ -14497,13 +14531,13 @@ this.$loop.schedule(this.CHANGE_LINES); }), (this.onChangeNewLineMode = function () { - this.$loop.schedule(this.CHANGE_TEXT), + (this.$loop.schedule(this.CHANGE_TEXT), this.$textLayer.$updateEolChar(), - this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR); + this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)); }), (this.onChangeTabSize = function () { - this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER), - this.$textLayer.onChangeTabSize(); + (this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER), + this.$textLayer.onChangeTabSize()); }), (this.updateText = function () { this.$loop.schedule(this.CHANGE_TEXT); @@ -14524,16 +14558,16 @@ if (this.resizing > 2) return; this.resizing > 0 ? this.resizing++ : (this.resizing = e ? 1 : 0); var i = this.container; - r || (r = i.clientHeight || i.scrollHeight), - n || (n = i.clientWidth || i.scrollWidth); + (r || (r = i.clientHeight || i.scrollHeight), + n || (n = i.clientWidth || i.scrollWidth)); var s = this.$updateCachedSize(e, t, n, r); if (!this.$size.scrollerHeight || (!n && !r)) return (this.resizing = 0); - e && (this.$gutterLayer.$padding = null), + (e && (this.$gutterLayer.$padding = null), e ? this.$renderChanges(s | this.$changes, !0) : this.$loop.schedule(s | this.$changes), this.resizing && (this.resizing = 0), - (this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null); + (this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null)); }), (this.$updateCachedSize = function (e, t, n, r) { r -= this.$extraHeight || 0; @@ -14555,7 +14589,7 @@ this.scrollBarH.getHeight() + "px"), (s |= this.CHANGE_SCROLL)); if (n && (e || o.width != n)) { - (s |= this.CHANGE_SIZE), + ((s |= this.CHANGE_SIZE), (o.width = n), t == null && (t = this.$showGutter ? this.$gutter.offsetWidth : 0), (this.gutterWidth = t), @@ -14569,15 +14603,15 @@ 0, n - t - this.scrollBarV.getWidth() - this.margin.h, )), - i.setStyle(this.$gutter.style, "left", this.margin.left + "px"); + i.setStyle(this.$gutter.style, "left", this.margin.left + "px")); var a = this.scrollBarV.getWidth() + "px"; - i.setStyle(this.scrollBarH.element.style, "right", a), + (i.setStyle(this.scrollBarH.element.style, "right", a), i.setStyle(this.scroller.style, "right", a), i.setStyle( this.scroller.style, "bottom", this.scrollBarH.getHeight(), - ); + )); if ( (this.session && this.session.getUseWrapMode() && @@ -14586,11 +14620,11 @@ ) s |= this.CHANGE_FULL; } - return (o.$dirty = !n || !r), s && this._signal("resize", u), s; + return ((o.$dirty = !n || !r), s && this._signal("resize", u), s); }), (this.onGutterResize = function (e) { var t = this.$showGutter ? e : 0; - t != this.gutterWidth && + (t != this.gutterWidth && (this.$changes |= this.$updateCachedSize( !0, t, @@ -14601,7 +14635,7 @@ ? this.$loop.schedule(this.CHANGE_FULL) : this.$size.$dirty ? this.$loop.schedule(this.CHANGE_FULL) - : this.$computeLayerConfig(); + : this.$computeLayerConfig()); }), (this.adjustWrapLimit = function () { var e = this.$size.scrollerWidth - this.$padding * 2, @@ -14618,8 +14652,8 @@ return this.$animatedScroll; }), (this.setShowInvisibles = function (e) { - this.setOption("showInvisibles", e), - this.session.$bidiHandler.setShowInvisibles(e); + (this.setOption("showInvisibles", e), + this.session.$bidiHandler.setShowInvisibles(e)); }), (this.getShowInvisibles = function () { return this.getOption("showInvisibles"); @@ -14664,19 +14698,19 @@ if (!this.$showPrintMargin && !this.$printMarginEl) return; if (!this.$printMarginEl) { var e = i.createElement("div"); - (e.className = "ace_layer ace_print-margin-layer"), + ((e.className = "ace_layer ace_print-margin-layer"), (this.$printMarginEl = i.createElement("div")), (this.$printMarginEl.className = "ace_print-margin"), e.appendChild(this.$printMarginEl), - this.content.insertBefore(e, this.content.firstChild); + this.content.insertBefore(e, this.content.firstChild)); } var t = this.$printMarginEl.style; - (t.left = + ((t.left = Math.round( this.characterWidth * this.$printMarginColumn + this.$padding, ) + "px"), (t.visibility = this.$showPrintMargin ? "visible" : "hidden"), - this.session && this.session.$wrap == -1 && this.adjustWrapLimit(); + this.session && this.session.$wrap == -1 && this.adjustWrapLimit()); }), (this.getContainerElement = function () { return this.container; @@ -14712,10 +14746,10 @@ if (!n) s += this.lineHeight; else if (n.useTextareaForIME) { var f = this.textarea.value; - (a = this.characterWidth * this.session.$getStringScreenWidth(f)[0]), - (u += 2); + ((a = this.characterWidth * this.session.$getStringScreenWidth(f)[0]), + (u += 2)); } else s += this.lineHeight + 2; - (o -= this.scrollLeft), + ((o -= this.scrollLeft), o > this.$size.scrollerWidth - a && (o = this.$size.scrollerWidth - a), (o += this.gutterWidth + this.margin.left), i.setStyle(e, "height", u + "px"), @@ -14724,7 +14758,7 @@ this.textarea, Math.min(o, this.$size.scrollerWidth - a), Math.min(s, this.$size.height - u), - ); + )); }), (this.getFirstVisibleRow = function () { return this.layerConfig.firstRow; @@ -14745,17 +14779,17 @@ }), (this.$padding = null), (this.setPadding = function (e) { - (this.$padding = e), + ((this.$padding = e), this.$textLayer.setPadding(e), this.$cursorLayer.setPadding(e), this.$markerFront.setPadding(e), this.$markerBack.setPadding(e), this.$loop.schedule(this.CHANGE_FULL), - this.$updatePrintMargin(); + this.$updatePrintMargin()); }), (this.setScrollMargin = function (e, t, n, r) { var i = this.scrollMargin; - (i.top = e | 0), + ((i.top = e | 0), (i.bottom = t | 0), (i.right = r | 0), (i.left = n | 0), @@ -14765,11 +14799,11 @@ this.scrollTop <= 0 && this.session && this.session.setScrollTop(-i.top), - this.updateFull(); + this.updateFull()); }), (this.setMargin = function (e, t, n, r) { var i = this.margin; - (i.top = e | 0), + ((i.top = e | 0), (i.bottom = t | 0), (i.right = r | 0), (i.left = n | 0), @@ -14781,7 +14815,7 @@ this.$size.width, this.$size.height, ), - this.updateFull(); + this.updateFull()); }), (this.getHScrollBarAlwaysVisible = function () { return this.$hScrollBarAlwaysVisible; @@ -14798,19 +14832,21 @@ (this.$updateScrollBarV = function () { var e = this.layerConfig.maxHeight, t = this.$size.scrollerHeight; - !this.$maxLines && + (!this.$maxLines && this.$scrollPastEnd && ((e -= (t - this.lineHeight) * this.$scrollPastEnd), this.scrollTop > e - t && ((e = this.scrollTop + t), (this.scrollBarV.scrollTop = null))), this.scrollBarV.setScrollHeight(e + this.scrollMargin.v), - this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); + this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top)); }), (this.$updateScrollBarH = function () { - this.scrollBarH.setScrollWidth( + (this.scrollBarH.setScrollWidth( this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h, ), - this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); + this.scrollBarH.setScrollLeft( + this.scrollLeft + this.scrollMargin.left, + )); }), (this.$frozen = !1), (this.freeze = function () { @@ -14830,12 +14866,12 @@ this.$changes |= e; return; } - if (this.$size.$dirty) return (this.$changes |= e), this.onResize(!0); - this.lineHeight || this.$textLayer.checkForSizeChanges(), + if (this.$size.$dirty) return ((this.$changes |= e), this.onResize(!0)); + (this.lineHeight || this.$textLayer.checkForSizeChanges(), this._signal("beforeRender"), this.session && this.session.$bidiHandler && - this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics); + this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics)); var n = this.layerConfig; if ( e & this.CHANGE_FULL || @@ -14858,14 +14894,14 @@ (e |= this.CHANGE_SCROLL), (e |= this.$computeLayerConfig())); } - (n = this.layerConfig), + ((n = this.layerConfig), this.$updateScrollBarV(), e & this.CHANGE_H_SCROLL && this.$updateScrollBarH(), - i.translate(this.content, -this.scrollLeft, -n.offset); + i.translate(this.content, -this.scrollLeft, -n.offset)); var s = n.width + 2 * this.$padding + "px", o = n.minHeight + "px"; - i.setStyle(this.content.style, "width", s), - i.setStyle(this.content.style, "height", o); + (i.setStyle(this.content.style, "width", s), + i.setStyle(this.content.style, "height", o)); } e & this.CHANGE_H_SCROLL && (i.translate(this.content, -this.scrollLeft, -n.offset), @@ -14874,17 +14910,17 @@ ? "ace_scroller" : "ace_scroller ace_scroll-left")); if (e & this.CHANGE_FULL) { - this.$textLayer.update(n), + (this.$textLayer.update(n), this.$showGutter && this.$gutterLayer.update(n), this.$markerBack.update(n), this.$markerFront.update(n), this.$cursorLayer.update(n), this.$moveTextAreaToCursor(), - this._signal("afterRender"); + this._signal("afterRender")); return; } if (e & this.CHANGE_SCROLL) { - e & this.CHANGE_TEXT || e & this.CHANGE_LINES + (e & this.CHANGE_TEXT || e & this.CHANGE_LINES ? this.$textLayer.update(n) : this.$textLayer.scrollLines(n), this.$showGutter && @@ -14895,10 +14931,10 @@ this.$markerFront.update(n), this.$cursorLayer.update(n), this.$moveTextAreaToCursor(), - this._signal("afterRender"); + this._signal("afterRender")); return; } - e & this.CHANGE_TEXT + (e & this.CHANGE_TEXT ? (this.$textLayer.update(n), this.$showGutter && this.$gutterLayer.update(n)) : e & this.CHANGE_LINES @@ -14916,7 +14952,7 @@ this.$markerFront.update(n), e & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK) && this.$markerBack.update(n), - this._signal("afterRender"); + this._signal("afterRender")); }), (this.$autosize = function () { var e = this.session.getScreenLength() * this.lineHeight, @@ -14925,10 +14961,10 @@ Math.min(t, Math.max((this.$minLines || 1) * this.lineHeight, e)) + this.scrollMargin.v + (this.$extraHeight || 0); - this.$horizScroll && (n += this.scrollBarH.getHeight()), + (this.$horizScroll && (n += this.scrollBarH.getHeight()), this.$maxPixelHeight && n > this.$maxPixelHeight && - (n = this.$maxPixelHeight); + (n = this.$maxPixelHeight)); var r = n <= 2 * this.lineHeight, i = !r && e > t; if ( @@ -14939,10 +14975,10 @@ i != this.$vScroll && ((this.$vScroll = i), this.scrollBarV.setVisible(i)); var s = this.container.clientWidth; - (this.container.style.height = n + "px"), + ((this.container.style.height = n + "px"), this.$updateCachedSize(!0, this.$gutterWidth, s, n), (this.desiredHeight = n), - this._signal("autosize"); + this._signal("autosize")); } }), (this.$computeLayerConfig = function () { @@ -14968,7 +15004,7 @@ : 0; i += c; var h = this.scrollMargin; - this.session.setScrollTop( + (this.session.setScrollTop( Math.max( -h.top, Math.min(this.scrollTop, i - t.scrollerHeight + h.bottom), @@ -14982,7 +15018,7 @@ s + 2 * this.$padding - t.scrollerWidth + h.right, ), ), - ); + )); var p = !n && (this.$vScrollBarAlwaysVisible || @@ -14998,18 +15034,18 @@ w = this.lineHeight; m = e.screenToDocumentRow(m, 0); var E = e.getFoldLine(m); - E && (m = E.start.row), + (E && (m = E.start.row), (y = e.documentToScreenRow(m, 0)), (b = e.getRowLength(m) * w), (g = Math.min(e.screenToDocumentRow(g, 0), e.getLength() - 1)), (l = t.scrollerHeight + e.getRowLength(g) * w + b), - (f = this.scrollTop - y * w); + (f = this.scrollTop - y * w)); var S = 0; if (this.layerConfig.width != s || u) S = this.CHANGE_H_SCROLL; if (u || d) - (S = this.$updateCachedSize(!0, this.gutterWidth, t.width, t.height)), + ((S = this.$updateCachedSize(!0, this.gutterWidth, t.width, t.height)), this._signal("scrollbarVisibilityChanged"), - d && (s = this.$getLongestLine()); + d && (s = this.$getLongestLine())); return ( (this.layerConfig = { width: s, @@ -15041,11 +15077,11 @@ if (e > n.lastRow + 1) return; if (t < n.firstRow) return; if (t === Infinity) { - this.$showGutter && this.$gutterLayer.update(n), - this.$textLayer.update(n); + (this.$showGutter && this.$gutterLayer.update(n), + this.$textLayer.update(n)); return; } - return this.$textLayer.updateLines(n, e, t), !0; + return (this.$textLayer.updateLines(n, e, t), !0); }), (this.$getLongestLine = function () { var e = this.session.getScreenWidth(); @@ -15061,12 +15097,12 @@ ); }), (this.updateFrontMarkers = function () { - this.$markerFront.setMarkers(this.session.getMarkers(!0)), - this.$loop.schedule(this.CHANGE_MARKER_FRONT); + (this.$markerFront.setMarkers(this.session.getMarkers(!0)), + this.$loop.schedule(this.CHANGE_MARKER_FRONT)); }), (this.updateBackMarkers = function () { - this.$markerBack.setMarkers(this.session.getMarkers()), - this.$loop.schedule(this.CHANGE_MARKER_BACK); + (this.$markerBack.setMarkers(this.session.getMarkers()), + this.$loop.schedule(this.CHANGE_MARKER_BACK)); }), (this.addGutterDecoration = function (e, t) { this.$gutterLayer.addGutterDecoration(e, t); @@ -15078,8 +15114,8 @@ this.$loop.schedule(this.CHANGE_GUTTER); }), (this.setAnnotations = function (e) { - this.$gutterLayer.setAnnotations(e), - this.$loop.schedule(this.CHANGE_GUTTER); + (this.$gutterLayer.setAnnotations(e), + this.$loop.schedule(this.CHANGE_GUTTER)); }), (this.updateCursor = function () { this.$loop.schedule(this.CHANGE_CURSOR); @@ -15091,7 +15127,7 @@ this.$cursorLayer.showCursor(); }), (this.scrollSelectionIntoView = function (e, t, n) { - this.scrollCursorIntoView(e, n), this.scrollCursorIntoView(t, n); + (this.scrollCursorIntoView(e, n), this.scrollCursorIntoView(t, n)); }), (this.scrollCursorIntoView = function (e, t, n) { if (this.$size.scrollerHeight === 0) return; @@ -15154,7 +15190,7 @@ var n = this.$cursorLayer.getPixelPosition(e), r = this.$size.scrollerHeight - this.lineHeight, i = n.top - r * (t || 0); - return this.session.setScrollTop(i), i; + return (this.session.setScrollTop(i), i); }), (this.STEPS = 8), (this.$calcSteps = function (e, t) { @@ -15172,7 +15208,7 @@ s = i.top; t && (s -= this.$size.scrollerHeight / 2); var o = this.scrollTop; - this.session.setScrollTop(s), n !== !1 && this.animateScrolling(o, r); + (this.session.setScrollTop(s), n !== !1 && this.animateScrolling(o, r)); }), (this.animateScrolling = function (e, t) { var n = this.scrollTop; @@ -15187,7 +15223,7 @@ } } var s = r.$calcSteps(e, n); - (this.$scrollAnimation = { from: e, to: n, steps: s }), + ((this.$scrollAnimation = { from: e, to: n, steps: s }), clearInterval(this.$timer), r.session.setScrollTop(s.shift()), (r.session.$scrollTop = n), @@ -15202,22 +15238,22 @@ : ((r.$timer = clearInterval(r.$timer)), (r.$scrollAnimation = null), t && t()); - }, 10)); + }, 10))); }), (this.scrollToY = function (e) { this.scrollTop !== e && (this.$loop.schedule(this.CHANGE_SCROLL), (this.scrollTop = e)); }), (this.scrollToX = function (e) { - this.scrollLeft !== e && (this.scrollLeft = e), - this.$loop.schedule(this.CHANGE_H_SCROLL); + (this.scrollLeft !== e && (this.scrollLeft = e), + this.$loop.schedule(this.CHANGE_H_SCROLL)); }), (this.scrollTo = function (e, t) { - this.session.setScrollTop(t), this.session.setScrollLeft(t); + (this.session.setScrollTop(t), this.session.setScrollLeft(t)); }), (this.scrollBy = function (e, t) { - t && this.session.setScrollTop(this.session.getScrollTop() + t), - e && this.session.setScrollLeft(this.session.getScrollLeft() + e); + (t && this.session.setScrollTop(this.session.getScrollTop() + t), + e && this.session.setScrollLeft(this.session.getScrollLeft() + e)); }), (this.isScrollableBy = function (e, t) { if (t < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) @@ -15246,7 +15282,7 @@ if (this.$hasCssTransforms) { n = { top: 0, left: 0 }; var r = this.$fontMetrics.transformCoordinates([e, t]); - (e = r[1] - this.gutterWidth - this.margin.left), (t = r[0]); + ((e = r[1] - this.gutterWidth - this.margin.left), (t = r[0])); } else n = this.scroller.getBoundingClientRect(); var i = e + this.scrollLeft - n.left - this.$padding, s = i / this.characterWidth, @@ -15259,7 +15295,7 @@ if (this.$hasCssTransforms) { n = { top: 0, left: 0 }; var r = this.$fontMetrics.transformCoordinates([e, t]); - (e = r[1] - this.gutterWidth - this.margin.left), (t = r[0]); + ((e = r[1] - this.gutterWidth - this.margin.left), (t = r[0])); } else n = this.scroller.getBoundingClientRect(); var i = e + this.scrollLeft - n.left - this.$padding, s = i / this.characterWidth, @@ -15288,7 +15324,7 @@ i.removeCssClass(this.container, "ace_focus"); }), (this.showComposition = function (e) { - (this.$composition = e), + ((this.$composition = e), e.cssText || ((e.cssText = this.textarea.style.cssText), (e.keepTextAreaAtCursor = this.$keepTextAreaAtCursor)), @@ -15303,22 +15339,22 @@ e.markerRange, "ace_composition_marker", "text", - )); + ))); }), (this.setCompositionText = function (e) { var t = this.session.selection.cursor; - this.addToken(e, "composition_placeholder", t.row, t.column), - this.$moveTextAreaToCursor(); + (this.addToken(e, "composition_placeholder", t.row, t.column), + this.$moveTextAreaToCursor()); }), (this.hideComposition = function () { if (!this.$composition) return; - this.$composition.markerId && + (this.$composition.markerId && this.session.removeMarker(this.$composition.markerId), i.removeCssClass(this.textarea, "ace_composition"), (this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor), (this.textarea.style.cssText = this.$composition.cssText), (this.$composition = null), - (this.$cursorLayer.element.style.display = ""); + (this.$cursorLayer.element.style.display = "")); }), (this.addToken = function (e, t, n, r) { var i = this.session; @@ -15352,26 +15388,26 @@ throw new Error( "couldn't load module " + e + " or it didn't call define", ); - r.$id && (n.$themeId = r.$id), + (r.$id && (n.$themeId = r.$id), i.importCssString(r.cssText, r.cssClass, n.container), - n.theme && i.removeCssClass(n.container, n.theme.cssClass); + n.theme && i.removeCssClass(n.container, n.theme.cssClass)); var s = "padding" in r ? r.padding : "padding" in (n.theme || {}) ? 4 : n.$padding; - n.$padding && s != n.$padding && n.setPadding(s), + (n.$padding && s != n.$padding && n.setPadding(s), (n.$theme = r.cssClass), (n.theme = r), i.addCssClass(n.container, r.cssClass), i.setCssClass(n.container, "ace_dark", r.isDark), n.$size && ((n.$size.width = 0), n.$updateSizeAsync()), n._dispatchEvent("themeLoaded", { theme: r }), - t && t(); + t && t()); } var n = this; - (this.$themeId = e), n._dispatchEvent("themeChange", { theme: e }); + ((this.$themeId = e), n._dispatchEvent("themeChange", { theme: e })); if (!e || typeof e == "string") { var r = e || this.$options.theme.initialValue; s.loadModule(["theme", r], o); @@ -15396,8 +15432,8 @@ i.importCssString(v, "ace_editor.css", this.container); }), (this.destroy = function () { - this.$fontMetrics.destroy(), this.$cursorLayer.destroy(); - }); + (this.$fontMetrics.destroy(), this.$cursorLayer.destroy()); + })); }).call(y.prototype), s.defineOptions(y.prototype, "renderer", { animatedScroll: { initialValue: !1 }, @@ -15422,9 +15458,9 @@ }, printMargin: { set: function (e) { - typeof e == "number" && (this.$printMarginColumn = e), + (typeof e == "number" && (this.$printMarginColumn = e), (this.$showPrintMargin = !!e), - this.$updatePrintMargin(); + this.$updatePrintMargin()); }, get: function () { return this.$showPrintMargin && this.$printMarginColumn; @@ -15432,9 +15468,9 @@ }, showGutter: { set: function (e) { - (this.$gutter.style.display = e ? "block" : "none"), + ((this.$gutter.style.display = e ? "block" : "none"), this.$loop.schedule(this.CHANGE_FULL), - this.onGutterResize(); + this.onGutterResize()); }, initialValue: !0, }, @@ -15446,8 +15482,8 @@ }, showFoldWidgets: { set: function (e) { - this.$gutterLayer.setShowFoldWidgets(e), - this.$loop.schedule(this.CHANGE_GUTTER); + (this.$gutterLayer.setShowFoldWidgets(e), + this.$loop.schedule(this.CHANGE_GUTTER)); }, initialValue: !0, }, @@ -15460,8 +15496,8 @@ }, highlightGutterLine: { set: function (e) { - this.$gutterLayer.setHighlightGutterLine(e), - this.$loop.schedule(this.CHANGE_GUTTER); + (this.$gutterLayer.setHighlightGutterLine(e), + this.$loop.schedule(this.CHANGE_GUTTER)); }, initialValue: !0, }, @@ -15481,15 +15517,15 @@ }, fontSize: { set: function (e) { - typeof e == "number" && (e += "px"), + (typeof e == "number" && (e += "px"), (this.container.style.fontSize = e), - this.updateFontSize(); + this.updateFontSize()); }, initialValue: 12, }, fontFamily: { set: function (e) { - (this.container.style.fontFamily = e), this.updateFontSize(); + ((this.container.style.fontFamily = e), this.updateFontSize()); }, }, maxLines: { @@ -15499,8 +15535,8 @@ }, minLines: { set: function (e) { - this.$minLines < 562949953421311 || (this.$minLines = 0), - this.updateFull(); + (this.$minLines < 562949953421311 || (this.$minLines = 0), + this.updateFull()); }, }, maxPixelHeight: { @@ -15513,15 +15549,15 @@ set: function (e) { e = +e || 0; if (this.$scrollPastEnd == e) return; - (this.$scrollPastEnd = e), this.$loop.schedule(this.CHANGE_SCROLL); + ((this.$scrollPastEnd = e), this.$loop.schedule(this.CHANGE_SCROLL)); }, initialValue: 0, handlesSet: !0, }, fixedWidthGutter: { set: function (e) { - (this.$gutterLayer.$fixedWidth = !!e), - this.$loop.schedule(this.CHANGE_GUTTER); + ((this.$gutterLayer.$fixedWidth = !!e), + this.$loop.schedule(this.CHANGE_GUTTER)); }, }, theme: { @@ -15537,7 +15573,7 @@ hasCssTransforms: {}, useTextareaForIME: { initialValue: !m.isMobile && !m.isIE }, }), - (t.VirtualRenderer = y); + (t.VirtualRenderer = y)); }, ), define( @@ -15560,7 +15596,7 @@ } catch (n) { var r = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder, s = new r(); - return s.append(t), s.getBlob("application/javascript"); + return (s.append(t), s.getBlob("application/javascript")); } } function a(e) { @@ -15576,10 +15612,10 @@ s = e("../lib/event_emitter").EventEmitter, o = e("../config"), f = function (t, n, r, i, s) { - (this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this)), + ((this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this)), (this.changeListener = this.changeListener.bind(this)), (this.onMessage = this.onMessage.bind(this)), - e.nameToUrl && !e.toUrl && (e.toUrl = e.nameToUrl); + e.nameToUrl && !e.toUrl && (e.toUrl = e.nameToUrl)); if (o.get("packaged") || !e.toUrl) i = i || o.moduleUrl(n, "worker"); else { var u = this.$normalizePath; @@ -15589,15 +15625,15 @@ f[t] = u(e.toUrl(t, null, "_").replace(/(\.js)?(\?.*)?$/, "")); }); } - (this.$worker = a(i)), + ((this.$worker = a(i)), s && this.send("importScripts", s), this.$worker.postMessage({ init: !0, tlns: f, module: n, classname: r }), (this.callbackId = 1), (this.callbacks = {}), - (this.$worker.onmessage = this.onMessage); + (this.$worker.onmessage = this.onMessage)); }; (function () { - r.implement(this, s), + (r.implement(this, s), (this.onMessage = function (e) { var t = e.data; switch (t.type) { @@ -15622,12 +15658,12 @@ return i.qualifyURL(e); }), (this.terminate = function () { - this._signal("terminate", {}), + (this._signal("terminate", {}), (this.deltaQueue = null), this.$worker.terminate(), (this.$worker = null), this.$doc && this.$doc.off("change", this.changeListener), - (this.$doc = null); + (this.$doc = null)); }), (this.send = function (e, t) { this.$worker.postMessage({ command: e, args: t }); @@ -15635,71 +15671,71 @@ (this.call = function (e, t, n) { if (n) { var r = this.callbackId++; - (this.callbacks[r] = n), t.push(r); + ((this.callbacks[r] = n), t.push(r)); } this.send(e, t); }), (this.emit = function (e, t) { try { - t.data && + (t.data && t.data.err && (t.data.err = { message: t.data.err.message, stack: t.data.err.stack, code: t.data.err.code, }), - this.$worker.postMessage({ event: e, data: { data: t.data } }); + this.$worker.postMessage({ event: e, data: { data: t.data } })); } catch (n) { console.error(n.stack); } }), (this.attachToDocument = function (e) { - this.$doc && this.terminate(), + (this.$doc && this.terminate(), (this.$doc = e), this.call("setValue", [e.getValue()]), - e.on("change", this.changeListener); + e.on("change", this.changeListener)); }), (this.changeListener = function (e) { - this.deltaQueue || + (this.deltaQueue || ((this.deltaQueue = []), setTimeout(this.$sendDeltaQueue, 0)), e.action == "insert" ? this.deltaQueue.push(e.start, e.lines) - : this.deltaQueue.push(e.start, e.end); + : this.deltaQueue.push(e.start, e.end)); }), (this.$sendDeltaQueue = function () { var e = this.deltaQueue; if (!e) return; - (this.deltaQueue = null), + ((this.deltaQueue = null), e.length > 50 && e.length > this.$doc.getLength() >> 1 ? this.call("setValue", [this.$doc.getValue()]) - : this.emit("change", { data: e }); - }); + : this.emit("change", { data: e })); + })); }).call(f.prototype); var l = function (e, t, n) { - (this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this)), + ((this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this)), (this.changeListener = this.changeListener.bind(this)), (this.callbackId = 1), (this.callbacks = {}), - (this.messageBuffer = []); + (this.messageBuffer = [])); var r = null, i = !1, u = Object.create(s), a = this; - (this.$worker = {}), + ((this.$worker = {}), (this.$worker.terminate = function () {}), (this.$worker.postMessage = function (e) { - a.messageBuffer.push(e), r && (i ? setTimeout(f) : f()); + (a.messageBuffer.push(e), r && (i ? setTimeout(f) : f())); }), (this.setEmitSync = function (e) { i = e; - }); + })); var f = function () { var e = a.messageBuffer.shift(); e.command ? r[e.command].apply(r, e.args) : e.event && u._signal(e.event, e.data); }; - (u.postMessage = function (e) { + ((u.postMessage = function (e) { a.onMessage({ data: e }); }), (u.callback = function (e, t) { @@ -15711,12 +15747,12 @@ o.loadModule(["worker", t], function (e) { r = new e[n](u); while (a.messageBuffer.length) f(); - }); + })); }; - (l.prototype = f.prototype), + ((l.prototype = f.prototype), (t.UIWorkerClient = l), (t.WorkerClient = f), - (t.createWorker = a); + (t.createWorker = a)); }, ), define( @@ -15729,7 +15765,7 @@ s = e("./lib/oop"), o = function (e, t, n, r, i, s) { var o = this; - (this.length = t), + ((this.length = t), (this.session = e), (this.doc = e.getDocument()), (this.mainClass = i), @@ -15742,24 +15778,24 @@ o.onCursorChange(); }); }), - (this.$pos = n); + (this.$pos = n)); var u = e.getUndoManager().$undoStack || e.getUndoManager().$undostack || { length: -1 }; - (this.$undoStackDepth = u.length), + ((this.$undoStackDepth = u.length), this.setup(), - e.selection.on("changeCursor", this.$onCursorChange); + e.selection.on("changeCursor", this.$onCursorChange)); }; - (function () { - s.implement(this, i), + ((function () { + (s.implement(this, i), (this.setup = function () { var e = this, t = this.doc, n = this.session; - (this.selectionBefore = n.selection.toJSON()), + ((this.selectionBefore = n.selection.toJSON()), n.selection.inMultiSelectMode && n.selection.toSingleRange(), - (this.pos = t.createAnchor(this.$pos.row, this.$pos.column)); + (this.pos = t.createAnchor(this.$pos.row, this.$pos.column))); var i = this.pos; - (i.$insertRight = !0), + ((i.$insertRight = !0), i.detach(), (i.markerId = n.addMarker( new r(i.row, i.column, i.row, i.column + this.length), @@ -15770,15 +15806,15 @@ (this.others = []), this.$others.forEach(function (n) { var r = t.createAnchor(n.row, n.column); - (r.$insertRight = !0), r.detach(), e.others.push(r); + ((r.$insertRight = !0), r.detach(), e.others.push(r)); }), - n.setUndoSelect(!1); + n.setUndoSelect(!1)); }), (this.showOtherMarkers = function () { if (this.othersActive) return; var e = this.session, t = this; - (this.othersActive = !0), + ((this.othersActive = !0), this.others.forEach(function (n) { n.markerId = e.addMarker( new r(n.row, n.column, n.row, n.column + t.length), @@ -15786,7 +15822,7 @@ null, !1, ); - }); + })); }), (this.hideOtherMarkers = function () { if (!this.othersActive) return; @@ -15808,7 +15844,7 @@ t.start.column >= this.pos.column && t.start.column <= this.pos.column + this.length + 1, s = t.start.column - this.pos.column; - this.updateAnchors(e), i && (this.length += n); + (this.updateAnchors(e), i && (this.length += n)); if (i && !this.session.$fromUndo) if (e.action === "insert") for (var o = this.others.length - 1; o >= 0; o--) { @@ -15822,7 +15858,7 @@ a = { row: u.row, column: u.column + s }; this.doc.remove(new r(a.row, a.column, a.row, a.column - n)); } - (this.$updating = !1), this.updateMarkers(); + ((this.$updating = !1), this.updateMarkers()); }), (this.updateAnchors = function (e) { this.pos.onChange(e); @@ -15834,13 +15870,13 @@ var e = this, t = this.session, n = function (n, i) { - t.removeMarker(n.markerId), + (t.removeMarker(n.markerId), (n.markerId = t.addMarker( new r(n.row, n.column, n.row, n.column + e.length), i, null, !1, - )); + ))); }; n(this.pos, this.mainClass); for (var i = this.others.length; i--; ) n(this.others[i], this.othersClass); @@ -15855,7 +15891,7 @@ : (this.hideOtherMarkers(), this._emit("cursorLeave", e)); }), (this.detach = function () { - this.session.removeMarker(this.pos && this.pos.markerId), + (this.session.removeMarker(this.pos && this.pos.markerId), this.hideOtherMarkers(), this.doc.removeEventListener("change", this.$onUpdate), this.session.selection.removeEventListener( @@ -15863,7 +15899,7 @@ this.$onCursorChange, ), this.session.setUndoSelect(!0), - (this.session = null); + (this.session = null)); }), (this.cancel = function () { if (this.$undoStackDepth === -1) return; @@ -15872,9 +15908,9 @@ for (var n = 0; n < t; n++) e.undo(this.session, !0); this.selectionBefore && this.session.selection.fromJSON(this.selectionBefore); - }); + })); }).call(o.prototype), - (t.PlaceHolder = o); + (t.PlaceHolder = o)); }, ), define( @@ -15910,7 +15946,7 @@ m = e.x, g = e.y, y = function (e) { - (m = e.clientX), (g = e.clientY); + ((m = e.clientX), (g = e.clientY)); }, b = l.session, w = l.renderer.pixelToScreenCoordinates(m, g), @@ -15932,27 +15968,27 @@ l.addSelectionMarker(x); } var T = c.rangeList.rangeAtPoint(p); - (l.inVirtualSelectionMode = !0), + ((l.inVirtualSelectionMode = !0), o && ((T = null), (x = c.ranges[0] || x), l.removeSelectionMarker(x)), l.once("mouseup", function () { var e = c.toOrientedRange(); - T && e.isEmpty() && s(T.cursor, e.cursor) + (T && e.isEmpty() && s(T.cursor, e.cursor) ? c.substractPoint(e.cursor) : (o ? c.substractPoint(x.cursor) : x && (l.removeSelectionMarker(x), c.addRange(x)), c.addRange(e)), - (l.inVirtualSelectionMode = !1); - }); + (l.inVirtualSelectionMode = !1)); + })); } else if (S == "block") { - e.stop(), (l.inVirtualSelectionMode = !0); + (e.stop(), (l.inVirtualSelectionMode = !0)); var N, C = [], k = function () { var e = l.renderer.pixelToScreenCoordinates(m, g), t = b.screenToDocumentPosition(e.row, e.column, e.offsetX); if (s(E, e) && s(t, c.lead)) return; - (E = e), + ((E = e), l.selection.moveToPosition(t), l.renderer.scrollCursorIntoView(), l.removeSelectionMarkers(C), @@ -15962,22 +15998,22 @@ C[0].isEmpty() && (C[0] = l.$mouseHandler.$clickSelection.clone()), C.forEach(l.addSelectionMarker, l), - l.updateSelectionMarkers(); + l.updateSelectionMarkers()); }; - h && !a + (h && !a ? c.toSingleRange() : !h && a && ((N = c.toOrientedRange()), l.addSelectionMarker(N)), o ? (w = b.documentToScreenPosition(c.lead)) : c.moveToPosition(p), - (E = { row: -1, column: -1 }); + (E = { row: -1, column: -1 })); var L = function (e) { - k(), + (k(), clearInterval(O), l.removeSelectionMarkers(C), C.length || (C = [c.toOrientedRange()]), - N && (l.removeSelectionMarker(N), c.toSingleRange(N)); + N && (l.removeSelectionMarker(N), c.toSingleRange(N))); for (var t = 0; t < C.length; t++) c.addRange(C[t]); - (l.inVirtualSelectionMode = !1), - (l.$mouseHandler.$clickSelection = null); + ((l.inVirtualSelectionMode = !1), + (l.$mouseHandler.$clickSelection = null)); }, A = k; r.capture(l.container, y, L); @@ -15996,7 +16032,7 @@ "ace/commands/multi_select_commands", ["require", "exports", "module", "ace/keyboard/hash_handler"], function (e, t, n) { - (t.defaultCommands = [ + ((t.defaultCommands = [ { name: "addCursorAbove", exec: function (e) { @@ -16108,7 +16144,7 @@ return e && e.inMultiSelectMode; }, }, - ]); + ])); var r = e("../keyboard/hash_handler").HashHandler; t.keyboardHandler = new r(t.multiSelectCommands); }, @@ -16145,7 +16181,7 @@ } function m(e) { if (e.$multiselectOnSessionChange) return; - (e.$onAddRange = e.$onAddRange.bind(e)), + ((e.$onAddRange = e.$onAddRange.bind(e)), (e.$onRemoveRange = e.$onRemoveRange.bind(e)), (e.$onMultiSelect = e.$onMultiSelect.bind(e)), (e.$onSingleSelect = e.$onSingleSelect.bind(e)), @@ -16155,7 +16191,7 @@ e.on("changeSession", e.$multiselectOnSessionChange), e.on("mousedown", o), e.commands.addCommands(f.defaultCommands), - g(e); + g(e)); } function g(e) { function r(t) { @@ -16163,14 +16199,14 @@ } var t = e.textInput.getElement(), n = !1; - u.addListener(t, "keydown", function (t) { + (u.addListener(t, "keydown", function (t) { var i = t.keyCode == 18 && !(t.ctrlKey || t.shiftKey || t.metaKey); e.$blockSelectEnabled && i ? n || (e.renderer.setMouseCursor("crosshair"), (n = !0)) : n && r(); }), u.addListener(t, "keyup", r), - u.addListener(t, "blur", r); + u.addListener(t, "blur", r)); } var r = e("./range_list").RangeList, i = e("./range").Range, @@ -16183,26 +16219,27 @@ var l = e("./search").Search, c = new l(), p = e("./edit_session").EditSession; - (function () { + ((function () { this.getSelectionMarkers = function () { return this.$selectionMarkers; }; }).call(p.prototype), function () { - (this.ranges = null), + ((this.ranges = null), (this.rangeList = null), (this.addRange = function (e, t) { if (!e) return; if (!this.inMultiSelectMode && this.rangeCount === 0) { var n = this.toOrientedRange(); - this.rangeList.add(n), this.rangeList.add(e); + (this.rangeList.add(n), this.rangeList.add(e)); if (this.rangeList.ranges.length != 2) return ( - this.rangeList.removeAll(), t || this.fromOrientedRange(e) + this.rangeList.removeAll(), + t || this.fromOrientedRange(e) ); - this.rangeList.removeAll(), + (this.rangeList.removeAll(), this.rangeList.add(n), - this.$onAddRange(n); + this.$onAddRange(n)); } e.cursor || (e.cursor = e.end); var r = this.rangeList.add(e); @@ -16221,32 +16258,32 @@ (this.toSingleRange = function (e) { e = e || this.ranges[0]; var t = this.rangeList.removeAll(); - t.length && this.$onRemoveRange(t), e && this.fromOrientedRange(e); + (t.length && this.$onRemoveRange(t), e && this.fromOrientedRange(e)); }), (this.substractPoint = function (e) { var t = this.rangeList.substractPoint(e); - if (t) return this.$onRemoveRange(t), t[0]; + if (t) return (this.$onRemoveRange(t), t[0]); }), (this.mergeOverlappingRanges = function () { var e = this.rangeList.merge(); e.length && this.$onRemoveRange(e); }), (this.$onAddRange = function (e) { - (this.rangeCount = this.rangeList.ranges.length), + ((this.rangeCount = this.rangeList.ranges.length), this.ranges.unshift(e), - this._signal("addRange", { range: e }); + this._signal("addRange", { range: e })); }), (this.$onRemoveRange = function (e) { this.rangeCount = this.rangeList.ranges.length; if (this.rangeCount == 1 && this.inMultiSelectMode) { var t = this.rangeList.ranges.pop(); - e.push(t), (this.rangeCount = 0); + (e.push(t), (this.rangeCount = 0)); } for (var n = e.length; n--; ) { var r = this.ranges.indexOf(e[n]); this.ranges.splice(r, 1); } - this._signal("removeRange", { ranges: e }), + (this._signal("removeRange", { ranges: e }), this.rangeCount === 0 && this.inMultiSelectMode && ((this.inMultiSelectMode = !1), @@ -16254,11 +16291,11 @@ (this.session.$undoSelect = !0), this.rangeList.detach(this.session)), (t = t || this.ranges[0]), - t && !t.isEqual(this.getRange()) && this.fromOrientedRange(t); + t && !t.isEqual(this.getRange()) && this.fromOrientedRange(t)); }), (this.$initRangeList = function () { if (this.rangeList) return; - (this.rangeList = new r()), (this.ranges = []), (this.rangeCount = 0); + ((this.rangeList = new r()), (this.ranges = []), (this.rangeCount = 0)); }), (this.getAllRanges = function () { return this.rangeCount @@ -16270,8 +16307,8 @@ var e = this.rangeList.ranges, t = e[e.length - 1], n = i.fromPoints(e[0].start, t.end); - this.toSingleRange(), - this.setSelectionRange(n, t.cursor == t.start); + (this.toSingleRange(), + this.setSelectionRange(n, t.cursor == t.start)); } else { var n = this.getRange(), r = this.isBackwards(), @@ -16284,18 +16321,18 @@ else var u = n.start, a = n.end; - this.addRange(i.fromPoints(a, a)), - this.addRange(i.fromPoints(u, u)); + (this.addRange(i.fromPoints(a, a)), + this.addRange(i.fromPoints(u, u))); return; } var f = [], l = this.getLineRange(s, !0); - (l.start.column = n.start.column), f.push(l); + ((l.start.column = n.start.column), f.push(l)); for (var c = s + 1; c < o; c++) f.push(this.getLineRange(c, !0)); - (l = this.getLineRange(o, !0)), + ((l = this.getLineRange(o, !0)), (l.end.column = n.end.column), f.push(l), - f.forEach(this.addRange, this); + f.forEach(this.addRange, this)); } }), (this.toggleBlockSelection = function () { @@ -16303,8 +16340,8 @@ var e = this.rangeList.ranges, t = e[e.length - 1], n = i.fromPoints(e[0].start, t.end); - this.toSingleRange(), - this.setSelectionRange(n, t.cursor == t.start); + (this.toSingleRange(), + this.setSelectionRange(n, t.cursor == t.start)); } else { var r = this.session.documentToScreenPosition(this.cursor), s = this.session.documentToScreenPosition(this.anchor), @@ -16332,7 +16369,7 @@ else var c = t.row, h = e.row; - o < 0 && (o = 0), c < 0 && (c = 0), c == h && (n = !0); + (o < 0 && (o = 0), c < 0 && (c = 0), c == h && (n = !0)); var p; for (var d = c; d <= h; d++) { var m = i.fromPoints( @@ -16343,7 +16380,7 @@ if (p && v(m.end, p)) break; p = m.end; } - (m.cursor = s ? m.start : m.end), r.push(m); + ((m.cursor = s ? m.start : m.end), r.push(m)); } l && r.reverse(); if (!n) { @@ -16356,12 +16393,12 @@ for (var b = g; b >= y; b--) r[b].isEmpty() && r.splice(b, 1); } return r; - }); - }.call(s.prototype); + })); + }.call(s.prototype)); var d = e("./editor").Editor; - (function () { - (this.updateSelectionMarkers = function () { - this.renderer.updateCursor(), this.renderer.updateBackMarkers(); + ((function () { + ((this.updateSelectionMarkers = function () { + (this.renderer.updateCursor(), this.renderer.updateBackMarkers()); }), (this.addSelectionMarker = function (e) { e.cursor || (e.cursor = e.end); @@ -16378,9 +16415,9 @@ if (!e.marker) return; this.session.removeMarker(e.marker); var t = this.session.$selectionMarkers.indexOf(e); - t != -1 && this.session.$selectionMarkers.splice(t, 1), + (t != -1 && this.session.$selectionMarkers.splice(t, 1), (this.session.selectionMarkerCount = - this.session.$selectionMarkers.length); + this.session.$selectionMarkers.length)); }), (this.removeSelectionMarkers = function (e) { var t = this.session.$selectionMarkers; @@ -16394,33 +16431,33 @@ this.session.selectionMarkerCount = t.length; }), (this.$onAddRange = function (e) { - this.addSelectionMarker(e.range), + (this.addSelectionMarker(e.range), this.renderer.updateCursor(), - this.renderer.updateBackMarkers(); + this.renderer.updateBackMarkers()); }), (this.$onRemoveRange = function (e) { - this.removeSelectionMarkers(e.ranges), + (this.removeSelectionMarkers(e.ranges), this.renderer.updateCursor(), - this.renderer.updateBackMarkers(); + this.renderer.updateBackMarkers()); }), (this.$onMultiSelect = function (e) { if (this.inMultiSelectMode) return; - (this.inMultiSelectMode = !0), + ((this.inMultiSelectMode = !0), this.setStyle("ace_multiselect"), this.keyBinding.addKeyboardHandler(f.keyboardHandler), this.commands.setDefaultHandler("exec", this.$onMultiSelectExec), this.renderer.updateCursor(), - this.renderer.updateBackMarkers(); + this.renderer.updateBackMarkers()); }), (this.$onSingleSelect = function (e) { if (this.session.multiSelect.inVirtualMode) return; - (this.inMultiSelectMode = !1), + ((this.inMultiSelectMode = !1), this.unsetStyle("ace_multiselect"), this.keyBinding.removeKeyboardHandler(f.keyboardHandler), this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec), this.renderer.updateCursor(), this.renderer.updateBackMarkers(), - this._emit("changeSelection"); + this._emit("changeSelection")); }), (this.$onMultiSelectExec = function (e) { var t = e.command, @@ -16428,8 +16465,8 @@ if (!n.multiSelect) return; if (!t.multiSelectAction) { var r = t.exec(n, e.args || {}); - n.multiSelect.addRange(n.multiSelect.toOrientedRange()), - n.multiSelect.mergeOverlappingRanges(); + (n.multiSelect.addRange(n.multiSelect.toOrientedRange()), + n.multiSelect.mergeOverlappingRanges()); } else t.multiSelectAction == "forEach" ? (r = n.forEachSelection(t, e.args)) @@ -16456,18 +16493,18 @@ this.inVirtualSelectionMode = !0; for (var p = f.length; p--; ) { if (i) while (p > 0 && f[p].start.row == f[p - 1].end.row) p--; - h.fromOrientedRange(f[p]), + (h.fromOrientedRange(f[p]), (h.index = p), - (this.selection = o.selection = h); + (this.selection = o.selection = h)); var d = e.exec ? e.exec(this, t || {}) : e(this, t || {}); - !l && d !== undefined && (l = d), h.toOrientedRange(f[p]); + (!l && d !== undefined && (l = d), h.toOrientedRange(f[p])); } - h.detach(), + (h.detach(), (this.selection = o.selection = u), (this.inVirtualSelectionMode = !1), (u._eventRegistry = c), u.mergeOverlappingRanges(), - u.ranges[0] && u.fromOrientedRange(u.ranges[0]); + u.ranges[0] && u.fromOrientedRange(u.ranges[0])); var v = this.renderer.$scrollAnimation; return ( this.onCursorChange(), @@ -16488,7 +16525,7 @@ for (var r = 0; r < t.length; r++) n.push(this.session.getTextRange(t[r])); var i = this.session.getDocument().getNewLineCharacter(); - (e = n.join(i)), e.length == (n.length - 1) * i.length && (e = ""); + ((e = n.join(i)), e.length == (n.length - 1) * i.length && (e = "")); } else this.selection.isEmpty() || (e = this.session.getTextRange(this.getSelectionRange())); @@ -16511,7 +16548,7 @@ } }), (this.findAll = function (e, t, n) { - (t = t || {}), (t.needle = e || t.needle); + ((t = t || {}), (t.needle = e || t.needle)); if (t.needle == undefined) { var r = this.selection.isEmpty() ? this.selection.getWordRange() @@ -16525,7 +16562,8 @@ n || s.toSingleRange(i[0]); for (var o = i.length; o--; ) s.addRange(i[o], !0); return ( - r && s.rangeList.rangeAtPoint(r.start) && s.addRange(r, !0), i.length + r && s.rangeList.rangeAtPoint(r.start) && s.addRange(r, !0), + i.length ); }), (this.selectMoreLines = function (e, t) { @@ -16548,7 +16586,7 @@ f.desiredColumn = s.column; if (!this.selection.inMultiSelectMode) this.selection.addRange(n); else if (t) var l = n.cursor; - this.selection.addRange(f), l && this.selection.substractPoint(l); + (this.selection.addRange(f), l && this.selection.substractPoint(l)); }), (this.transposeSelections = function (e) { var t = this.session, @@ -16558,10 +16596,10 @@ var s = r[i]; if (s.isEmpty()) { var o = t.getWordRange(s.start.row, s.start.column); - (s.start.row = o.start.row), + ((s.start.row = o.start.row), (s.start.column = o.start.column), (s.end.row = o.end.row), - (s.end.column = o.end.column); + (s.end.column = o.end.column)); } } n.mergeOverlappingRanges(); @@ -16574,9 +16612,9 @@ for (var i = r.length; i--; ) { var s = r[i], o = s.clone(); - t.replace(s, u[i]), + (t.replace(s, u[i]), (s.start.row = o.start.row), - (s.start.column = o.start.column); + (s.start.column = o.start.column)); } n.fromOrientedRange(n.ranges[0]); }), @@ -16585,19 +16623,19 @@ i = r.multiSelect, s = i.toOrientedRange(); if (s.isEmpty()) { - (s = r.getWordRange(s.start.row, s.start.column)), + ((s = r.getWordRange(s.start.row, s.start.column)), (s.cursor = e == -1 ? s.start : s.end), - this.multiSelect.addRange(s); + this.multiSelect.addRange(s)); if (n) return; } var o = r.getTextRange(s), u = h(r, o, e); - u && + (u && ((u.cursor = e == -1 ? u.start : u.end), this.session.unfold(u), this.multiSelect.addRange(u), this.renderer.scrollCursorIntoView(null, 0.5)), - t && this.multiSelect.substractPoint(s.cursor); + t && this.multiSelect.substractPoint(s.cursor)); }), (this.alignCursors = function () { var e = this.session, @@ -16620,14 +16658,14 @@ while (/[=:]/.test(h) && ++f < c); do h = this.session.getLine(u); while (/[=:]/.test(h) && --u > 0); - u < 0 && (u = 0), f >= c && (f = c - 1); + (u < 0 && (u = 0), f >= c && (f = c - 1)); } var p = this.session.removeFullLines(u, f); - (p = this.$reAlignText(p, l)), + ((p = this.$reAlignText(p, l)), this.session.insert({ row: u, column: 0 }, p.join("\n") + "\n"), l || ((o.start.column = 0), (o.end.column = p[p.length - 1].length)), - this.selection.setRange(o); + this.selection.setRange(o)); } else { s.forEach(function (e) { t.substractPoint(e.cursor); @@ -16645,20 +16683,20 @@ i ); }); - n.forEach(function (t, n) { + (n.forEach(function (t, n) { var r = t.cursor, s = d - r.column, o = m[n] - v; - s > o + (s > o ? e.insert(r, a.stringRepeat(" ", s - o)) : e.remove(new i(r.row, r.column, r.row, r.column - s + o)), (t.start.column = t.end.column = d), (t.start.row = t.end.row = r.row), - (t.cursor = t.end); + (t.cursor = t.end)); }), t.fromOrientedRange(n[0]), this.renderer.updateCursor(), - this.renderer.updateBackMarkers(); + this.renderer.updateBackMarkers()); } }), (this.$reAlignText = function (e, t) { @@ -16710,18 +16748,18 @@ : [e]; }) .map(t ? f : n ? (r ? l : f) : c); - }); + })); }).call(d.prototype), (t.onSessionChange = function (e) { var t = e.session; - t && + (t && !t.multiSelect && ((t.$selectionMarkers = []), t.selection.$initRangeList(), (t.multiSelect = t.selection)), - (this.multiSelect = t && t.multiSelect); + (this.multiSelect = t && t.multiSelect)); var n = e.oldSession; - n && + (n && (n.multiSelect.off("addRange", this.$onAddRange), n.multiSelect.off("removeRange", this.$onRemoveRange), n.multiSelect.off("multiSelect", this.$onMultiSelect), @@ -16739,18 +16777,18 @@ this.inMultiSelectMode != t.selection.inMultiSelectMode && (t.selection.inMultiSelectMode ? this.$onMultiSelect() - : this.$onSingleSelect()); + : this.$onSingleSelect())); }), (t.MultiSelect = m), e("./config").defineOptions(d.prototype, "editor", { enableMultiselect: { set: function (e) { - m(this), + (m(this), e ? (this.on("changeSession", this.$multiselectOnSessionChange), this.on("mousedown", o)) : (this.off("changeSession", this.$multiselectOnSessionChange), - this.off("mousedown", o)); + this.off("mousedown", o))); }, value: !0, }, @@ -16760,7 +16798,7 @@ }, value: !0, }, - }); + })); }, ), define( @@ -16771,7 +16809,7 @@ var r = e("../../range").Range, i = (t.FoldMode = function () {}); (function () { - (this.foldingStartMarker = null), + ((this.foldingStartMarker = null), (this.foldingStopMarker = null), (this.getFoldWidget = function (e, t, n) { var r = e.getLine(n); @@ -16823,8 +16861,8 @@ var o = { row: n, column: i }, u = e.$findOpeningBracket(t, o); if (!u) return; - return u.column++, o.column--, r.fromPoints(u, o); - }); + return (u.column++, o.column--, r.fromPoints(u, o)); + })); }).call(i.prototype); }, ), @@ -16833,11 +16871,11 @@ ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { "use strict"; - (t.isDark = !1), + ((t.isDark = !1), (t.cssClass = "ace-tm"), (t.cssText = '.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}'), - (t.$id = "ace/theme/textmate"); + (t.$id = "ace/theme/textmate")); var r = e("../lib/dom"); r.importCssString(t.cssText, t.cssClass); }, @@ -16848,7 +16886,7 @@ function (e, t, n) { "use strict"; function o(e) { - (this.session = e), + ((this.session = e), (this.session.widgetManager = this), (this.session.getRowLength = this.getRowLength), (this.session.$getWidgetScreenLength = this.$getWidgetScreenLength), @@ -16859,13 +16897,13 @@ (this.$onChangeEditor = this.$onChangeEditor.bind(this)), this.session.on("change", this.updateOnChange), this.session.on("changeFold", this.updateOnFold), - this.session.on("changeEditor", this.$onChangeEditor); + this.session.on("changeEditor", this.$onChangeEditor)); } var r = e("./lib/oop"), i = e("./lib/dom"), s = e("./range").Range; - (function () { - (this.getRowLength = function (e) { + ((function () { + ((this.getRowLength = function (e) { var t; return ( this.lineWidgets @@ -16891,20 +16929,20 @@ (this.attach = function (e) { e && e.widgetManager && e.widgetManager != this && e.widgetManager.detach(); if (this.editor == e) return; - this.detach(), + (this.detach(), (this.editor = e), e && ((e.widgetManager = this), e.renderer.on("beforeRender", this.measureWidgets), - e.renderer.on("afterRender", this.renderWidgets)); + e.renderer.on("afterRender", this.renderWidgets))); }), (this.detach = function (e) { var t = this.editor; if (!t) return; - (this.editor = null), + ((this.editor = null), (t.widgetManager = null), t.renderer.off("beforeRender", this.measureWidgets), - t.renderer.off("afterRender", this.renderWidgets); + t.renderer.off("afterRender", this.renderWidgets)); var n = this.session.lineWidgets; n && n.forEach(function (e) { @@ -16937,40 +16975,40 @@ if (r !== 0) if (e.action == "remove") { var i = t.splice(n + 1, r); - i.forEach(function (e) { + (i.forEach(function (e) { e && this.removeLineWidget(e); }, this), - this.$updateRows(); + this.$updateRows()); } else { var s = new Array(r); - s.unshift(n, 0), t.splice.apply(t, s), this.$updateRows(); + (s.unshift(n, 0), t.splice.apply(t, s), this.$updateRows()); } }), (this.$updateRows = function () { var e = this.session.lineWidgets; if (!e) return; var t = !0; - e.forEach(function (e, n) { + (e.forEach(function (e, n) { if (e) { - (t = !1), (e.row = n); - while (e.$oldWidget) (e.$oldWidget.row = n), (e = e.$oldWidget); + ((t = !1), (e.row = n)); + while (e.$oldWidget) ((e.$oldWidget.row = n), (e = e.$oldWidget)); } }), - t && (this.session.lineWidgets = null); + t && (this.session.lineWidgets = null)); }), (this.addLineWidget = function (e) { this.session.lineWidgets || (this.session.lineWidgets = new Array(this.session.getLength())); var t = this.session.lineWidgets[e.row]; - t && + (t && ((e.$oldWidget = t), t.el && t.el.parentNode && (t.el.parentNode.removeChild(t.el), (t._inDocument = !1))), (this.session.lineWidgets[e.row] = e), - (e.session = this.session); + (e.session = this.session)); var n = this.editor.renderer; - e.html && + (e.html && !e.el && ((e.el = i.createElement("div")), (e.el.innerHTML = e.html)), e.el && @@ -16982,7 +17020,7 @@ e.coverGutter || (e.el.style.zIndex = 3), e.pixelHeight == null && (e.pixelHeight = e.el.offsetHeight), e.rowCount == null && - (e.rowCount = e.pixelHeight / n.layerConfig.lineHeight); + (e.rowCount = e.pixelHeight / n.layerConfig.lineHeight)); var r = this.session.getFoldAt(e.row, 0); e.$fold = r; if (r) { @@ -17000,9 +17038,9 @@ ); }), (this.removeLineWidget = function (e) { - (e._inDocument = !1), + ((e._inDocument = !1), (e.session = null), - e.el && e.el.parentNode && e.el.parentNode.removeChild(e.el); + e.el && e.el.parentNode && e.el.parentNode.removeChild(e.el)); if (e.editor && e.editor.destroy) try { e.editor.destroy(); @@ -17010,8 +17048,8 @@ if (this.session.lineWidgets) { var n = this.session.lineWidgets[e.row]; if (n == e) - (this.session.lineWidgets[e.row] = e.$oldWidget), - e.$oldWidget && this.onWidgetChanged(e.$oldWidget); + ((this.session.lineWidgets[e.row] = e.$oldWidget), + e.$oldWidget && this.onWidgetChanged(e.$oldWidget)); else while (n) { if (n.$oldWidget == e) { @@ -17021,19 +17059,19 @@ n = n.$oldWidget; } } - this.session._emit("changeFold", { data: { start: { row: e.row } } }), - this.$updateRows(); + (this.session._emit("changeFold", { data: { start: { row: e.row } } }), + this.$updateRows()); }), (this.getWidgetsAtRow = function (e) { var t = this.session.lineWidgets, n = t && t[e], r = []; - while (n) r.push(n), (n = n.$oldWidget); + while (n) (r.push(n), (n = n.$oldWidget)); return r; }), (this.onWidgetChanged = function (e) { - this.session._changedWidgets.push(e), - this.editor && this.editor.renderer.updateFull(); + (this.session._changedWidgets.push(e), + this.editor && this.editor.renderer.updateFull()); }), (this.measureWidgets = function (e, t) { var n = this.session._changedWidgets, @@ -17046,21 +17084,21 @@ if (o.session != this.session) continue; if (!o._inDocument) { if (this.session.lineWidgets[o.row] != o) continue; - (o._inDocument = !0), t.container.appendChild(o.el); + ((o._inDocument = !0), t.container.appendChild(o.el)); } - (o.h = o.el.offsetHeight), + ((o.h = o.el.offsetHeight), o.fixedWidth || ((o.w = o.el.offsetWidth), - (o.screenWidth = Math.ceil(o.w / r.characterWidth))); + (o.screenWidth = Math.ceil(o.w / r.characterWidth)))); var u = o.h / r.lineHeight; - o.coverLine && + (o.coverLine && ((u -= this.session.getRowLineCount(o.row)), u < 0 && (u = 0)), - o.rowCount != u && ((o.rowCount = u), o.row < i && (i = o.row)); + o.rowCount != u && ((o.rowCount = u), o.row < i && (i = o.row))); } - i != Infinity && + (i != Infinity && (this.session._emit("changeFold", { data: { start: { row: i } } }), (this.session.lineWidgetWidth = null)), - (this.session._changedWidgets = []); + (this.session._changedWidgets = [])); }), (this.renderWidgets = function (e, t) { var n = t.layerConfig, @@ -17069,9 +17107,9 @@ var i = Math.min(this.firstRow, n.firstRow), s = Math.max(this.lastRow, n.lastRow, r.length); while (i > 0 && !r[i]) i--; - (this.firstRow = n.firstRow), + ((this.firstRow = n.firstRow), (this.lastRow = n.lastRow), - (t.$cursorLayer.config = n); + (t.$cursorLayer.config = n)); for (var o = i; o <= s; o++) { var u = r[o]; if (!u || !u.el) continue; @@ -17081,22 +17119,22 @@ } u._inDocument || ((u._inDocument = !0), t.container.appendChild(u.el)); var a = t.$cursorLayer.getPixelPosition({ row: o, column: 0 }, !0).top; - u.coverLine || + (u.coverLine || (a += n.lineHeight * this.session.getRowLineCount(u.row)), - (u.el.style.top = a - n.offset + "px"); + (u.el.style.top = a - n.offset + "px")); var f = u.coverGutter ? 0 : t.gutterWidth; - u.fixedWidth || (f -= t.scrollLeft), + (u.fixedWidth || (f -= t.scrollLeft), (u.el.style.left = f + "px"), u.fullWidth && u.screenWidth && (u.el.style.minWidth = n.width + 2 * n.padding + "px"), u.fixedWidth ? (u.el.style.right = t.scrollBar.getWidth() + "px") - : (u.el.style.right = ""); + : (u.el.style.right = "")); } - }); + })); }).call(o.prototype), - (t.LineWidgets = o); + (t.LineWidgets = o)); }, ), define( @@ -17122,10 +17160,10 @@ var r = e.getAnnotations().sort(s.comparePoints); if (!r.length) return; var i = o(r, { row: t, column: -1 }, s.comparePoints); - i < 0 && (i = -i - 1), + (i < 0 && (i = -i - 1), i >= r.length ? (i = n > 0 ? 0 : r.length - 1) - : i === 0 && n < 0 && (i = r.length - 1); + : i === 0 && n < 0 && (i = r.length - 1)); var u = r[i]; if (!u || !n) return; if (u.row === t) { @@ -17135,14 +17173,14 @@ } var a = []; t = u.row; - do a[n < 0 ? "unshift" : "push"](u), (u = r[(i += n)]); + do (a[n < 0 ? "unshift" : "push"](u), (u = r[(i += n)])); while (u && u.row == t); return a.length && a; } var r = e("../line_widgets").LineWidgets, i = e("../lib/dom"), s = e("../range").Range; - (t.showErrorMarker = function (e, t) { + ((t.showErrorMarker = function (e, t) { var n = e.session; n.widgetManager || ((n.widgetManager = new r(n)), n.widgetManager.attach(e)); var s = e.getCursorPosition(), @@ -17155,14 +17193,14 @@ l; if (f) { var c = f[0]; - (s.column = (c.pos && typeof c.column != "number" ? c.pos.sc : c.column) || 0), + ((s.column = (c.pos && typeof c.column != "number" ? c.pos.sc : c.column) || 0), (s.row = c.row), - (l = e.renderer.$gutterLayer.$annotations[s.row]); + (l = e.renderer.$gutterLayer.$annotations[s.row])); } else { if (a) return; l = { text: ["Looks good!"], className: "ace_ok" }; } - e.session.unfold(s.row), e.selection.moveToPosition(s); + (e.session.unfold(s.row), e.selection.moveToPosition(s)); var h = { row: s.row, fixedWidth: !0, @@ -17174,23 +17212,23 @@ d = h.el.appendChild(i.createElement("div")); d.className = "error_widget_arrow " + l.className; var v = e.renderer.$cursorLayer.getPixelPosition(s).left; - (d.style.left = v + e.renderer.gutterWidth - 5 + "px"), + ((d.style.left = v + e.renderer.gutterWidth - 5 + "px"), (h.el.className = "error_widget_wrapper"), (p.className = "error_widget " + l.className), (p.innerHTML = l.text.join("
    ")), - p.appendChild(i.createElement("div")); + p.appendChild(i.createElement("div"))); var m = function (e, t, n) { if (t === 0 && (n === "esc" || n === "return")) - return h.destroy(), { command: "null" }; + return (h.destroy(), { command: "null" }); }; - (h.destroy = function () { + ((h.destroy = function () { if (e.$mouseHandler.isMousePressed) return; - e.keyBinding.removeKeyboardHandler(m), + (e.keyBinding.removeKeyboardHandler(m), n.widgetManager.removeLineWidget(h), e.off("changeSelection", h.destroy), e.off("changeSession", h.destroy), e.off("mouseup", h.destroy), - e.off("change", h.destroy); + e.off("change", h.destroy)); }), e.keyBinding.addKeyboardHandler(m), e.on("changeSelection", h.destroy), @@ -17199,12 +17237,12 @@ e.on("change", h.destroy), e.session.widgetManager.addLineWidget(h), (h.el.onmousedown = e.focus.bind(e)), - e.renderer.scrollCursorIntoView(null, 0.5, { bottom: h.el.offsetHeight }); + e.renderer.scrollCursorIntoView(null, 0.5, { bottom: h.el.offsetHeight })); }), i.importCssString( " .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }", "", - ); + )); }, ), define( @@ -17240,7 +17278,7 @@ u = e("./edit_session").EditSession, a = e("./undomanager").UndoManager, f = e("./virtual_renderer").VirtualRenderer; - e("./worker/worker_client"), + (e("./worker/worker_client"), e("./keyboard/hash_handler"), e("./placeholder"), e("./multi_select"), @@ -17260,9 +17298,9 @@ var u = ""; if (e && /input|textarea/i.test(e.tagName)) { var a = e; - (u = a.value), + ((u = a.value), (e = r.createElement("pre")), - a.parentNode.replaceChild(e, a); + a.parentNode.replaceChild(e, a)); } else e && ((u = e.textContent), (e.innerHTML = "")); var l = t.createEditSession(u), c = new o(new f(e), l, n), @@ -17271,8 +17309,8 @@ a && (h.textarea = a), i.addListener(window, "resize", h.onResize), c.on("destroy", function () { - i.removeListener(window, "resize", h.onResize), - (h.editor.container.env = null); + (i.removeListener(window, "resize", h.onResize), + (h.editor.container.env = null)); }), (c.container.env = c.env = h), c @@ -17280,15 +17318,15 @@ }), (t.createEditSession = function (e, t) { var n = new u(e, t); - return n.setUndoManager(new a()), n; + return (n.setUndoManager(new a()), n); }), (t.Range = s), (t.EditSession = u), (t.UndoManager = a), (t.VirtualRenderer = f), - (t.version = "1.4.1"); + (t.version = "1.4.1")); }, - ); + )); (function () { window.require(["ace/ace"], function (a) { if (a) { diff --git a/web/static/ace/ext-beautify.js b/web/static/ace/ext-beautify.js index c95276659..aa6e64331 100644 --- a/web/static/ace/ext-beautify.js +++ b/web/static/ace/ext-beautify.js @@ -8,7 +8,7 @@ define("ace/ext/beautify", ["require", "exports", "module", "ace/token_iterator" return e.type.lastIndexOf(t + ".xml") > -1; } var r = e("../token_iterator").TokenIterator; - (t.singletonTags = [ + ((t.singletonTags = [ "area", "base", "br", @@ -91,12 +91,12 @@ define("ace/ext/beautify", ["require", "exports", "module", "ace/token_iterator" p = p.replace(/ +$/, ""); }, j = function () { - (p = p.trimRight()), (l = !1); + ((p = p.trimRight()), (l = !1)); }; while (s !== null) { - (T = n.getCurrentTokenRow()), (C = n.$rowTokens), (f = n.stepForward()); + ((T = n.getCurrentTokenRow()), (C = n.$rowTokens), (f = n.stepForward())); if (typeof s != "undefined") { - (d = s.value), + ((d = s.value), (w = 0), (M = v === "style" || e.$modeId === "ace/mode/css"), i(s, "tag-open") @@ -114,14 +114,14 @@ define("ace/ext/beautify", ["require", "exports", "module", "ace/token_iterator" s.type === "paren.rparen" && s.value.substr(0, 1) === "}" && N++, - T !== x && ((N = T), x && (N -= x)); + T !== x && ((N = T), x && (N -= x))); if (N) { j(); for (; N > 0; N--) p += "\n"; - (l = !0), + ((l = !0), !i(s, "comment") && !s.type.match(/^(comment|string)$/) && - (d = d.trimLeft()); + (d = d.trimLeft())); } if (d) { s.type === "keyword" && @@ -182,10 +182,10 @@ define("ace/ext/beautify", ["require", "exports", "module", "ace/token_iterator" b++; for (L = m; L > g; L--) D[L] = b; } else m < g && (b = D[m]); - (g = m), (y = b), w && (b -= w), A && !E && (b++, (A = !1)); + ((g = m), (y = b), w && (b -= w), A && !E && (b++, (A = !1))); for (L = 0; L < b; L++) p += o; } - s.type === "keyword" && d.match(/^(case|default)$/) && ((P[m] = d), m++), + (s.type === "keyword" && d.match(/^(case|default)$/) && ((P[m] = d), m++), s.type === "keyword" && d.match(/^(break)$/) && P[m - 1] && @@ -195,36 +195,36 @@ define("ace/ext/beautify", ["require", "exports", "module", "ace/token_iterator" ((E += (d.match(/\(/g) || []).length), (m += d.length)), s.type === "keyword" && d.match(/^(if|else|elseif|for|while)$/) ? ((A = !0), (E = 0)) - : !E && d.trim() && s.type !== "comment" && (A = !1); + : !E && d.trim() && s.type !== "comment" && (A = !1)); if (s.type === "paren.rparen") { E -= (d.match(/\)/g) || []).length; for (L = 0; L < d.length; L++) - m--, d.substr(L, 1) === "}" && P[m] === "case" && m--; + (m--, d.substr(L, 1) === "}" && P[m] === "case" && m--); } - c && !l && (B(), p.substr(-1) !== "\n" && (p += " ")), + (c && !l && (B(), p.substr(-1) !== "\n" && (p += " ")), (p += d), h && (p += " "), (l = !1), (c = !1), - (h = !1); + (h = !1)); if ( (i(s, "tag-close") && (_ || a.indexOf(v) !== -1)) || (i(s, "doctype") && d === ">") ) _ && f && f.value === "" && u.indexOf(v) === -1 && m--, - (x = T); + (x = T)); } } s = f; } - (p = p.trim()), e.doc.setValue(p); + ((p = p.trim()), e.doc.setValue(p)); }), (t.commands = [ { @@ -234,7 +234,7 @@ define("ace/ext/beautify", ["require", "exports", "module", "ace/token_iterator" }, bindKey: "Ctrl-Shift-B", }, - ]); + ])); }); (function () { window.require(["ace/ext/beautify"], function (m) { diff --git a/web/static/ace/ext-elastic_tabstops_lite.js b/web/static/ace/ext-elastic_tabstops_lite.js index d0859a823..da1c5dba7 100644 --- a/web/static/ace/ext-elastic_tabstops_lite.js +++ b/web/static/ace/ext-elastic_tabstops_lite.js @@ -11,8 +11,8 @@ define("ace/ext/elastic_tabstops_lite", [ var t = this, n = [], r = !1; - (this.onAfterExec = function () { - (r = !1), t.processRows(n), (n = []); + ((this.onAfterExec = function () { + ((r = !1), t.processRows(n), (n = [])); }), (this.onExec = function () { r = !0; @@ -21,10 +21,10 @@ define("ace/ext/elastic_tabstops_lite", [ r && (n.indexOf(e.start.row) == -1 && n.push(e.start.row), e.end.row != e.start.row && n.push(e.end.row)); - }); + })); }; - (function () { - (this.processRows = function (e) { + ((function () { + ((this.processRows = function (e) { this.$inChange = !0; var t = []; for (var n = 0, r = e.length; n < r; n++) { @@ -35,7 +35,7 @@ define("ace/ext/elastic_tabstops_lite", [ u = s.firstRow; for (var a = 0, f = o.length; a < f; a++) { var l = o[a]; - t.push(u), this.$adjustRow(u, l), u++; + (t.push(u), this.$adjustRow(u, l), u++); } } this.$inChange = !1; @@ -47,13 +47,13 @@ define("ace/ext/elastic_tabstops_lite", [ while (r >= 0) { n = this.$cellWidthsForRow(r); if (n.length == 0) break; - t.unshift(n), r--; + (t.unshift(n), r--); } var i = r + 1; r = e; var s = this.$editor.session.getLength(); while (r < s - 1) { - r++, (n = this.$cellWidthsForRow(r)); + (r++, (n = this.$cellWidthsForRow(r))); if (n.length == 0) break; t.push(n); } @@ -137,13 +137,13 @@ define("ace/ext/elastic_tabstops_lite", [ for (var o = 0, u = s.length; o < u; o++) { var a = s[o][0], f = s[o][1]; - (i += 1 + a), (f += r); + ((i += 1 + a), (f += r)); var l = i - f; if (l == 0) continue; var c = this.$editor.session.getLine(e).substr(0, f), h = c.replace(/\s*$/g, ""), p = c.length - h.length; - l > 0 && + (l > 0 && (this.$editor.session .getDocument() .insertInLine({ row: e, column: f + 1 }, Array(l + 1).join(" ") + " "), @@ -152,7 +152,7 @@ define("ace/ext/elastic_tabstops_lite", [ l < 0 && p >= -l && (this.$editor.session.getDocument().removeInLine(e, f + l, f), - (r += l)); + (r += l))); } }), (this.$izip_longest = function (e) { @@ -179,9 +179,9 @@ define("ace/ext/elastic_tabstops_lite", [ r.push(s); } return r; - }); + })); }).call(r.prototype), - (t.ElasticTabstopsLite = r); + (t.ElasticTabstopsLite = r)); var i = e("../editor").Editor; e("../config").defineOptions(i.prototype, "editor", { useElasticTabstops: { diff --git a/web/static/ace/ext-emmet.js b/web/static/ace/ext-emmet.js index 76bf10aaa..87a49b169 100644 --- a/web/static/ace/ext-emmet.js +++ b/web/static/ace/ext-emmet.js @@ -1,4 +1,4 @@ -define( +(define( "ace/snippets", [ "require", @@ -25,10 +25,10 @@ define( f = e("./tokenizer").Tokenizer, l = o.comparePoints, c = function () { - (this.snippetMap = {}), (this.snippetNameMap = {}); + ((this.snippetMap = {}), (this.snippetNameMap = {})); }; (function () { - r.implement(this, i), + (r.implement(this, i), (this.getTokenizer = function () { function e(e, t, n) { return ( @@ -88,7 +88,7 @@ define( regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (t, n, r) { var i = e(t.substr(1), n, r); - return r.unshift(i[0]), i; + return (r.unshift(i[0]), i); }, next: "snippetVar", }, @@ -120,7 +120,7 @@ define( { regex: "`" + t("`") + "*`", onMatch: function (e, t, n) { - return (n[0].code = e.splice(1, -1)), ""; + return ((n[0].code = e.splice(1, -1)), ""); }, next: "start", }, @@ -227,7 +227,7 @@ define( } return e.join(""); }); - return (this.variables.__ = null), u; + return ((this.variables.__ = null), u); }), (this.resolveVariables = function (e, t) { function o(t) { @@ -245,13 +245,13 @@ define( if (i.processed < r) continue; if (i.text) { var s = this.getVariableValue(t, i.text); - s && i.fmtString && (s = this.tmStrFormat(s, i)), + (s && i.fmtString && (s = this.tmStrFormat(s, i)), (i.processed = r), i.expectIf == null ? s && (n.push(s), o(i)) : s ? (i.skip = i.elseBranch) - : o(i); + : o(i)); } else i.tabstopId != null ? n.push(i) @@ -279,18 +279,18 @@ define( r = e.session.getLine(n.row), i = e.session.getTabString(), s = r.match(/^\s*/)[0]; - n.column < s.length && (s = s.slice(0, n.column)), (t = t.replace(/\r/g, "")); + (n.column < s.length && (s = s.slice(0, n.column)), (t = t.replace(/\r/g, ""))); var o = this.tokenizeTmSnippet(t); - (o = this.resolveVariables(o, e)), + ((o = this.resolveVariables(o, e)), (o = o.map(function (e) { return e == "\n" ? e + s : typeof e == "string" ? e.replace(/\t/g, i) : e; - })); + }))); var u = []; - o.forEach(function (e, t) { + (o.forEach(function (e, t) { if (typeof e != "object") return; var n = e.tabstopId, r = u[n]; @@ -311,7 +311,7 @@ define( }), u.forEach(function (e) { e.length = 0; - }); + })); var a = {}; for (var l = 0; l < o.length; l++) { var c = o[l]; @@ -324,11 +324,11 @@ define( } var v = u[p], m = typeof v.value == "string" ? [v.value] : f(v.value); - m.unshift(l + 1, Math.max(0, d - l)), + (m.unshift(l + 1, Math.max(0, d - l)), m.push(c), (a[p] = c), o.splice.apply(o, m), - v.indexOf(c) === -1 && v.push(c); + v.indexOf(c) === -1 && v.push(c)); } var g = 0, y = 0, @@ -336,10 +336,10 @@ define( o.forEach(function (e) { if (typeof e == "string") { var t = e.split("\n"); - t.length > 1 + (t.length > 1 ? ((y = t[t.length - 1].length), (g += t.length - 1)) : (y += e.length), - (b += e); + (b += e)); } else e.start ? (e.end = { row: g, column: y }) @@ -354,14 +354,14 @@ define( (this.insertSnippet = function (e, t) { var n = this; if (e.inVirtualSelectionMode) return n.insertSnippetForSelection(e, t); - e.forEachSelection( + (e.forEachSelection( function () { n.insertSnippetForSelection(e, t); }, null, { keepOrder: !0 }, ), - e.tabstopManager && e.tabstopManager.tabNext(); + e.tabstopManager && e.tabstopManager.tabNext()); }), (this.$getScope = function (e) { var t = e.session.$mode.$id || ""; @@ -370,13 +370,13 @@ define( t === "php" && !e.session.$mode.inlinePhp && (t = "html"); var n = e.getCursorPosition(), r = e.session.getState(n.row); - typeof r == "object" && (r = r[0]), + (typeof r == "object" && (r = r[0]), r.substring && (r.substring(0, 3) == "js-" ? (t = "javascript") : r.substring(0, 4) == "css-" ? (t = "css") - : r.substring(0, 4) == "php-" && (t = "php")); + : r.substring(0, 4) == "php-" && (t = "php"))); } return t; }), @@ -399,7 +399,7 @@ define( null, { keepOrder: !0 }, ); - return r && e.tabstopManager && e.tabstopManager.tabNext(), r; + return (r && e.tabstopManager && e.tabstopManager.tabNext(), r); }), (this.expandSnippetForSelection = function (e, t) { var n = e.getCursorPosition(), @@ -411,7 +411,7 @@ define( return ( this.getActiveScopes(e).some(function (e) { var t = o[e]; - return t && (u = this.findMatchingSnippet(t, i, s)), !!u; + return (t && (u = this.findMatchingSnippet(t, i, s)), !!u); }, this), u ? t && t.dryRun @@ -449,7 +449,8 @@ define( (this.register = function (e, t) { function o(e) { return ( - e && !/^\^?\(.*\)\$?$|^\\b$/.test(e) && (e = "(?:" + e + ")"), e || "" + e && !/^\^?\(.*\)\$?$|^\\b$/.test(e) && (e = "(?:" + e + ")"), + e || "" ); } function u(e, t, n) { @@ -463,31 +464,31 @@ define( ); } function a(e) { - e.scope || (e.scope = t || "_"), + (e.scope || (e.scope = t || "_"), (t = e.scope), - n[t] || ((n[t] = []), (r[t] = {})); + n[t] || ((n[t] = []), (r[t] = {}))); var o = r[t]; if (e.name) { var a = o[e.name]; - a && i.unregister(a), (o[e.name] = e); + (a && i.unregister(a), (o[e.name] = e)); } - n[t].push(e), + (n[t].push(e), e.tabTrigger && !e.trigger && (!e.guard && /^\w/.test(e.tabTrigger) && (e.guard = "\\b"), - (e.trigger = s.escapeRegExp(e.tabTrigger))); + (e.trigger = s.escapeRegExp(e.tabTrigger)))); if (!e.trigger && !e.guard && !e.endTrigger && !e.endGuard) return; - (e.startRe = u(e.trigger, e.guard, !0)), + ((e.startRe = u(e.trigger, e.guard, !0)), (e.triggerRe = new RegExp(e.trigger)), (e.endRe = u(e.endTrigger, e.endGuard, !0)), - (e.endTriggerRe = new RegExp(e.endTrigger)); + (e.endTriggerRe = new RegExp(e.endTrigger))); } var n = this.snippetMap, r = this.snippetNameMap, i = this; - e || (e = []), + (e || (e = []), e && e.content ? a(e) : Array.isArray(e) && e.forEach(a), - this._signal("registerSnippets", { scope: t }); + this._signal("registerSnippets", { scope: t })); }), (this.unregister = function (e, t) { function i(e) { @@ -512,18 +513,18 @@ define( while ((i = r.exec(e))) { if (i[1]) try { - (n = JSON.parse(i[1])), t.push(n); + ((n = JSON.parse(i[1])), t.push(n)); } catch (s) {} - if (i[4]) (n.content = i[4].replace(/^\t/gm, "")), t.push(n), (n = {}); + if (i[4]) ((n.content = i[4].replace(/^\t/gm, "")), t.push(n), (n = {})); else { var o = i[2], u = i[3]; if (o == "regex") { var a = /\/((?:[^\/\\]|\\.)*)|$/g; - (n.guard = a.exec(u)[1]), + ((n.guard = a.exec(u)[1]), (n.trigger = a.exec(u)[1]), (n.endTrigger = a.exec(u)[1]), - (n.endGuard = a.exec(u)[1]); + (n.endGuard = a.exec(u)[1])); } else o == "snippet" ? ((n.tabTrigger = u.match(/^\S*/)[0]), n.name || (n.name = u)) @@ -538,26 +539,26 @@ define( return ( this.getActiveScopes(t).some(function (t) { var i = n[t]; - return i && (r = i[e]), !!r; + return (i && (r = i[e]), !!r); }, this), r ); - }); + })); }).call(c.prototype); var h = function (e) { if (e.tabstopManager) return e.tabstopManager; - (e.tabstopManager = this), + ((e.tabstopManager = this), (this.$onChange = this.onChange.bind(this)), (this.$onChangeSelection = s.delayedCall( this.onChangeSelection.bind(this), ).schedule), (this.$onChangeSession = this.onChangeSession.bind(this)), (this.$onAfterExec = this.onAfterExec.bind(this)), - this.attach(e); + this.attach(e)); }; (function () { - (this.attach = function (e) { - (this.index = 0), + ((this.attach = function (e) { + ((this.index = 0), (this.ranges = []), (this.tabstops = []), (this.$openTabstops = null), @@ -567,10 +568,10 @@ define( this.editor.on("changeSelection", this.$onChangeSelection), this.editor.on("changeSession", this.$onChangeSession), this.editor.commands.on("afterExec", this.$onAfterExec), - this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)); }), (this.detach = function () { - this.tabstops.forEach(this.removeTabstopMarkers, this), + (this.tabstops.forEach(this.removeTabstopMarkers, this), (this.ranges = null), (this.tabstops = null), (this.selectedTabstop = null), @@ -580,7 +581,7 @@ define( this.editor.commands.removeListener("afterExec", this.$onAfterExec), this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler), (this.editor.tabstopManager = null), - (this.editor = null); + (this.editor = null)); }), (this.onChange = function (e) { var t = e, @@ -606,14 +607,14 @@ define( var d = h[p]; if (d.end.row < r.row) continue; if (n && l(r, d.start) < 0 && l(i, d.end) > 0) { - this.removeRange(d), p--; + (this.removeRange(d), p--); continue; } - d.start.row == s && d.start.column > r.column && (d.start.column += a), + (d.start.row == s && d.start.column > r.column && (d.start.column += a), d.end.row == s && d.end.column >= r.column && (d.end.column += a), d.start.row >= s && (d.start.row += u), d.end.row >= s && (d.end.row += u), - l(d.start, d.end) > 0 && this.removeRange(d); + l(d.start, d.end) > 0 && this.removeRange(d)); } h.length || this.detach(); }), @@ -653,17 +654,17 @@ define( (this.tabNext = function (e) { var t = this.tabstops.length, n = this.index + (e || 1); - (n = Math.min(Math.max(n, 1), t)), + ((n = Math.min(Math.max(n, 1), t)), n == t && (n = 0), this.selectTabstop(n), - n === 0 && this.detach(); + n === 0 && this.detach()); }), (this.selectTabstop = function (e) { this.$openTabstops = null; var t = this.tabstops[this.index]; - t && this.addTabstopMarkers(t), + (t && this.addTabstopMarkers(t), (this.index = e), - (t = this.tabstops[this.index]); + (t = this.tabstops[this.index])); if (!t || !t.length) return; this.selectedTabstop = t; if (!this.editor.inVirtualSelectionMode) { @@ -681,17 +682,17 @@ define( this.$openTabstops || (this.$openTabstops = []); if (!e[0]) { var r = o.fromPoints(n, n); - v(r.start, t), v(r.end, t), (e[0] = [r]), (e[0].index = 0); + (v(r.start, t), v(r.end, t), (e[0] = [r]), (e[0].index = 0)); } var i = this.index, s = [i + 1, 0], u = this.ranges; - e.forEach(function (e, n) { + (e.forEach(function (e, n) { var r = this.$openTabstops[n] || e; for (var i = e.length; i--; ) { var a = e[i], f = o.fromPoints(a.start, a.end || a.start); - d(f.start, t), + (d(f.start, t), d(f.end, t), (f.original = a), (f.tabstop = r), @@ -699,15 +700,15 @@ define( r != e ? r.unshift(f) : (r[i] = f), a.fmtString ? ((f.linked = !0), (r.hasLinkedRanges = !0)) - : r.firstNonLinked || (r.firstNonLinked = f); + : r.firstNonLinked || (r.firstNonLinked = f)); } - r.firstNonLinked || (r.hasLinkedRanges = !1), + (r.firstNonLinked || (r.hasLinkedRanges = !1), r === e && (s.push(r), (this.$openTabstops[n] = r)), - this.addTabstopMarkers(r); + this.addTabstopMarkers(r)); }, this), s.length > 2 && (this.tabstops.length && s.push(s.splice(2, 1)[0]), - this.tabstops.splice.apply(this.tabstops, s)); + this.tabstops.splice.apply(this.tabstops, s))); }), (this.addTabstopMarkers = function (e) { var t = this.editor.session; @@ -718,19 +719,19 @@ define( (this.removeTabstopMarkers = function (e) { var t = this.editor.session; e.forEach(function (e) { - t.removeMarker(e.markerId), (e.markerId = null); + (t.removeMarker(e.markerId), (e.markerId = null)); }); }), (this.removeRange = function (e) { var t = e.tabstop.indexOf(e); - e.tabstop.splice(t, 1), + (e.tabstop.splice(t, 1), (t = this.ranges.indexOf(e)), this.ranges.splice(t, 1), this.editor.session.removeMarker(e.markerId), e.tabstop.length || ((t = this.tabstops.indexOf(e.tabstop)), t != -1 && this.tabstops.splice(t, 1), - this.tabstops.length || this.detach()); + this.tabstops.length || this.detach())); }), (this.keyboardHandler = new a()), this.keyboardHandler.bindKeys({ @@ -747,34 +748,34 @@ define( Return: function (e) { return !1; }, - }); + })); }).call(h.prototype); var p = {}; - (p.onChange = u.prototype.onChange), + ((p.onChange = u.prototype.onChange), (p.setPosition = function (e, t) { - (this.pos.row = e), (this.pos.column = t); + ((this.pos.row = e), (this.pos.column = t)); }), (p.update = function (e, t, n) { - (this.$insertRight = n), (this.pos = e), this.onChange(t); - }); + ((this.$insertRight = n), (this.pos = e), this.onChange(t)); + })); var d = function (e, t) { - e.row == 0 && (e.column += t.column), (e.row += t.row); + (e.row == 0 && (e.column += t.column), (e.row += t.row)); }, v = function (e, t) { - e.row == t.row && (e.column -= t.column), (e.row -= t.row); + (e.row == t.row && (e.column -= t.column), (e.row -= t.row)); }; - e("./lib/dom").importCssString( + (e("./lib/dom").importCssString( ".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}", ), - (t.snippetManager = new c()); + (t.snippetManager = new c())); var m = e("./editor").Editor; (function () { - (this.insertSnippet = function (e, n) { + ((this.insertSnippet = function (e, n) { return t.snippetManager.insertSnippet(this, e, n); }), (this.expandSnippet = function (e) { return t.snippetManager.expandWithTab(this, e); - }); + })); }).call(m.prototype); }, ), @@ -808,13 +809,13 @@ define( a; f.prototype = { setupContext: function (e) { - (this.ace = e), + ((this.ace = e), (this.indentation = e.session.getTabString()), - u || (u = window.emmet); + u || (u = window.emmet)); var t = u.resources || u.require("resources"); - t.setVariable("indentation", this.indentation), + (t.setVariable("indentation", this.indentation), (this.$syntax = null), - (this.$syntax = this.getSyntax()); + (this.$syntax = this.getSyntax())); }, getSelectionRange: function () { var e = this.ace.getSelectionRange(), @@ -848,15 +849,15 @@ define( return this.ace.session.getLine(e); }, replaceContent: function (e, t, n, r) { - n == null && (n = t == null ? this.getContent().length : t), - t == null && (t = 0); + (n == null && (n = t == null ? this.getContent().length : t), + t == null && (t = 0)); var i = this.ace, u = i.session.doc, a = o.fromPoints(u.indexToPosition(t), u.indexToPosition(n)); - i.session.remove(a), + (i.session.remove(a), (a.end = a.start), (e = this.$updateTabstops(e)), - s.insertSnippet(i, e); + s.insertSnippet(i, e)); }, getContent: function () { return this.ace.getValue(); @@ -867,10 +868,10 @@ define( if (e == "html" || e == "php") { var t = this.ace.getCursorPosition(), n = this.ace.session.getState(t.row); - typeof n != "string" && (n = n[0]), + (typeof n != "string" && (n = n[0]), n && ((n = n.split("-")), - n.length > 1 ? (e = n[0]) : e == "php" && (e = "html")); + n.length > 1 ? (e = n[0]) : e == "php" && (e = "html"))); } return e; }, @@ -924,7 +925,7 @@ define( var u = e.placeholder; u && (u = i.processText(u, a)); var f = "${" + s + (u ? ":" + u : "") + "}"; - return o && (r = [e.start, f]), f; + return (o && (r = [e.start, f]), f); }, escape: function (e) { return e == "$" ? "\\$" : e == "\\" ? "\\\\" : e; @@ -964,7 +965,7 @@ define( wrap_with_abbreviation: { mac: "shift+ctrl+a", win: "shift+ctrl+a" }, }, c = new f(); - (t.commands = new r()), + ((t.commands = new r()), (t.runEmmetCommand = function d(e) { try { c.setupContext(e); @@ -981,13 +982,13 @@ define( }, 0); var s = n.run(this.action, c); } catch (o) { - if (!u) return t.load(d.bind(this, e)), !0; - e._signal("changeStatus", typeof o == "string" ? o : o.message), + if (!u) return (t.load(d.bind(this, e)), !0); + (e._signal("changeStatus", typeof o == "string" ? o : o.message), console.log(o), - (s = !1); + (s = !1)); } return s; - }); + })); for (var h in l) t.commands.addCommand({ name: "emmet:" + h, @@ -996,7 +997,7 @@ define( exec: t.runEmmetCommand, multiSelectAction: "forEach", }); - (t.updateCommands = function (e, n) { + ((t.updateCommands = function (e, n) { n ? e.keyBinding.addKeyboardHandler(t.commands) : e.keyBinding.removeKeyboardHandler(t.commands); @@ -1013,37 +1014,37 @@ define( i = t.isSupportedMode(r); if (i && r.$modes) try { - c.setupContext(e), /js|php/.test(c.getSyntax()) && (i = !1); + (c.setupContext(e), /js|php/.test(c.getSyntax()) && (i = !1)); } catch (s) {} return i; - }); + })); var p = function (e, n) { var r = n; if (!r) return; var i = t.isSupportedMode(r.session.$mode); - e.enableEmmet === !1 && (i = !1), i && t.load(), t.updateCommands(r, i); + (e.enableEmmet === !1 && (i = !1), i && t.load(), t.updateCommands(r, i)); }; - (t.load = function (t) { + ((t.load = function (t) { typeof a == "string" && e("ace/config").loadModule(a, function () { - (a = null), t && t(); + ((a = null), t && t()); }); }), (t.AceEmmetEditor = f), e("ace/config").defineOptions(i.prototype, "editor", { enableEmmet: { set: function (e) { - this[e ? "on" : "removeListener"]("changeMode", p), - p({ enableEmmet: !!e }, this); + (this[e ? "on" : "removeListener"]("changeMode", p), + p({ enableEmmet: !!e }, this)); }, value: !0, }, }), (t.setCore = function (e) { typeof e == "string" ? (a = e) : (u = e); - }); + })); }, - ); + )); (function () { window.require(["ace/ext/emmet"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/ext-keybinding_menu.js b/web/static/ace/ext-keybinding_menu.js index e23c45638..e60e5d524 100644 --- a/web/static/ace/ext-keybinding_menu.js +++ b/web/static/ace/ext-keybinding_menu.js @@ -1,4 +1,4 @@ -define( +(define( "ace/ext/menu_tools/overlay_page", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { @@ -6,34 +6,34 @@ define( var r = e("../../lib/dom"), i = "#ace_settingsmenu, #kbshortcutmenu {background-color: #F7F7F7;color: black;box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);padding: 1em 0.5em 2em 1em;overflow: auto;position: absolute;margin: 0;bottom: 0;right: 0;top: 0;z-index: 9991;cursor: default;}.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);background-color: rgba(255, 255, 255, 0.6);color: black;}.ace_optionsMenuEntry:hover {background-color: rgba(100, 100, 100, 0.1);transition: all 0.3s}.ace_closeButton {background: rgba(245, 146, 146, 0.5);border: 1px solid #F48A8A;border-radius: 50%;padding: 7px;position: absolute;right: -8px;top: -8px;z-index: 100000;}.ace_closeButton{background: rgba(245, 146, 146, 0.9);}.ace_optionsMenuKey {color: darkslateblue;font-weight: bold;}.ace_optionsMenuCommand {color: darkcyan;font-weight: normal;}.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {vertical-align: middle;}.ace_optionsMenuEntry button[ace_selected_button=true] {background: #e7e7e7;box-shadow: 1px 0px 2px 0px #adadad inset;border-color: #adadad;}.ace_optionsMenuEntry button {background: white;border: 1px solid lightgray;margin: 0px;}.ace_optionsMenuEntry button:hover{background: #f0f0f0;}"; - r.importCssString(i), + (r.importCssString(i), (n.exports.overlayPage = function (t, n, i, s, o, u) { function l(e) { e.keyCode === 27 && a.click(); } - (i = i ? "top: " + i + ";" : ""), + ((i = i ? "top: " + i + ";" : ""), (o = o ? "bottom: " + o + ";" : ""), (s = s ? "right: " + s + ";" : ""), - (u = u ? "left: " + u + ";" : ""); + (u = u ? "left: " + u + ";" : "")); var a = document.createElement("div"), f = document.createElement("div"); - (a.style.cssText = + ((a.style.cssText = "margin: 0; padding: 0; position: fixed; top:0; bottom:0; left:0; right:0;z-index: 9990; background-color: rgba(0, 0, 0, 0.3);"), a.addEventListener("click", function () { - document.removeEventListener("keydown", l), + (document.removeEventListener("keydown", l), a.parentNode.removeChild(a), t.focus(), - (a = null); + (a = null)); }), document.addEventListener("keydown", l), (f.style.cssText = i + s + o + u), f.addEventListener("click", function (e) { e.stopPropagation(); - }); + })); var c = r.createElement("div"); c.style.position = "relative"; var h = r.createElement("div"); - (h.className = "ace_closeButton"), + ((h.className = "ace_closeButton"), h.addEventListener("click", function () { a.click(); }), @@ -42,8 +42,8 @@ define( f.appendChild(n), a.appendChild(f), document.body.appendChild(a), - t.blur(); - }); + t.blur()); + })); }, ), define( @@ -64,13 +64,13 @@ define( return e.toUpperCase(); }), o = t[r]; - Array.isArray(o) || (o = [o]), + (Array.isArray(o) || (o = [o]), o.forEach(function (e) { - typeof e != "string" && (e = e.name), + (typeof e != "string" && (e = e.name), i[e] ? (i[e].key += "|" + s) - : ((i[e] = { key: s, command: e }), n.push(i[e])); - }); + : ((i[e] = { key: s, command: e }), n.push(i[e]))); + })); } }), n @@ -109,14 +109,14 @@ define( "
    " ); }, ""); - (s.id = "kbshortcutmenu"), + ((s.id = "kbshortcutmenu"), (s.innerHTML = "

    Keyboard Shortcuts

    " + o + "
    "), - n(t, s, "0", "0", "0", null); + n(t, s, "0", "0", "0", null)); } } var r = e("ace/editor").Editor; n.exports.init = function (e) { - (r.prototype.showKeyboardShortcuts = function () { + ((r.prototype.showKeyboardShortcuts = function () { i(this); }), e.commands.addCommands([ @@ -127,10 +127,10 @@ define( e.showKeyboardShortcuts(); }, }, - ]); + ])); }; }, - ); + )); (function () { window.require(["ace/ext/keybinding_menu"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/ext-language_tools.js b/web/static/ace/ext-language_tools.js index 73db3d7c6..0ccc1e481 100644 --- a/web/static/ace/ext-language_tools.js +++ b/web/static/ace/ext-language_tools.js @@ -1,4 +1,4 @@ -define( +(define( "ace/snippets", [ "require", @@ -25,10 +25,10 @@ define( f = e("./tokenizer").Tokenizer, l = o.comparePoints, c = function () { - (this.snippetMap = {}), (this.snippetNameMap = {}); + ((this.snippetMap = {}), (this.snippetNameMap = {})); }; (function () { - r.implement(this, i), + (r.implement(this, i), (this.getTokenizer = function () { function e(e, t, n) { return ( @@ -88,7 +88,7 @@ define( regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (t, n, r) { var i = e(t.substr(1), n, r); - return r.unshift(i[0]), i; + return (r.unshift(i[0]), i); }, next: "snippetVar", }, @@ -120,7 +120,7 @@ define( { regex: "`" + t("`") + "*`", onMatch: function (e, t, n) { - return (n[0].code = e.splice(1, -1)), ""; + return ((n[0].code = e.splice(1, -1)), ""); }, next: "start", }, @@ -227,7 +227,7 @@ define( } return e.join(""); }); - return (this.variables.__ = null), u; + return ((this.variables.__ = null), u); }), (this.resolveVariables = function (e, t) { function o(t) { @@ -245,13 +245,13 @@ define( if (i.processed < r) continue; if (i.text) { var s = this.getVariableValue(t, i.text); - s && i.fmtString && (s = this.tmStrFormat(s, i)), + (s && i.fmtString && (s = this.tmStrFormat(s, i)), (i.processed = r), i.expectIf == null ? s && (n.push(s), o(i)) : s ? (i.skip = i.elseBranch) - : o(i); + : o(i)); } else i.tabstopId != null ? n.push(i) @@ -279,18 +279,18 @@ define( r = e.session.getLine(n.row), i = e.session.getTabString(), s = r.match(/^\s*/)[0]; - n.column < s.length && (s = s.slice(0, n.column)), (t = t.replace(/\r/g, "")); + (n.column < s.length && (s = s.slice(0, n.column)), (t = t.replace(/\r/g, ""))); var o = this.tokenizeTmSnippet(t); - (o = this.resolveVariables(o, e)), + ((o = this.resolveVariables(o, e)), (o = o.map(function (e) { return e == "\n" ? e + s : typeof e == "string" ? e.replace(/\t/g, i) : e; - })); + }))); var u = []; - o.forEach(function (e, t) { + (o.forEach(function (e, t) { if (typeof e != "object") return; var n = e.tabstopId, r = u[n]; @@ -311,7 +311,7 @@ define( }), u.forEach(function (e) { e.length = 0; - }); + })); var a = {}; for (var l = 0; l < o.length; l++) { var c = o[l]; @@ -324,11 +324,11 @@ define( } var v = u[p], m = typeof v.value == "string" ? [v.value] : f(v.value); - m.unshift(l + 1, Math.max(0, d - l)), + (m.unshift(l + 1, Math.max(0, d - l)), m.push(c), (a[p] = c), o.splice.apply(o, m), - v.indexOf(c) === -1 && v.push(c); + v.indexOf(c) === -1 && v.push(c)); } var g = 0, y = 0, @@ -336,10 +336,10 @@ define( o.forEach(function (e) { if (typeof e == "string") { var t = e.split("\n"); - t.length > 1 + (t.length > 1 ? ((y = t[t.length - 1].length), (g += t.length - 1)) : (y += e.length), - (b += e); + (b += e)); } else e.start ? (e.end = { row: g, column: y }) @@ -354,14 +354,14 @@ define( (this.insertSnippet = function (e, t) { var n = this; if (e.inVirtualSelectionMode) return n.insertSnippetForSelection(e, t); - e.forEachSelection( + (e.forEachSelection( function () { n.insertSnippetForSelection(e, t); }, null, { keepOrder: !0 }, ), - e.tabstopManager && e.tabstopManager.tabNext(); + e.tabstopManager && e.tabstopManager.tabNext()); }), (this.$getScope = function (e) { var t = e.session.$mode.$id || ""; @@ -370,13 +370,13 @@ define( t === "php" && !e.session.$mode.inlinePhp && (t = "html"); var n = e.getCursorPosition(), r = e.session.getState(n.row); - typeof r == "object" && (r = r[0]), + (typeof r == "object" && (r = r[0]), r.substring && (r.substring(0, 3) == "js-" ? (t = "javascript") : r.substring(0, 4) == "css-" ? (t = "css") - : r.substring(0, 4) == "php-" && (t = "php")); + : r.substring(0, 4) == "php-" && (t = "php"))); } return t; }), @@ -399,7 +399,7 @@ define( null, { keepOrder: !0 }, ); - return r && e.tabstopManager && e.tabstopManager.tabNext(), r; + return (r && e.tabstopManager && e.tabstopManager.tabNext(), r); }), (this.expandSnippetForSelection = function (e, t) { var n = e.getCursorPosition(), @@ -411,7 +411,7 @@ define( return ( this.getActiveScopes(e).some(function (e) { var t = o[e]; - return t && (u = this.findMatchingSnippet(t, i, s)), !!u; + return (t && (u = this.findMatchingSnippet(t, i, s)), !!u); }, this), u ? t && t.dryRun @@ -449,7 +449,8 @@ define( (this.register = function (e, t) { function o(e) { return ( - e && !/^\^?\(.*\)\$?$|^\\b$/.test(e) && (e = "(?:" + e + ")"), e || "" + e && !/^\^?\(.*\)\$?$|^\\b$/.test(e) && (e = "(?:" + e + ")"), + e || "" ); } function u(e, t, n) { @@ -463,31 +464,31 @@ define( ); } function a(e) { - e.scope || (e.scope = t || "_"), + (e.scope || (e.scope = t || "_"), (t = e.scope), - n[t] || ((n[t] = []), (r[t] = {})); + n[t] || ((n[t] = []), (r[t] = {}))); var o = r[t]; if (e.name) { var a = o[e.name]; - a && i.unregister(a), (o[e.name] = e); + (a && i.unregister(a), (o[e.name] = e)); } - n[t].push(e), + (n[t].push(e), e.tabTrigger && !e.trigger && (!e.guard && /^\w/.test(e.tabTrigger) && (e.guard = "\\b"), - (e.trigger = s.escapeRegExp(e.tabTrigger))); + (e.trigger = s.escapeRegExp(e.tabTrigger)))); if (!e.trigger && !e.guard && !e.endTrigger && !e.endGuard) return; - (e.startRe = u(e.trigger, e.guard, !0)), + ((e.startRe = u(e.trigger, e.guard, !0)), (e.triggerRe = new RegExp(e.trigger)), (e.endRe = u(e.endTrigger, e.endGuard, !0)), - (e.endTriggerRe = new RegExp(e.endTrigger)); + (e.endTriggerRe = new RegExp(e.endTrigger))); } var n = this.snippetMap, r = this.snippetNameMap, i = this; - e || (e = []), + (e || (e = []), e && e.content ? a(e) : Array.isArray(e) && e.forEach(a), - this._signal("registerSnippets", { scope: t }); + this._signal("registerSnippets", { scope: t })); }), (this.unregister = function (e, t) { function i(e) { @@ -512,18 +513,18 @@ define( while ((i = r.exec(e))) { if (i[1]) try { - (n = JSON.parse(i[1])), t.push(n); + ((n = JSON.parse(i[1])), t.push(n)); } catch (s) {} - if (i[4]) (n.content = i[4].replace(/^\t/gm, "")), t.push(n), (n = {}); + if (i[4]) ((n.content = i[4].replace(/^\t/gm, "")), t.push(n), (n = {})); else { var o = i[2], u = i[3]; if (o == "regex") { var a = /\/((?:[^\/\\]|\\.)*)|$/g; - (n.guard = a.exec(u)[1]), + ((n.guard = a.exec(u)[1]), (n.trigger = a.exec(u)[1]), (n.endTrigger = a.exec(u)[1]), - (n.endGuard = a.exec(u)[1]); + (n.endGuard = a.exec(u)[1])); } else o == "snippet" ? ((n.tabTrigger = u.match(/^\S*/)[0]), n.name || (n.name = u)) @@ -538,26 +539,26 @@ define( return ( this.getActiveScopes(t).some(function (t) { var i = n[t]; - return i && (r = i[e]), !!r; + return (i && (r = i[e]), !!r); }, this), r ); - }); + })); }).call(c.prototype); var h = function (e) { if (e.tabstopManager) return e.tabstopManager; - (e.tabstopManager = this), + ((e.tabstopManager = this), (this.$onChange = this.onChange.bind(this)), (this.$onChangeSelection = s.delayedCall( this.onChangeSelection.bind(this), ).schedule), (this.$onChangeSession = this.onChangeSession.bind(this)), (this.$onAfterExec = this.onAfterExec.bind(this)), - this.attach(e); + this.attach(e)); }; (function () { - (this.attach = function (e) { - (this.index = 0), + ((this.attach = function (e) { + ((this.index = 0), (this.ranges = []), (this.tabstops = []), (this.$openTabstops = null), @@ -567,10 +568,10 @@ define( this.editor.on("changeSelection", this.$onChangeSelection), this.editor.on("changeSession", this.$onChangeSession), this.editor.commands.on("afterExec", this.$onAfterExec), - this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)); }), (this.detach = function () { - this.tabstops.forEach(this.removeTabstopMarkers, this), + (this.tabstops.forEach(this.removeTabstopMarkers, this), (this.ranges = null), (this.tabstops = null), (this.selectedTabstop = null), @@ -580,7 +581,7 @@ define( this.editor.commands.removeListener("afterExec", this.$onAfterExec), this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler), (this.editor.tabstopManager = null), - (this.editor = null); + (this.editor = null)); }), (this.onChange = function (e) { var t = e, @@ -606,14 +607,14 @@ define( var d = h[p]; if (d.end.row < r.row) continue; if (n && l(r, d.start) < 0 && l(i, d.end) > 0) { - this.removeRange(d), p--; + (this.removeRange(d), p--); continue; } - d.start.row == s && d.start.column > r.column && (d.start.column += a), + (d.start.row == s && d.start.column > r.column && (d.start.column += a), d.end.row == s && d.end.column >= r.column && (d.end.column += a), d.start.row >= s && (d.start.row += u), d.end.row >= s && (d.end.row += u), - l(d.start, d.end) > 0 && this.removeRange(d); + l(d.start, d.end) > 0 && this.removeRange(d)); } h.length || this.detach(); }), @@ -653,17 +654,17 @@ define( (this.tabNext = function (e) { var t = this.tabstops.length, n = this.index + (e || 1); - (n = Math.min(Math.max(n, 1), t)), + ((n = Math.min(Math.max(n, 1), t)), n == t && (n = 0), this.selectTabstop(n), - n === 0 && this.detach(); + n === 0 && this.detach()); }), (this.selectTabstop = function (e) { this.$openTabstops = null; var t = this.tabstops[this.index]; - t && this.addTabstopMarkers(t), + (t && this.addTabstopMarkers(t), (this.index = e), - (t = this.tabstops[this.index]); + (t = this.tabstops[this.index])); if (!t || !t.length) return; this.selectedTabstop = t; if (!this.editor.inVirtualSelectionMode) { @@ -681,17 +682,17 @@ define( this.$openTabstops || (this.$openTabstops = []); if (!e[0]) { var r = o.fromPoints(n, n); - v(r.start, t), v(r.end, t), (e[0] = [r]), (e[0].index = 0); + (v(r.start, t), v(r.end, t), (e[0] = [r]), (e[0].index = 0)); } var i = this.index, s = [i + 1, 0], u = this.ranges; - e.forEach(function (e, n) { + (e.forEach(function (e, n) { var r = this.$openTabstops[n] || e; for (var i = e.length; i--; ) { var a = e[i], f = o.fromPoints(a.start, a.end || a.start); - d(f.start, t), + (d(f.start, t), d(f.end, t), (f.original = a), (f.tabstop = r), @@ -699,15 +700,15 @@ define( r != e ? r.unshift(f) : (r[i] = f), a.fmtString ? ((f.linked = !0), (r.hasLinkedRanges = !0)) - : r.firstNonLinked || (r.firstNonLinked = f); + : r.firstNonLinked || (r.firstNonLinked = f)); } - r.firstNonLinked || (r.hasLinkedRanges = !1), + (r.firstNonLinked || (r.hasLinkedRanges = !1), r === e && (s.push(r), (this.$openTabstops[n] = r)), - this.addTabstopMarkers(r); + this.addTabstopMarkers(r)); }, this), s.length > 2 && (this.tabstops.length && s.push(s.splice(2, 1)[0]), - this.tabstops.splice.apply(this.tabstops, s)); + this.tabstops.splice.apply(this.tabstops, s))); }), (this.addTabstopMarkers = function (e) { var t = this.editor.session; @@ -718,19 +719,19 @@ define( (this.removeTabstopMarkers = function (e) { var t = this.editor.session; e.forEach(function (e) { - t.removeMarker(e.markerId), (e.markerId = null); + (t.removeMarker(e.markerId), (e.markerId = null)); }); }), (this.removeRange = function (e) { var t = e.tabstop.indexOf(e); - e.tabstop.splice(t, 1), + (e.tabstop.splice(t, 1), (t = this.ranges.indexOf(e)), this.ranges.splice(t, 1), this.editor.session.removeMarker(e.markerId), e.tabstop.length || ((t = this.tabstops.indexOf(e.tabstop)), t != -1 && this.tabstops.splice(t, 1), - this.tabstops.length || this.detach()); + this.tabstops.length || this.detach())); }), (this.keyboardHandler = new a()), this.keyboardHandler.bindKeys({ @@ -747,34 +748,34 @@ define( Return: function (e) { return !1; }, - }); + })); }).call(h.prototype); var p = {}; - (p.onChange = u.prototype.onChange), + ((p.onChange = u.prototype.onChange), (p.setPosition = function (e, t) { - (this.pos.row = e), (this.pos.column = t); + ((this.pos.row = e), (this.pos.column = t)); }), (p.update = function (e, t, n) { - (this.$insertRight = n), (this.pos = e), this.onChange(t); - }); + ((this.$insertRight = n), (this.pos = e), this.onChange(t)); + })); var d = function (e, t) { - e.row == 0 && (e.column += t.column), (e.row += t.row); + (e.row == 0 && (e.column += t.column), (e.row += t.row)); }, v = function (e, t) { - e.row == t.row && (e.column -= t.column), (e.row -= t.row); + (e.row == t.row && (e.column -= t.column), (e.row -= t.row)); }; - e("./lib/dom").importCssString( + (e("./lib/dom").importCssString( ".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}", ), - (t.snippetManager = new c()); + (t.snippetManager = new c())); var m = e("./editor").Editor; (function () { - (this.insertSnippet = function (e, n) { + ((this.insertSnippet = function (e, n) { return t.snippetManager.insertSnippet(this, e, n); }), (this.expandSnippet = function (e) { return t.snippetManager.expandWithTab(this, e); - }); + })); }).call(m.prototype); }, ), @@ -816,14 +817,14 @@ define( l = function (e) { var t = a.createElement("div"), n = new f(t); - e && e.appendChild(t), + (e && e.appendChild(t), (t.style.display = "none"), (n.renderer.content.style.cursor = "default"), n.renderer.setStyle("ace_autocomplete"), n.setOption("displayIndentGuides", !1), - n.setOption("dragDelay", 150); + n.setOption("dragDelay", 150)); var r = function () {}; - (n.focus = r), + ((n.focus = r), (n.$isFocused = !0), (n.renderer.$cursorLayer.restartTimer = r), (n.renderer.$cursorLayer.element.style.opacity = 0), @@ -834,14 +835,14 @@ define( (n.session.$searchHighlight.clazz = "ace_highlight-marker"), n.on("mousedown", function (e) { var t = e.getDocumentPosition(); - n.selection.moveToPosition(t), + (n.selection.moveToPosition(t), (c.start.row = c.end.row = t.row), - e.stop(); - }); + e.stop()); + })); var i, l = new s(-1, 0, -1, Infinity), c = new s(-1, 0, -1, Infinity); - (c.id = n.session.addMarker(c, "ace_active-line", "fullLine")), + ((c.id = n.session.addMarker(c, "ace_active-line", "fullLine")), (n.setSelectOnHover = function (e) { e ? l.id && (n.session.removeMarker(l.id), (l.id = null)) @@ -854,7 +855,7 @@ define( return; } if (i.x == e.x && i.y == e.y) return; - (i = e), (i.scrollTop = n.renderer.scrollTop); + ((i = e), (i.scrollTop = n.renderer.scrollTop)); var t = i.getDocumentPosition().row; l.start.row != t && (l.id || n.setRow(t), p(t)); }), @@ -862,7 +863,7 @@ define( if (i && l.start.row != -1) { i.$pos = null; var e = i.getDocumentPosition().row; - l.id || n.setRow(e), p(e, !0); + (l.id || n.setRow(e), p(e, !0)); } }), n.renderer.on("afterRender", function () { @@ -870,10 +871,10 @@ define( t = n.renderer.$textLayer, r = t.element.childNodes[e - t.config.firstRow]; if (r == t.selectedNode) return; - t.selectedNode && a.removeCssClass(t.selectedNode, "ace_selected"), + (t.selectedNode && a.removeCssClass(t.selectedNode, "ace_selected"), (t.selectedNode = r), - r && a.addCssClass(r, "ace_selected"); - }); + r && a.addCssClass(r, "ace_selected")); + })); var h = function () { p(-1); }, @@ -883,7 +884,7 @@ define( t || n.session._emit("changeBackMarker"), n._emit("changeHoverMarker")); }; - (n.getHoveredRow = function () { + ((n.getHoveredRow = function () { return l.start.row; }), o.addListener(n.container, "mouseout", h), @@ -895,7 +896,7 @@ define( (n.session.doc.getLine = function (e) { var t = n.data[e]; return typeof t == "string" ? t : (t && t.value) || ""; - }); + })); var d = n.session.bgTokenizer; return ( (d.$tokenizeRow = function (e) { @@ -917,9 +918,9 @@ define( f = l; var h = o.indexOf(c); if (h == -1) continue; - s(i.slice(a, h), ""), + (s(i.slice(a, h), ""), (a = h + c.length), - s(i.slice(h, a), "completion-highlight"); + s(i.slice(h, a), "completion-highlight")); } return ( s(i.slice(a, i.length), ""), @@ -938,10 +939,10 @@ define( (n.filterText = ""), (n.data = []), (n.setData = function (e, t) { - (n.filterText = t || ""), + ((n.filterText = t || ""), n.setValue(u.stringRepeat("\n", e.length), -1), (n.data = e || []), - n.setRow(0); + n.setRow(0)); }), (n.getData = function (e) { return n.data[e]; @@ -950,22 +951,25 @@ define( return c.start.row; }), (n.setRow = function (e) { - (e = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, e))), + ((e = Math.max( + this.autoSelect ? 0 : -1, + Math.min(this.data.length, e), + )), c.start.row != e && (n.selection.clearSelection(), (c.start.row = c.end.row = e || 0), n.session._emit("changeBackMarker"), n.moveCursorTo(e || 0, 0), - n.isOpen && n._signal("select")); + n.isOpen && n._signal("select"))); }), n.on("changeSelection", function () { - n.isOpen && n.setRow(n.selection.lead.row), - n.renderer.scrollCursorIntoView(); + (n.isOpen && n.setRow(n.selection.lead.row), + n.renderer.scrollCursorIntoView()); }), (n.hide = function () { - (this.container.style.display = "none"), + ((this.container.style.display = "none"), this._signal("hide"), - (n.isOpen = !1); + (n.isOpen = !1)); }), (n.show = function (e, t, r) { var s = this.container, @@ -975,7 +979,7 @@ define( f = a.$maxLines * t * 1.4, l = e.top + this.$borderSize, c = l > o / 2 && !r; - c && l + t + f > o + (c && l + t + f > o ? ((a.$maxPixelHeight = l - 2 * this.$borderSize), (s.style.top = ""), (s.style.bottom = o - l + "px"), @@ -986,13 +990,13 @@ define( (s.style.bottom = ""), (n.isTopdown = !0)), (s.style.display = ""), - this.renderer.$textLayer.checkForSizeChanges(); + this.renderer.$textLayer.checkForSizeChanges()); var h = e.left; - h + s.offsetWidth > u && (h = u - s.offsetWidth), + (h + s.offsetWidth > u && (h = u - s.offsetWidth), (s.style.left = h + "px"), this._signal("show"), (i = null), - (n.isOpen = !0); + (n.isOpen = !0)); }), (n.getTextLeftOffset = function () { return this.$borderSize + this.renderer.$padding + this.$imageSize; @@ -1002,11 +1006,11 @@ define( n ); }; - a.importCssString( + (a.importCssString( ".ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #3a674e;}.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4); position: absolute; z-index: 2;}.ace_dark.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid rgba(109, 150, 13, 0.8); background: rgba(58, 103, 78, 0.62);}.ace_completion-meta { opacity: 0.5; margin: 0.9em;}.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #2d69c7;}.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #93ca12;}.ace_editor.ace_autocomplete { width: 300px; z-index: 200000; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4; background: #fefefe; color: #111;}.ace_dark.ace_editor.ace_autocomplete { border: 1px #484747 solid; box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51); line-height: 1.4; background: #25282c; color: #c1c1c1;}", "autocompletion.css", ), - (t.AcePopup = l); + (t.AcePopup = l)); }, ), define("ace/autocomplete/util", ["require", "exports", "module"], function (e, t, n) { @@ -1017,11 +1021,11 @@ define( i === 0 && n(); for (var s = 0; s < i; s++) t(e[s], function (e, t) { - r++, r === i && n(e, t); + (r++, r === i && n(e, t)); }); }; var r = /[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/; - (t.retrievePrecedingIdentifier = function (e, t, n) { + ((t.retrievePrecedingIdentifier = function (e, t, n) { n = n || r; var i = []; for (var s = t - 1; s >= 0; s--) { @@ -1058,7 +1062,7 @@ define( ), r || this.retrievePrecedingIdentifier(n, t.column) ); - }); + })); }), define( "ace/autocomplete", @@ -1084,7 +1088,7 @@ define( a = e("./lib/dom"), f = e("./snippets").snippetManager, l = function () { - (this.autoInsert = !1), + ((this.autoInsert = !1), (this.autoSelect = !0), (this.exactMatch = !1), (this.gatherCompletionsId = 0), @@ -1099,16 +1103,16 @@ define( this.updateCompletions(!0); }.bind(this), )), - (this.tooltipTimer = u.delayedCall(this.updateDocTooltip.bind(this), 50)); + (this.tooltipTimer = u.delayedCall(this.updateDocTooltip.bind(this), 50))); }; - (function () { - (this.$init = function () { + ((function () { + ((this.$init = function () { return ( (this.popup = new i(document.body || document.documentElement)), this.popup.on( "click", function (e) { - this.insertMatch(), e.stop(); + (this.insertMatch(), e.stop()); }.bind(this), ), (this.popup.focus = this.editor.focus.bind(this.editor)), @@ -1122,30 +1126,30 @@ define( return this.popup || this.$init(); }), (this.openPopup = function (e, t, n) { - this.popup || this.$init(), + (this.popup || this.$init(), (this.popup.autoSelect = this.autoSelect), this.popup.setData( this.completions.filtered, this.completions.filterText, ), - e.keyBinding.addKeyboardHandler(this.keyboardHandler); + e.keyBinding.addKeyboardHandler(this.keyboardHandler)); var r = e.renderer; this.popup.setRow(this.autoSelect ? 0 : -1); if (!n) { - this.popup.setTheme(e.getTheme()), - this.popup.setFontSize(e.getFontSize()); + (this.popup.setTheme(e.getTheme()), + this.popup.setFontSize(e.getFontSize())); var i = r.layerConfig.lineHeight, s = r.$cursorLayer.getPixelPosition(this.base, !0); s.left -= this.popup.getTextLeftOffset(); var o = e.container.getBoundingClientRect(); - (s.top += o.top - r.layerConfig.offset), + ((s.top += o.top - r.layerConfig.offset), (s.left += o.left - e.renderer.scrollLeft), (s.left += r.gutterWidth), - this.popup.show(s, i); + this.popup.show(s, i)); } else n && !t && this.detach(); }), (this.detach = function () { - this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler), + (this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler), this.editor.off("changeSelection", this.changeListener), this.editor.off("blur", this.blurListener), this.editor.off("mousedown", this.mousedownListener), @@ -1156,12 +1160,12 @@ define( this.popup && this.popup.isOpen && this.popup.hide(), this.base && this.base.detach(), (this.activated = !1), - (this.completions = this.base = null); + (this.completions = this.base = null)); }), (this.changeListener = function (e) { var t = this.editor.selection.lead; - (t.row != this.base.row || t.column < this.base.column) && this.detach(), - this.activated ? this.changeTimer.schedule() : this.detach(); + ((t.row != this.base.row || t.column < this.base.column) && this.detach(), + this.activated ? this.changeTimer.schedule() : this.detach()); }), (this.blurListener = function (e) { var t = document.activeElement, @@ -1211,8 +1215,8 @@ define( if (this.completions.filterText) { var n = this.editor.selection.getAllRanges(); for (var r = 0, i; (i = n[r]); r++) - (i.start.column -= this.completions.filterText.length), - this.editor.session.remove(i); + ((i.start.column -= this.completions.filterText.length), + this.editor.session.remove(i)); } e.snippet ? f.insertSnippet(this.editor, e.snippet) @@ -1258,26 +1262,26 @@ define( var n = e.getSession(), r = e.getCursorPosition(), i = s.getCompletionPrefix(e); - (this.base = n.doc.createAnchor(r.row, r.column - i.length)), - (this.base.$insertRight = !0); + ((this.base = n.doc.createAnchor(r.row, r.column - i.length)), + (this.base.$insertRight = !0)); var o = [], u = e.completers.length; return ( e.completers.forEach(function (a, f) { a.getCompletions(e, n, r, i, function (n, r) { - !n && r && (o = o.concat(r)), + (!n && r && (o = o.concat(r)), t(null, { prefix: s.getCompletionPrefix(e), matches: o, finished: --u === 0, - }); + })); }); }), !0 ); }), (this.showPopup = function (e) { - this.editor && this.detach(), + (this.editor && this.detach(), (this.activated = !0), (this.editor = e), e.completer != this && @@ -1286,7 +1290,7 @@ define( e.on("blur", this.blurListener), e.on("mousedown", this.mousedownListener), e.on("mousewheel", this.mousewheelListener), - this.updateCompletions(); + this.updateCompletions()); }), (this.updateCompletions = function (e) { if (e && this.base && this.completions) { @@ -1317,9 +1321,9 @@ define( if (!o || !o.length) return i(); if (s.indexOf(n.prefix) !== 0 || r != this.gatherCompletionsId) return; - (this.completions = new c(o)), + ((this.completions = new c(o)), this.exactMatch && (this.completions.exactMatch = !0), - this.completions.setFilter(s); + this.completions.setFilter(s)); var u = this.completions.filtered; if (!u.length) return i(); if (u.length == 1 && u[0].value == s && !u[0].snippet) return i(); @@ -1338,11 +1342,11 @@ define( n = t && (t[e.getHoveredRow()] || t[e.getRow()]), r = null; if (!n || !this.editor || !this.popup.isOpen) return this.hideDocTooltip(); - this.editor.completers.some(function (e) { - return e.getDocTooltip && (r = e.getDocTooltip(n)), r; + (this.editor.completers.some(function (e) { + return (e.getDocTooltip && (r = e.getDocTooltip(n)), r); }), r || (r = n), - typeof r == "string" && (r = { docText: r }); + typeof r == "string" && (r = { docText: r })); if (!r || (!r.docHTML && !r.docText)) return this.hideDocTooltip(); this.showDocTooltip(r); }), @@ -1356,13 +1360,13 @@ define( (this.tooltipNode.onblur = this.blurListener.bind(this)), (this.tooltipNode.onclick = this.onTooltipClick.bind(this))); var t = this.tooltipNode; - e.docHTML + (e.docHTML ? (t.innerHTML = e.docHTML) : e.docText && (t.textContent = e.docText), - t.parentNode || document.body.appendChild(t); + t.parentNode || document.body.appendChild(t)); var n = this.popup, r = n.container.getBoundingClientRect(); - (t.style.top = n.container.style.top), + ((t.style.top = n.container.style.top), (t.style.bottom = n.container.style.bottom), (t.style.display = "block"), window.innerWidth - r.right < 320 @@ -1379,52 +1383,52 @@ define( (t.style.bottom = "")) : ((t.style.right = window.innerWidth - r.left + "px"), (t.style.left = "")) - : ((t.style.left = r.right + 1 + "px"), (t.style.right = "")); + : ((t.style.left = r.right + 1 + "px"), (t.style.right = ""))); }), (this.hideDocTooltip = function () { this.tooltipTimer.cancel(); if (!this.tooltipNode) return; var e = this.tooltipNode; - !this.editor.isFocused() && + (!this.editor.isFocused() && document.activeElement == e && this.editor.focus(), (this.tooltipNode = null), - e.parentNode && e.parentNode.removeChild(e); + e.parentNode && e.parentNode.removeChild(e)); }), (this.onTooltipClick = function (e) { var t = e.target; while (t && t != this.tooltipNode) { if (t.nodeName == "A" && t.href) { - (t.rel = "noreferrer"), (t.target = "_blank"); + ((t.rel = "noreferrer"), (t.target = "_blank")); break; } t = t.parentNode; } - }); + })); }).call(l.prototype), (l.startCommand = { name: "startAutocomplete", exec: function (e) { - e.completer || (e.completer = new l()), + (e.completer || (e.completer = new l()), (e.completer.autoInsert = !1), (e.completer.autoSelect = !0), e.completer.showPopup(e), - e.completer.cancelContextMenu(); + e.completer.cancelContextMenu()); }, bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space", - }); + })); var c = function (e, t) { - (this.all = e), + ((this.all = e), (this.filtered = e), (this.filterText = t || ""), - (this.exactMatch = !1); + (this.exactMatch = !1)); }; - (function () { - (this.setFilter = function (e) { + ((function () { + ((this.setFilter = function (e) { if (e.length > this.filterText && e.lastIndexOf(this.filterText, 0) === 0) var t = this.filtered; else var t = this.all; - (this.filterText = e), + ((this.filterText = e), (t = this.filterCompletions(t, this.filterText)), (t = t.sort(function (e, t) { return ( @@ -1432,13 +1436,13 @@ define( t.$score - e.$score || (e.caption || e.value) < (t.caption || t.value) ); - })); + }))); var n = null; - (t = t.filter(function (e) { + ((t = t.filter(function (e) { var t = e.snippet || e.caption || e.value; return t === n ? !1 : ((n = t), !0); })), - (this.filtered = t); + (this.filtered = t)); }), (this.filterCompletions = function (e, t) { var n = [], @@ -1463,22 +1467,22 @@ define( m = u.indexOf(r[d], a + 1); c = v >= 0 ? (m < 0 || v < m ? v : m) : m; if (c < 0) continue e; - (h = c - a - 1), + ((h = c - a - 1), h > 0 && (a === -1 && (l += 10), (l += h), (f |= 1 << d)), - (a = c); + (a = c)); } } - (o.matchMask = f), + ((o.matchMask = f), (o.exactMatch = l ? 0 : 1), (o.$score = (o.score || 0) - l), - n.push(o); + n.push(o)); } return n; - }); + })); }).call(c.prototype), (t.Autocomplete = l), - (t.FilteredList = c); + (t.FilteredList = c)); }, ), define( @@ -1562,7 +1566,7 @@ define( : (o = r.getActiveScopes(e)); var a = r.snippetMap, f = []; - o.forEach(function (e) { + (o.forEach(function (e) { var t = a[e] || []; for (var n = t.length; n--; ) { var r = t[n], @@ -1579,7 +1583,7 @@ define( }); } }, this), - s(null, f); + s(null, f)); }, getDocTooltip: function (e) { e.type == "snippet" && @@ -1594,15 +1598,15 @@ define( }, }, c = [l, a, f]; - (t.setCompleters = function (e) { - (c.length = 0), e && c.push.apply(c, e); + ((t.setCompleters = function (e) { + ((c.length = 0), e && c.push.apply(c, e)); }), (t.addCompleter = function (e) { c.push(e); }), (t.textCompleter = a), (t.keyWordCompleter = f), - (t.snippetCompleter = l); + (t.snippetCompleter = l)); var h = { name: "expandSnippet", exec: function (e) { @@ -1615,12 +1619,12 @@ define( }, d = function (e) { var t = e.$id; - r.files || (r.files = {}), v(t), e.modes && e.modes.forEach(d); + (r.files || (r.files = {}), v(t), e.modes && e.modes.forEach(d)); }, v = function (e) { if (!e || r.files[e]) return; var t = e.replace("mode", "snippets"); - (r.files[e] = {}), + ((r.files[e] = {}), s.loadModule(t, function (t) { t && ((r.files[e] = t), @@ -1633,7 +1637,7 @@ define( t.includeScopes.forEach(function (e) { v("ace/mode/" + e); }))); - }); + })); }, m = function (e) { var t = e.editor, @@ -1679,7 +1683,7 @@ define( }, }); }, - ); + )); (function () { window.require(["ace/ext/language_tools"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/ext-linking.js b/web/static/ace/ext-linking.js index 4e1aed656..8b1ac9a4c 100644 --- a/web/static/ace/ext-linking.js +++ b/web/static/ace/ext-linking.js @@ -11,9 +11,9 @@ define("ace/ext/linking", ["require", "exports", "module", "ace/editor", "ace/co i = e.getDocumentPosition(), s = n.session, o = s.getTokenAt(i.row, i.column); - t.previousLinkingHover && t.previousLinkingHover != o && n._emit("linkHoverOut"), + (t.previousLinkingHover && t.previousLinkingHover != o && n._emit("linkHoverOut"), n._emit("linkHover", { position: i, token: o }), - (t.previousLinkingHover = o); + (t.previousLinkingHover = o)); } else t.previousLinkingHover && (n._emit("linkHoverOut"), (t.previousLinkingHover = !1)); } function s(e) { @@ -28,7 +28,7 @@ define("ace/ext/linking", ["require", "exports", "module", "ace/editor", "ace/co } } var r = e("ace/editor").Editor; - e("../config").defineOptions(r.prototype, "editor", { + (e("../config").defineOptions(r.prototype, "editor", { enableLinking: { set: function (e) { e @@ -38,7 +38,7 @@ define("ace/ext/linking", ["require", "exports", "module", "ace/editor", "ace/co value: !1, }, }), - (t.previousLinkingHover = !1); + (t.previousLinkingHover = !1)); }); (function () { window.require(["ace/ext/linking"], function (m) { diff --git a/web/static/ace/ext-modelist.js b/web/static/ace/ext-modelist.js index 358629323..61a650e24 100644 --- a/web/static/ace/ext-modelist.js +++ b/web/static/ace/ext-modelist.js @@ -12,18 +12,18 @@ define("ace/ext/modelist", ["require", "exports", "module"], function (e, t, n) } var r = [], s = function (e, t, n) { - (this.name = e), + ((this.name = e), (this.caption = t), (this.mode = "ace/mode/" + e), - (this.extensions = n); + (this.extensions = n)); var r; - /\^/.test(n) + (/\^/.test(n) ? (r = n.replace(/\|(\^)?/g, function (e, t) { return "$|" + (t ? "^" : "^.*\\."); }) + "$") : (r = "^.*\\.(" + n + ")$"), - (this.extRe = new RegExp(r, "gi")); + (this.extRe = new RegExp(r, "gi"))); }; s.prototype.supportsFile = function (e) { return e.match(this.extRe); @@ -200,7 +200,7 @@ define("ace/ext/modelist", ["require", "exports", "module"], function (e, t, n) c = (u[f] || f).replace(/_/g, " "), h = f.toLowerCase(), p = new s(h, c, l[0]); - (a[h] = p), r.push(p); + ((a[h] = p), r.push(p)); } n.exports = { getModeForPath: i, modes: r, modesByName: a }; }); diff --git a/web/static/ace/ext-options.js b/web/static/ace/ext-options.js index be4e9d832..2ae3b471e 100644 --- a/web/static/ace/ext-options.js +++ b/web/static/ace/ext-options.js @@ -1,4 +1,4 @@ -define( +(define( "ace/ext/menu_tools/overlay_page", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { @@ -6,34 +6,34 @@ define( var r = e("../../lib/dom"), i = "#ace_settingsmenu, #kbshortcutmenu {background-color: #F7F7F7;color: black;box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);padding: 1em 0.5em 2em 1em;overflow: auto;position: absolute;margin: 0;bottom: 0;right: 0;top: 0;z-index: 9991;cursor: default;}.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);background-color: rgba(255, 255, 255, 0.6);color: black;}.ace_optionsMenuEntry:hover {background-color: rgba(100, 100, 100, 0.1);transition: all 0.3s}.ace_closeButton {background: rgba(245, 146, 146, 0.5);border: 1px solid #F48A8A;border-radius: 50%;padding: 7px;position: absolute;right: -8px;top: -8px;z-index: 100000;}.ace_closeButton{background: rgba(245, 146, 146, 0.9);}.ace_optionsMenuKey {color: darkslateblue;font-weight: bold;}.ace_optionsMenuCommand {color: darkcyan;font-weight: normal;}.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {vertical-align: middle;}.ace_optionsMenuEntry button[ace_selected_button=true] {background: #e7e7e7;box-shadow: 1px 0px 2px 0px #adadad inset;border-color: #adadad;}.ace_optionsMenuEntry button {background: white;border: 1px solid lightgray;margin: 0px;}.ace_optionsMenuEntry button:hover{background: #f0f0f0;}"; - r.importCssString(i), + (r.importCssString(i), (n.exports.overlayPage = function (t, n, i, s, o, u) { function l(e) { e.keyCode === 27 && a.click(); } - (i = i ? "top: " + i + ";" : ""), + ((i = i ? "top: " + i + ";" : ""), (o = o ? "bottom: " + o + ";" : ""), (s = s ? "right: " + s + ";" : ""), - (u = u ? "left: " + u + ";" : ""); + (u = u ? "left: " + u + ";" : "")); var a = document.createElement("div"), f = document.createElement("div"); - (a.style.cssText = + ((a.style.cssText = "margin: 0; padding: 0; position: fixed; top:0; bottom:0; left:0; right:0;z-index: 9990; background-color: rgba(0, 0, 0, 0.3);"), a.addEventListener("click", function () { - document.removeEventListener("keydown", l), + (document.removeEventListener("keydown", l), a.parentNode.removeChild(a), t.focus(), - (a = null); + (a = null)); }), document.addEventListener("keydown", l), (f.style.cssText = i + s + o + u), f.addEventListener("click", function (e) { e.stopPropagation(); - }); + })); var c = r.createElement("div"); c.style.position = "relative"; var h = r.createElement("div"); - (h.className = "ace_closeButton"), + ((h.className = "ace_closeButton"), h.addEventListener("click", function () { a.click(); }), @@ -42,8 +42,8 @@ define( f.appendChild(n), a.appendChild(f), document.body.appendChild(a), - t.blur(); - }); + t.blur()); + })); }, ), define("ace/ext/modelist", ["require", "exports", "module"], function (e, t, n) { @@ -60,18 +60,18 @@ define( } var r = [], s = function (e, t, n) { - (this.name = e), + ((this.name = e), (this.caption = t), (this.mode = "ace/mode/" + e), - (this.extensions = n); + (this.extensions = n)); var r; - /\^/.test(n) + (/\^/.test(n) ? (r = n.replace(/\|(\^)?/g, function (e, t) { return "$|" + (t ? "^" : "^.*\\."); }) + "$") : (r = "^.*\\.(" + n + ")$"), - (this.extRe = new RegExp(r, "gi")); + (this.extRe = new RegExp(r, "gi"))); }; s.prototype.supportsFile = function (e) { return e.match(this.extRe); @@ -248,7 +248,7 @@ define( c = (u[f] || f).replace(/_/g, " "), h = f.toLowerCase(), p = new s(h, c, l[0]); - (a[h] = p), r.push(p); + ((a[h] = p), r.push(p)); } n.exports = { getModeForPath: i, modes: r, modesByName: a }; }), @@ -297,7 +297,7 @@ define( ["Twilight", "twilight", "dark"], ["Vibrant Ink", "vibrant_ink", "dark"], ]; - (t.themesByName = {}), + ((t.themesByName = {}), (t.themes = r.map(function (e) { var n = e[1] || e[0].replace(/ /g, "_").toLowerCase(), r = { @@ -306,8 +306,8 @@ define( isDark: e[2] == "dark", name: n, }; - return (t.themesByName[n] = r), r; - })); + return ((t.themesByName[n] = r), r); + }))); }, ), define( @@ -447,18 +447,18 @@ define( }, }, p = function (e, t) { - (this.editor = e), + ((this.editor = e), (this.container = t || document.createElement("div")), (this.groups = []), - (this.options = {}); + (this.options = {})); }; - (function () { - s.implement(this, o), + ((function () { + (s.implement(this, o), (this.add = function (e) { - e.Main && s.mixin(h.Main, e.Main), e.More && s.mixin(h.More, e.More); + (e.Main && s.mixin(h.Main, e.Main), e.More && s.mixin(h.More, e.More)); }), (this.render = function () { - (this.container.innerHTML = ""), + ((this.container.innerHTML = ""), u( [ "table", @@ -479,7 +479,7 @@ define( ], ], this.container, - ); + )); }), (this.renderOptionGroup = function (e) { return Object.keys(e) @@ -537,7 +537,7 @@ define( }), ]; else if (t.type == "number") - (r = [ + ((r = [ "input", { type: "number", @@ -557,13 +557,13 @@ define( { onclick: function () { var t = this.parentNode.firstChild; - (t.value = e.value), t.oninput(); + ((t.value = e.value), t.oninput()); }, }, e.caption, ]; }), - ]); + ])); else if (t.items) { var s = function (e) { return e.map(function (e) { @@ -591,7 +591,7 @@ define( o, ]; } else - typeof t.values == "string" && (t.values = t.values.split("|")), + (typeof t.values == "string" && (t.values = t.values.split("|")), t.values && (i = i == t.values[1]), (r = [ "input", @@ -601,12 +601,12 @@ define( checked: i || null, onchange: function () { var e = this.checked; - t.values && (e = t.values[e ? 1 : 0]), - n.setOption(t, e); + (t.values && (e = t.values[e ? 1 : 0]), + n.setOption(t, e)); }, }, ]), - t.type == "checkedNumber" && (r = [r, []]); + t.type == "checkedNumber" && (r = [r, []])); return r; }), (this.renderOption = function (e, t) { @@ -622,7 +622,7 @@ define( ]; }), (this.setOption = function (e, t) { - typeof e == "string" && (e = this.options[e]), + (typeof e == "string" && (e = this.options[e]), t == "false" && (t = !1), t == "true" && (t = !0), t == "null" && (t = null), @@ -631,15 +631,15 @@ define( parseFloat(t).toString() == t && (t = parseFloat(t)), e.onchange ? e.onchange(t) : e.path && this.editor.setOption(e.path, t), - this._signal("setOption", { name: e.path, value: t }); + this._signal("setOption", { name: e.path, value: t })); }), (this.getOption = function (e) { return e.getValue ? e.getValue() : this.editor.getOption(e.path); - }); + })); }).call(p.prototype), - (t.OptionPanel = p); + (t.OptionPanel = p)); }, - ); + )); (function () { window.require(["ace/ext/options"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/ext-rtl.js b/web/static/ace/ext-rtl.js index b24d73278..d7078ea72 100644 --- a/web/static/ace/ext-rtl.js +++ b/web/static/ace/ext-rtl.js @@ -47,7 +47,7 @@ define("ace/ext/rtl", [ t.direction = t.textAlign = t.width = ""; } var t = e.$textLayer.$lines; - t.cells.forEach(n), t.cellCache.forEach(n); + (t.cells.forEach(n), t.cellCache.forEach(n)); } var r = e("ace/lib/dom"), i = e("ace/lib/lang"), @@ -73,7 +73,7 @@ define("ace/ext/rtl", [ e("../config").defineOptions(o.prototype, "editor", { rtlText: { set: function (e) { - e + (e ? (this.on("session", f), this.on("changeSelection", u), this.renderer.on("afterRender", l), @@ -85,7 +85,7 @@ define("ace/ext/rtl", [ this.commands.off("exec", a), this.commands.removeCommands(s), c(this.renderer)), - this.renderer.updateFull(); + this.renderer.updateFull()); }, }, }); diff --git a/web/static/ace/ext-searchbox.js b/web/static/ace/ext-searchbox.js index e2b54f542..7f670807e 100644 --- a/web/static/ace/ext-searchbox.js +++ b/web/static/ace/ext-searchbox.js @@ -25,22 +25,24 @@ define("ace/ext/searchbox", [ ), c = function (e, t, n) { var i = r.createElement("div"); - (i.innerHTML = l), + ((i.innerHTML = l), (this.element = i.firstChild), (this.setSession = this.setSession.bind(this)), this.$init(), this.setEditor(e), - r.importCssString(o, "ace_searchbox", e.container); + r.importCssString(o, "ace_searchbox", e.container)); }; - (function () { - (this.setEditor = function (e) { - (e.searchBox = this), e.renderer.scroller.appendChild(this.element), (this.editor = e); + ((function () { + ((this.setEditor = function (e) { + ((e.searchBox = this), + e.renderer.scroller.appendChild(this.element), + (this.editor = e)); }), (this.setSession = function (e) { - (this.searchRange = null), this.$syncOptions(!0); + ((this.searchRange = null), this.$syncOptions(!0)); }), (this.$initElements = function (e) { - (this.searchBox = e.querySelector(".ace_search_form")), + ((this.searchBox = e.querySelector(".ace_search_form")), (this.replaceBox = e.querySelector(".ace_replace_form")), (this.searchOption = e.querySelector("[action=searchInSelection]")), (this.replaceOption = e.querySelector("[action=toggleReplace]")), @@ -49,25 +51,25 @@ define("ace/ext/searchbox", [ (this.wholeWordOption = e.querySelector("[action=toggleWholeWords]")), (this.searchInput = this.searchBox.querySelector(".ace_search_field")), (this.replaceInput = this.replaceBox.querySelector(".ace_search_field")), - (this.searchCounter = e.querySelector(".ace_search_counter")); + (this.searchCounter = e.querySelector(".ace_search_counter"))); }), (this.$init = function () { var e = this.element; this.$initElements(e); var t = this; - s.addListener(e, "mousedown", function (e) { - setTimeout(function () { + (s.addListener(e, "mousedown", function (e) { + (setTimeout(function () { t.activeInput.focus(); }, 0), - s.stopPropagation(e); + s.stopPropagation(e)); }), s.addListener(e, "click", function (e) { var n = e.target || e.srcElement, r = n.getAttribute("action"); - r && t[r] + (r && t[r] ? t[r]() : t.$searchBarKb.commands[r] && t.$searchBarKb.commands[r].exec(t), - s.stopPropagation(e); + s.stopPropagation(e)); }), s.addCommandKeyListener(e, function (e, n, r) { var i = a.keyCodeToString(r), @@ -81,11 +83,11 @@ define("ace/ext/searchbox", [ t.$onChange.schedule(20); }), s.addListener(this.searchInput, "focus", function () { - (t.activeInput = t.searchInput), t.searchInput.value && t.highlight(); + ((t.activeInput = t.searchInput), t.searchInput.value && t.highlight()); }), s.addListener(this.replaceInput, "focus", function () { - (t.activeInput = t.replaceInput), t.searchInput.value && t.highlight(); - }); + ((t.activeInput = t.replaceInput), t.searchInput.value && t.highlight()); + })); }), (this.$closeSearchBarKb = new u([ { @@ -100,13 +102,13 @@ define("ace/ext/searchbox", [ this.$searchBarKb.bindKeys({ "Ctrl-f|Command-f": function (e) { var t = (e.isReplace = !e.isReplace); - (e.replaceBox.style.display = t ? "" : "none"), + ((e.replaceBox.style.display = t ? "" : "none"), (e.replaceOption.checked = !1), e.$syncOptions(), - e.searchInput.focus(); + e.searchInput.focus()); }, "Ctrl-H|Command-Option-F": function (e) { - (e.replaceOption.checked = !0), e.$syncOptions(), e.replaceInput.focus(); + ((e.replaceOption.checked = !0), e.$syncOptions(), e.replaceInput.focus()); }, "Ctrl-G|Command-G": function (e) { e.findNext(); @@ -120,13 +122,13 @@ define("ace/ext/searchbox", [ }); }, Return: function (e) { - e.activeInput == e.replaceInput && e.replace(), e.findNext(); + (e.activeInput == e.replaceInput && e.replace(), e.findNext()); }, "Shift-Return": function (e) { - e.activeInput == e.replaceInput && e.replace(), e.findPrev(); + (e.activeInput == e.replaceInput && e.replace(), e.findPrev()); }, "Alt-Return": function (e) { - e.activeInput == e.replaceInput && e.replaceAll(), e.findAll(); + (e.activeInput == e.replaceInput && e.replaceAll(), e.findAll()); }, Tab: function (e) { (e.activeInput == e.replaceInput ? e.searchInput : e.replaceInput).focus(); @@ -137,43 +139,44 @@ define("ace/ext/searchbox", [ name: "toggleRegexpMode", bindKey: { win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/" }, exec: function (e) { - (e.regExpOption.checked = !e.regExpOption.checked), e.$syncOptions(); + ((e.regExpOption.checked = !e.regExpOption.checked), e.$syncOptions()); }, }, { name: "toggleCaseSensitive", bindKey: { win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I" }, exec: function (e) { - (e.caseSensitiveOption.checked = !e.caseSensitiveOption.checked), - e.$syncOptions(); + ((e.caseSensitiveOption.checked = !e.caseSensitiveOption.checked), + e.$syncOptions()); }, }, { name: "toggleWholeWords", bindKey: { win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W" }, exec: function (e) { - (e.wholeWordOption.checked = !e.wholeWordOption.checked), e.$syncOptions(); + ((e.wholeWordOption.checked = !e.wholeWordOption.checked), + e.$syncOptions()); }, }, { name: "toggleReplace", exec: function (e) { - (e.replaceOption.checked = !e.replaceOption.checked), e.$syncOptions(); + ((e.replaceOption.checked = !e.replaceOption.checked), e.$syncOptions()); }, }, { name: "searchInSelection", exec: function (e) { - (e.searchOption.checked = !e.searchRange), + ((e.searchOption.checked = !e.searchRange), e.setSearchRange( e.searchOption.checked && e.editor.getSelectionRange(), ), - e.$syncOptions(); + e.$syncOptions()); }, }, ]), (this.setSearchRange = function (e) { - (this.searchRange = e), + ((this.searchRange = e), e ? (this.searchRangeMarker = this.editor.session.addMarker( e, @@ -181,10 +184,10 @@ define("ace/ext/searchbox", [ )) : this.searchRangeMarker && (this.editor.session.removeMarker(this.searchRangeMarker), - (this.searchRangeMarker = null)); + (this.searchRangeMarker = null))); }), (this.$syncOptions = function (e) { - r.setCssClass(this.replaceOption, "checked", this.searchRange), + (r.setCssClass(this.replaceOption, "checked", this.searchRange), r.setCssClass(this.searchOption, "checked", this.searchOption.checked), (this.replaceOption.textContent = this.replaceOption.checked ? "-" : "+"), r.setCssClass(this.regExpOption, "checked", this.regExpOption.checked), @@ -195,11 +198,11 @@ define("ace/ext/searchbox", [ this.caseSensitiveOption.checked, ), (this.replaceBox.style.display = this.replaceOption.checked ? "" : "none"), - this.find(!1, !1, e); + this.find(!1, !1, e)); }), (this.highlight = function (e) { - this.editor.session.highlight(e || this.editor.$search.$options.re), - this.editor.renderer.updateBackMarkers(); + (this.editor.session.highlight(e || this.editor.$search.$options.re), + this.editor.renderer.updateBackMarkers()); }), (this.find = function (e, t, n) { var i = this.editor.find(this.searchInput.value, { @@ -213,10 +216,10 @@ define("ace/ext/searchbox", [ range: this.searchRange, }), s = !i && this.searchInput.value; - r.setCssClass(this.searchBox, "ace_nomatch", s), + (r.setCssClass(this.searchBox, "ace_nomatch", s), this.editor._emit("findSearchBox", { match: !s }), this.highlight(), - this.updateCounter(); + this.updateCounter()); }), (this.updateCounter = function () { var e = this.editor, @@ -233,7 +236,7 @@ define("ace/ext/searchbox", [ var o = (t.lastIndex = 0), u; while ((u = t.exec(i))) { - n++, (o = u.index), o <= s && r++; + (n++, (o = u.index), o <= s && r++); if (n > f) break; if (!u[0]) { t.lastIndex = o += 1; @@ -256,10 +259,10 @@ define("ace/ext/searchbox", [ wholeWord: this.wholeWordOption.checked, }), t = !e && this.searchInput.value; - r.setCssClass(this.searchBox, "ace_nomatch", t), + (r.setCssClass(this.searchBox, "ace_nomatch", t), this.editor._emit("findSearchBox", { match: !t }), this.highlight(), - this.hide(); + this.hide()); }), (this.replace = function () { this.editor.getReadOnly() || this.editor.replace(this.replaceInput.value); @@ -272,15 +275,15 @@ define("ace/ext/searchbox", [ this.editor.getReadOnly() || this.editor.replaceAll(this.replaceInput.value); }), (this.hide = function () { - (this.active = !1), + ((this.active = !1), this.setSearchRange(null), this.editor.off("changeSession", this.setSession), (this.element.style.display = "none"), this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb), - this.editor.focus(); + this.editor.focus()); }), (this.show = function (e, t) { - (this.active = !0), + ((this.active = !0), this.editor.on("changeSession", this.setSession), (this.element.style.display = ""), (this.replaceOption.checked = t), @@ -288,18 +291,18 @@ define("ace/ext/searchbox", [ this.searchInput.focus(), this.searchInput.select(), this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb), - this.$syncOptions(!0); + this.$syncOptions(!0)); }), (this.isFocused = function () { var e = document.activeElement; return e == this.searchInput || e == this.replaceInput; - }); + })); }).call(c.prototype), (t.SearchBox = c), (t.Search = function (e, t) { var n = e.searchBox || new c(e); n.show(e.session.getTextRange(), t); - }); + })); }); (function () { window.require(["ace/ext/searchbox"], function (m) { diff --git a/web/static/ace/ext-settings_menu.js b/web/static/ace/ext-settings_menu.js index 55f62a058..cf11ccf66 100644 --- a/web/static/ace/ext-settings_menu.js +++ b/web/static/ace/ext-settings_menu.js @@ -1,4 +1,4 @@ -define( +(define( "ace/ext/menu_tools/overlay_page", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { @@ -6,34 +6,34 @@ define( var r = e("../../lib/dom"), i = "#ace_settingsmenu, #kbshortcutmenu {background-color: #F7F7F7;color: black;box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);padding: 1em 0.5em 2em 1em;overflow: auto;position: absolute;margin: 0;bottom: 0;right: 0;top: 0;z-index: 9991;cursor: default;}.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);background-color: rgba(255, 255, 255, 0.6);color: black;}.ace_optionsMenuEntry:hover {background-color: rgba(100, 100, 100, 0.1);transition: all 0.3s}.ace_closeButton {background: rgba(245, 146, 146, 0.5);border: 1px solid #F48A8A;border-radius: 50%;padding: 7px;position: absolute;right: -8px;top: -8px;z-index: 100000;}.ace_closeButton{background: rgba(245, 146, 146, 0.9);}.ace_optionsMenuKey {color: darkslateblue;font-weight: bold;}.ace_optionsMenuCommand {color: darkcyan;font-weight: normal;}.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {vertical-align: middle;}.ace_optionsMenuEntry button[ace_selected_button=true] {background: #e7e7e7;box-shadow: 1px 0px 2px 0px #adadad inset;border-color: #adadad;}.ace_optionsMenuEntry button {background: white;border: 1px solid lightgray;margin: 0px;}.ace_optionsMenuEntry button:hover{background: #f0f0f0;}"; - r.importCssString(i), + (r.importCssString(i), (n.exports.overlayPage = function (t, n, i, s, o, u) { function l(e) { e.keyCode === 27 && a.click(); } - (i = i ? "top: " + i + ";" : ""), + ((i = i ? "top: " + i + ";" : ""), (o = o ? "bottom: " + o + ";" : ""), (s = s ? "right: " + s + ";" : ""), - (u = u ? "left: " + u + ";" : ""); + (u = u ? "left: " + u + ";" : "")); var a = document.createElement("div"), f = document.createElement("div"); - (a.style.cssText = + ((a.style.cssText = "margin: 0; padding: 0; position: fixed; top:0; bottom:0; left:0; right:0;z-index: 9990; background-color: rgba(0, 0, 0, 0.3);"), a.addEventListener("click", function () { - document.removeEventListener("keydown", l), + (document.removeEventListener("keydown", l), a.parentNode.removeChild(a), t.focus(), - (a = null); + (a = null)); }), document.addEventListener("keydown", l), (f.style.cssText = i + s + o + u), f.addEventListener("click", function (e) { e.stopPropagation(); - }); + })); var c = r.createElement("div"); c.style.position = "relative"; var h = r.createElement("div"); - (h.className = "ace_closeButton"), + ((h.className = "ace_closeButton"), h.addEventListener("click", function () { a.click(); }), @@ -42,8 +42,8 @@ define( f.appendChild(n), a.appendChild(f), document.body.appendChild(a), - t.blur(); - }); + t.blur()); + })); }, ), define("ace/ext/modelist", ["require", "exports", "module"], function (e, t, n) { @@ -60,18 +60,18 @@ define( } var r = [], s = function (e, t, n) { - (this.name = e), + ((this.name = e), (this.caption = t), (this.mode = "ace/mode/" + e), - (this.extensions = n); + (this.extensions = n)); var r; - /\^/.test(n) + (/\^/.test(n) ? (r = n.replace(/\|(\^)?/g, function (e, t) { return "$|" + (t ? "^" : "^.*\\."); }) + "$") : (r = "^.*\\.(" + n + ")$"), - (this.extRe = new RegExp(r, "gi")); + (this.extRe = new RegExp(r, "gi"))); }; s.prototype.supportsFile = function (e) { return e.match(this.extRe); @@ -99,7 +99,7 @@ define( c = (u[f] || f).replace(/_/g, " "), h = f.toLowerCase(), p = new s(h, c, l[0]); - (a[h] = p), r.push(p); + ((a[h] = p), r.push(p)); } n.exports = { getModeForPath: i, modes: r, modesByName: a }; }), @@ -110,7 +110,7 @@ define( "use strict"; e("ace/lib/fixoldbrowsers"); var r = [["Light"], ["Dark", "dark", "dark"]]; - (t.themesByName = {}), + ((t.themesByName = {}), (t.themes = r.map(function (e) { var n = e[1] || e[0].replace(/ /g, "_").toLowerCase(), r = { @@ -119,8 +119,8 @@ define( isDark: e[2] == "dark", name: n, }; - return (t.themesByName[n] = r), r; - })); + return ((t.themesByName[n] = r), r); + }))); }, ), define( @@ -260,18 +260,18 @@ define( }, }, p = function (e, t) { - (this.editor = e), + ((this.editor = e), (this.container = t || document.createElement("div")), (this.groups = []), - (this.options = {}); + (this.options = {})); }; - (function () { - s.implement(this, o), + ((function () { + (s.implement(this, o), (this.add = function (e) { - e.Main && s.mixin(h.Main, e.Main), e.More && s.mixin(h.More, e.More); + (e.Main && s.mixin(h.Main, e.Main), e.More && s.mixin(h.More, e.More)); }), (this.render = function () { - (this.container.innerHTML = ""), + ((this.container.innerHTML = ""), u( [ "table", @@ -292,7 +292,7 @@ define( ], ], this.container, - ); + )); }), (this.renderOptionGroup = function (e) { return Object.keys(e) @@ -350,7 +350,7 @@ define( }), ]; else if (t.type == "number") - (r = [ + ((r = [ "input", { type: "number", @@ -370,13 +370,13 @@ define( { onclick: function () { var t = this.parentNode.firstChild; - (t.value = e.value), t.oninput(); + ((t.value = e.value), t.oninput()); }, }, e.caption, ]; }), - ]); + ])); else if (t.items) { var s = function (e) { return e.map(function (e) { @@ -404,7 +404,7 @@ define( o, ]; } else - typeof t.values == "string" && (t.values = t.values.split("|")), + (typeof t.values == "string" && (t.values = t.values.split("|")), t.values && (i = i == t.values[1]), (r = [ "input", @@ -414,12 +414,12 @@ define( checked: i || null, onchange: function () { var e = this.checked; - t.values && (e = t.values[e ? 1 : 0]), - n.setOption(t, e); + (t.values && (e = t.values[e ? 1 : 0]), + n.setOption(t, e)); }, }, ]), - t.type == "checkedNumber" && (r = [r, []]); + t.type == "checkedNumber" && (r = [r, []])); return r; }), (this.renderOption = function (e, t) { @@ -435,7 +435,7 @@ define( ]; }), (this.setOption = function (e, t) { - typeof e == "string" && (e = this.options[e]), + (typeof e == "string" && (e = this.options[e]), t == "false" && (t = !1), t == "true" && (t = !0), t == "null" && (t = null), @@ -444,13 +444,13 @@ define( parseFloat(t).toString() == t && (t = parseFloat(t)), e.onchange ? e.onchange(t) : e.path && this.editor.setOption(e.path, t), - this._signal("setOption", { name: e.path, value: t }); + this._signal("setOption", { name: e.path, value: t })); }), (this.getOption = function (e) { return e.getValue ? e.getValue() : this.editor.getOption(e.path); - }); + })); }).call(p.prototype), - (t.OptionPanel = p); + (t.OptionPanel = p)); }, ), define( @@ -468,10 +468,10 @@ define( function s(e) { if (!document.getElementById("ace_settingsmenu")) { var t = new r(e); - t.render(), + (t.render(), (t.container.id = "ace_settingsmenu"), i(e, t.container, "0", "0", "0"), - t.container.querySelector("select,input,button,checkbox").focus(); + t.container.querySelector("select,input,button,checkbox").focus()); } } var r = e("ace/ext/options").OptionPanel, @@ -483,7 +483,7 @@ define( }; }; }, - ); + )); (function () { window.require(["ace/ext/settings_menu"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/ext-spellcheck.js b/web/static/ace/ext-spellcheck.js index 3f3153bac..e07596ee5 100644 --- a/web/static/ace/ext-spellcheck.js +++ b/web/static/ace/ext-spellcheck.js @@ -19,13 +19,13 @@ define("ace/ext/spellcheck", [ if (!t.session.tokenRe.test(o)) return; var u = "\x01\x01", a = o + " " + u; - (n.value = a), + ((n.value = a), n.setSelectionRange(o.length, o.length + 1), n.setSelectionRange(0, 0), - n.setSelectionRange(0, o.length); + n.setSelectionRange(0, o.length)); var f = !1; - r.addListener(n, "keydown", function l() { - r.removeListener(n, "keydown", l), (f = !0); + (r.addListener(n, "keydown", function l() { + (r.removeListener(n, "keydown", l), (f = !0)); }), t.textInput.setInputHandler(function (e) { console.log(e, a, n.selectionStart, n.selectionEnd); @@ -40,17 +40,17 @@ define("ace/ext/spellcheck", [ : ((r = r.slice(0, -1)), t.session.replace(s, r), ""); } return e; - }); + })); }; var i = e("../editor").Editor; e("../config").defineOptions(i.prototype, "editor", { spellcheck: { set: function (e) { var n = this.textInput.getElement(); - (n.spellcheck = !!e), + ((n.spellcheck = !!e), e ? this.on("nativecontextmenu", t.contextMenuHandler) - : this.removeListener("nativecontextmenu", t.contextMenuHandler); + : this.removeListener("nativecontextmenu", t.contextMenuHandler)); }, value: !0, }, diff --git a/web/static/ace/ext-split.js b/web/static/ace/ext-split.js index da6f86c6a..14cce9099 100644 --- a/web/static/ace/ext-split.js +++ b/web/static/ace/ext-split.js @@ -1,4 +1,4 @@ -define( +(define( "ace/split", [ "require", @@ -20,7 +20,7 @@ define( u = e("./virtual_renderer").VirtualRenderer, a = e("./edit_session").EditSession, f = function (e, t, n) { - (this.BELOW = 1), + ((this.BELOW = 1), (this.BESIDE = 0), (this.$container = e), (this.$theme = t), @@ -35,15 +35,15 @@ define( function (e) { this.$cEditor = e; }.bind(this), - ); + )); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.$createEditor = function () { var e = document.createElement("div"); - (e.className = this.$editorCSS), + ((e.className = this.$editorCSS), (e.style.cssText = "position: absolute; top:0px; bottom:0px"), - this.$container.appendChild(e); + this.$container.appendChild(e)); var t = new o(new u(e, this.$theme)); return ( t.on( @@ -63,16 +63,16 @@ define( if (e == this.$splits) return; if (e > this.$splits) { while (this.$splits < this.$editors.length && this.$splits < e) - (t = this.$editors[this.$splits]), + ((t = this.$editors[this.$splits]), this.$container.appendChild(t.container), t.setFontSize(this.$fontSize), - this.$splits++; - while (this.$splits < e) this.$createEditor(), this.$splits++; + this.$splits++); + while (this.$splits < e) (this.$createEditor(), this.$splits++); } else while (this.$splits > e) - (t = this.$editors[this.$splits - 1]), + ((t = this.$editors[this.$splits - 1]), this.$container.removeChild(t.container), - this.$splits--; + this.$splits--); this.resize(); }), (this.getSplits = function () { @@ -105,10 +105,10 @@ define( }), (this.$fontSize = ""), (this.setFontSize = function (e) { - (this.$fontSize = e), + ((this.$fontSize = e), this.forEach(function (t) { t.setFontSize(e); - }); + })); }), (this.$cloneSession = function (e) { var t = new a(e.getDocument(), e.getMode()), @@ -132,14 +132,14 @@ define( var r = this.$editors.some(function (t) { return t.session === e; }); - return r && (e = this.$cloneSession(e)), n.setSession(e), e; + return (r && (e = this.$cloneSession(e)), n.setSession(e), e); }), (this.getOrientation = function () { return this.$orientation; }), (this.setOrientation = function (e) { if (this.$orientation == e) return; - (this.$orientation = e), this.resize(); + ((this.$orientation = e), this.resize()); }), (this.resize = function () { var e = this.$container.clientWidth, @@ -148,31 +148,31 @@ define( if (this.$orientation == this.BESIDE) { var r = e / this.$splits; for (var i = 0; i < this.$splits; i++) - (n = this.$editors[i]), + ((n = this.$editors[i]), (n.container.style.width = r + "px"), (n.container.style.top = "0px"), (n.container.style.left = i * r + "px"), (n.container.style.height = t + "px"), - n.resize(); + n.resize()); } else { var s = t / this.$splits; for (var i = 0; i < this.$splits; i++) - (n = this.$editors[i]), + ((n = this.$editors[i]), (n.container.style.width = e + "px"), (n.container.style.top = i * s + "px"), (n.container.style.left = "0px"), (n.container.style.height = s + "px"), - n.resize(); + n.resize()); } - }); + })); }).call(f.prototype), - (t.Split = f); + (t.Split = f)); }, ), define("ace/ext/split", ["require", "exports", "module", "ace/split"], function (e, t, n) { "use strict"; n.exports = e("../split"); - }); + })); (function () { window.require(["ace/ext/split"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/ext-static_highlight.js b/web/static/ace/ext-static_highlight.js index 64958bd8c..88f37f2e6 100644 --- a/web/static/ace/ext-static_highlight.js +++ b/web/static/ace/ext-static_highlight.js @@ -9,7 +9,7 @@ define("ace/ext/static_highlight", [ ], function (e, t, n) { "use strict"; function a(e) { - (this.type = e), (this.style = {}), (this.textContent = ""); + ((this.type = e), (this.style = {}), (this.textContent = "")); } var r = e("../edit_session").EditSession, i = e("../layer/text").Text, @@ -17,7 +17,7 @@ define("ace/ext/static_highlight", [ ".ace_static_highlight {font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;font-size: 12px;white-space: pre-wrap}.ace_static_highlight .ace_gutter {width: 2em;text-align: right;padding: 0 3px 0 0;margin-right: 3px;}.ace_static_highlight.ace_show_gutter .ace_line {padding-left: 2.6em;}.ace_static_highlight .ace_line { position: relative; }.ace_static_highlight .ace_gutter-cell {-moz-user-select: -moz-none;-khtml-user-select: none;-webkit-user-select: none;user-select: none;top: 0;bottom: 0;left: 0;position: absolute;}.ace_static_highlight .ace_gutter-cell:before {content: counter(ace_line, decimal);counter-increment: ace_line;}.ace_static_highlight {counter-reset: ace_line;}", o = e("../config"), u = e("../lib/dom"); - (a.prototype.cloneNode = function () { + ((a.prototype.cloneNode = function () { return this; }), (a.prototype.appendChild = function (e) { @@ -26,17 +26,17 @@ define("ace/ext/static_highlight", [ (a.prototype.toString = function () { var e = []; if (this.type != "fragment") { - e.push("<", this.type), this.className && e.push(" class='", this.className, "'"); + (e.push("<", this.type), this.className && e.push(" class='", this.className, "'")); var t = []; for (var n in this.style) t.push(n, ":", this.style[n]); - t.length && e.push(" style='", t.join(""), "'"), e.push(">"); + (t.length && e.push(" style='", t.join(""), "'"), e.push(">")); } return ( this.textContent && e.push(this.textContent), this.type != "fragment" && e.push(""), e.join("") ); - }); + })); var f = { createTextNode: function (e, t) { return e; @@ -49,7 +49,7 @@ define("ace/ext/static_highlight", [ }, }, l = function () { - (this.config = {}), (this.dom = f); + ((this.config = {}), (this.dom = f)); }; l.prototype = i.prototype; var c = function (e, t, n) { @@ -65,9 +65,9 @@ define("ace/ext/static_highlight", [ var h = e.childNodes[l]; h.nodeType == 3 ? ((f += h.data.length), (o += h.data)) : a.push(f, h); } - } else (o = e.textContent), t.trim && (o = o.trim()); + } else ((o = e.textContent), t.trim && (o = o.trim())); c.render(o, i, s, t.firstLineNumber, !t.showGutter, function (t) { - u.importCssString(t.css, "ace_highlight"), (e.innerHTML = t.html); + (u.importCssString(t.css, "ace_highlight"), (e.innerHTML = t.html)); var r = e.firstChild.firstChild; for (var i = 0; i < a.length; i += 2) { var s = t.session.doc.indexToPosition(a[i]), @@ -78,7 +78,7 @@ define("ace/ext/static_highlight", [ n && n(); }); }; - (c.render = function (e, t, n, i, s, u) { + ((c.render = function (e, t, n, i, s, u) { function h() { var r = c.renderSync(e, t, n, i, s); return u ? u(r) : r; @@ -88,7 +88,7 @@ define("ace/ext/static_highlight", [ typeof n == "string" && (a++, o.loadModule(["theme", n], function (e) { - (n = e), --a || h(); + ((n = e), --a || h()); })); var l; return ( @@ -97,7 +97,7 @@ define("ace/ext/static_highlight", [ (a++, o.loadModule(["mode", t], function (e) { if (!f[t] || l) f[t] = new e.Mode(l); - (t = f[t]), --a || h(); + ((t = f[t]), --a || h()); })), --a || h() ); @@ -105,37 +105,37 @@ define("ace/ext/static_highlight", [ (c.renderSync = function (e, t, n, i, o) { i = parseInt(i || 1, 10); var u = new r(""); - u.setUseWorker(!1), u.setMode(t); + (u.setUseWorker(!1), u.setMode(t)); var a = new l(); - a.setSession(u), + (a.setSession(u), Object.keys(a.$tabStrings).forEach(function (e) { if (typeof a.$tabStrings[e] == "string") { var t = f.createFragment(); - (t.textContent = a.$tabStrings[e]), (a.$tabStrings[e] = t); + ((t.textContent = a.$tabStrings[e]), (a.$tabStrings[e] = t)); } }), - u.setValue(e); + u.setValue(e)); var c = u.getLength(), h = f.createElement("div"); h.className = n.cssClass; var p = f.createElement("div"); - (p.className = "ace_static_highlight" + (o ? "" : " ace_show_gutter")), - (p.style["counter-reset"] = "ace_line " + (i - 1)); + ((p.className = "ace_static_highlight" + (o ? "" : " ace_show_gutter")), + (p.style["counter-reset"] = "ace_line " + (i - 1))); for (var d = 0; d < c; d++) { var v = f.createElement("div"); v.className = "ace_line"; if (!o) { var m = f.createElement("span"); - (m.className = "ace_gutter ace_gutter-cell"), + ((m.className = "ace_gutter ace_gutter-cell"), (m.textContent = ""), - v.appendChild(m); + v.appendChild(m)); } - a.$renderLine(v, d, !1), p.appendChild(v); + (a.$renderLine(v, d, !1), p.appendChild(v)); } - return h.appendChild(p), { css: s + n.cssText, html: h.toString(), session: u }; + return (h.appendChild(p), { css: s + n.cssText, html: h.toString(), session: u }); }), (n.exports = c), - (n.exports.highlight = c); + (n.exports.highlight = c)); }); (function () { window.require(["ace/ext/static_highlight"], function (m) { diff --git a/web/static/ace/ext-statusbar.js b/web/static/ace/ext-statusbar.js index 07a8316ae..99fd0052b 100644 --- a/web/static/ace/ext-statusbar.js +++ b/web/static/ace/ext-statusbar.js @@ -9,10 +9,10 @@ define("ace/ext/statusbar", [ var r = e("ace/lib/dom"), i = e("ace/lib/lang"), s = function (e, t) { - (this.element = r.createElement("div")), + ((this.element = r.createElement("div")), (this.element.className = "ace_status-indicator"), (this.element.style.cssText = "display: inline-block;"), - t.appendChild(this.element); + t.appendChild(this.element)); var n = i .delayedCall( function () { @@ -20,15 +20,15 @@ define("ace/ext/statusbar", [ }.bind(this), ) .schedule.bind(null, 100); - e.on("changeStatus", n), e.on("changeSelection", n), e.on("keyboardActivity", n); + (e.on("changeStatus", n), e.on("changeSelection", n), e.on("keyboardActivity", n)); }; - (function () { + ((function () { this.updateStatus = function (e) { function n(e, n) { e && t.push(e, n || "|"); } var t = []; - n(e.keyBinding.getStatusText(e)), e.commands.recording && n("REC"); + (n(e.keyBinding.getStatusText(e)), e.commands.recording && n("REC")); var r = e.selection, i = r.lead; if (!r.isEmpty()) { @@ -38,13 +38,13 @@ define("ace/ext/statusbar", [ " ", ); } - n(i.row + ":" + i.column, " "), + (n(i.row + ":" + i.column, " "), r.rangeCount && n("[" + r.rangeCount + "]", " "), t.pop(), - (this.element.textContent = t.join("")); + (this.element.textContent = t.join(""))); }; }).call(s.prototype), - (t.StatusBar = s); + (t.StatusBar = s)); }); (function () { window.require(["ace/ext/statusbar"], function (m) { diff --git a/web/static/ace/ext-textarea.js b/web/static/ace/ext-textarea.js index 28d80429b..2e3924e54 100644 --- a/web/static/ace/ext-textarea.js +++ b/web/static/ace/ext-textarea.js @@ -1,10 +1,10 @@ -define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { +(define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { "use strict"; - (t.isDark = !1), + ((t.isDark = !1), (t.cssClass = "ace-tm"), (t.cssText = '.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}'), - (t.$id = "ace/theme/textmate"); + (t.$id = "ace/theme/textmate")); var r = e("../lib/dom"); r.importCssString(t.cssText, t.cssClass); }), @@ -38,16 +38,16 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu ); var n = u(e, i, "width") || e.clientWidth + "px", r = u(e, i, "height") || e.clientHeight + "px"; - (t += "height:" + r + ";width:" + n + ";"), + ((t += "height:" + r + ";width:" + n + ";"), (t += "display:inline-block;"), - i.setAttribute("style", t); + i.setAttribute("style", t)); }; - r.addListener(window, "resize", s), s(), n.insertBefore(i, e.nextSibling); + (r.addListener(window, "resize", s), s(), n.insertBefore(i, e.nextSibling)); while (n !== document) { if (n.tagName.toUpperCase() === "FORM") { var o = n.onsubmit; n.onsubmit = function (n) { - (e.value = t()), o && o.call(this, n); + ((e.value = t()), o && o.call(this, n)); }; break; } @@ -68,14 +68,14 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu o = e.renderer; return ( (e.setDisplaySettings = function (t) { - t == null && (t = n.style.display == "none"), + (t == null && (t = n.style.display == "none"), t ? ((n.style.display = "block"), n.hideButton.focus(), e.on("focus", function r() { - e.removeListener("focus", r), (n.style.display = "none"); + (e.removeListener("focus", r), (n.style.display = "none")); })) - : e.focus(); + : e.focus()); }), (e.$setOption = e.setOption), (e.$getOption = e.getOption), @@ -146,9 +146,9 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu } e.push(""); } var s = null, @@ -227,11 +227,11 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu a = []; a.push(""); for (var l in t.defaultOptions) - a.push(""), + (a.push(""), a.push(""); - a.push("
    SettingValue
    ", o[l], "
    ", o[l], ""), f(a, l, u[l], i.getOption(l)), - a.push("
    "), (e.innerHTML = a.join("")); + a.push("")); + (a.push(""), (e.innerHTML = a.join(""))); var c = function (e) { var t = e.currentTarget; i.setOption(t.title, t.value); @@ -245,19 +245,19 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu var v = e.getElementsByTagName("input"); for (var d = 0; d < v.length; d++) v[d].onclick = h; var m = document.createElement("input"); - (m.type = "button"), + ((m.type = "button"), (m.value = "Hide"), r.addListener(m, "click", function () { i.setDisplaySettings(!1); }), e.appendChild(m), - (e.hideButton = m); + (e.hideButton = m)); } var r = e("../lib/event"), i = e("../lib/useragent"), s = e("../lib/net"), o = e("../ace"); - e("../theme/textmate"), (n.exports = t = o); + (e("../theme/textmate"), (n.exports = t = o)); var u = function (e, t, n) { var r = e.style[n]; r || @@ -267,15 +267,15 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu if (!r || r == "auto" || r == "intrinsic") r = t.style[n]; return r; }; - (t.transformTextarea = function (e, n) { + ((t.transformTextarea = function (e, n) { var s = e.autofocus || document.activeElement == e, u, l = f(e, function () { return u.getValue(); }); - (e.style.display = "none"), (l.style.background = "white"); + ((e.style.display = "none"), (l.style.background = "white")); var p = document.createElement("div"); - a(p, { + (a(p, { top: "0px", left: "0px", right: "0px", @@ -283,7 +283,7 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu border: "1px solid gray", position: "absolute", }), - l.appendChild(p); + l.appendChild(p)); var d = document.createElement("div"); a(d, { position: "absolute", @@ -309,19 +309,19 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu fontSize: "14px", boxShadow: "-5px 2px 3px gray", }; - i.isOldIE + (i.isOldIE ? (m.backgroundColor = "#333") : (m.backgroundColor = "rgba(0, 0, 0, 0.6)"), a(v, m), l.appendChild(v), - (n = n || t.defaultOptions); + (n = n || t.defaultOptions)); var g = o.edit(p); - (u = g.getSession()), + ((u = g.getSession()), u.setValue(e.value || e.innerHTML), s && g.focus(), l.appendChild(d), c(g, p, v, o, n), - h(v, d, g); + h(v, d, g)); var y = ""; return ( r.addListener(d, "mousemove", function (e) { @@ -345,9 +345,9 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu r.capture( d, function (e) { - (l.style.width = e.clientX - t.left + n + "px"), + ((l.style.width = e.clientX - t.left + n + "px"), (l.style.height = e.clientY - t.top + i + "px"), - g.resize(); + g.resize()); }, function () {}, ); @@ -365,9 +365,9 @@ define("ace/theme/textmate", ["require", "exports", "module", "ace/lib/dom"], fu showPrintMargin: "false", useSoftTabs: "true", showInvisibles: "false", - }); + })); }, - ); + )); (function () { window.require(["ace/ext/textarea"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/ext-themelist.js b/web/static/ace/ext-themelist.js index 145b08752..d89917b65 100644 --- a/web/static/ace/ext-themelist.js +++ b/web/static/ace/ext-themelist.js @@ -6,12 +6,12 @@ define("ace/ext/themelist", ["require", "exports", "module", "ace/lib/fixoldbrow "use strict"; e("ace/lib/fixoldbrowsers"); var r = [["Light"], ["Dark", "dark"]]; - (t.themesByName = {}), + ((t.themesByName = {}), (t.themes = r.map(function (e) { var n = e[1] || e[0].replace(/ /g, "_").toLowerCase(), r = { caption: e[0], theme: "ace/theme/" + n, isDark: e[2] == "dark", name: n }; - return (t.themesByName[n] = r), r; - })); + return ((t.themesByName[n] = r), r); + }))); }); (function () { window.require(["ace/ext/themelist"], function (m) { diff --git a/web/static/ace/ext-whitespace.js b/web/static/ace/ext-whitespace.js index 4d51a0639..fd907a090 100644 --- a/web/static/ace/ext-whitespace.js +++ b/web/static/ace/ext-whitespace.js @@ -1,7 +1,7 @@ define("ace/ext/whitespace", ["require", "exports", "module", "ace/lib/lang"], function (e, t, n) { "use strict"; var r = e("../lib/lang"); - (t.$detectIndentation = function (e, t) { + ((t.$detectIndentation = function (e, t) { function c(e) { var t = 0; for (var r = e; r < n.length; r += e) t += n[r] || 0; @@ -15,13 +15,13 @@ define("ace/ext/whitespace", ["require", "exports", "module", "ace/lib/lang"], f for (var u = 0; u < o; u++) { var a = e[u]; if (!/^\s*[^*+\-\s]/.test(a)) continue; - if (a[0] == " ") i++, (s = -Number.MAX_VALUE); + if (a[0] == " ") (i++, (s = -Number.MAX_VALUE)); else { var f = a.match(/^ */)[0].length; if (f && a[f] != " ") { var l = f - s; - l > 0 && !(s % l) && !(f % l) && (r[l] = (r[l] || 0) + 1), - (n[f] = (n[f] || 0) + 1); + (l > 0 && !(s % l) && !(f % l) && (r[l] = (r[l] || 0) + 1), + (n[f] = (n[f] || 0) + 1)); } s = f; } @@ -34,9 +34,9 @@ define("ace/ext/whitespace", ["require", "exports", "module", "ace/lib/lang"], f d = 0; for (var u = 1; u < 12; u++) { var v = c(u); - u == 1 ? ((d = v), (v = n[1] ? 0.9 : 0.8), n.length || (v = 0)) : (v /= d), + (u == 1 ? ((d = v), (v = n[1] ? 0.9 : 0.8), n.length || (v = 0)) : (v /= d), r[u] && (v += r[u] / h), - v > p.score && (p = { score: v, length: u }); + v > p.score && (p = { score: v, length: u })); } if (p.score && p.score > 1.4) var m = p.length; if (i > d + 1) { @@ -48,7 +48,7 @@ define("ace/ext/whitespace", ["require", "exports", "module", "ace/lib/lang"], f (t.detectIndentation = function (e) { var n = e.getLines(0, 1e3), r = t.$detectIndentation(n) || {}; - return r.ch && e.setUseSoftTabs(r.ch == " "), r.length && e.setTabSize(r.length), r; + return (r.ch && e.setUseSoftTabs(r.ch == " "), r.length && e.setTabSize(r.length), r); }), (t.trimTrailingSpace = function (e, t) { var n = e.getDocument(), @@ -70,17 +70,17 @@ define("ace/ext/whitespace", ["require", "exports", "module", "ace/lib/lang"], f for (var a = 0, f = r.length; a < f; a++) { var l = r[a], c = l.search(/\s+$/); - a == u && + (a == u && (c < s[o].column && c > i && (c = s[o].column), o++, (u = s[o] ? s[o].row : -1)), - c > i && n.removeInLine(a, c, l.length); + c > i && n.removeInLine(a, c, l.length)); } }), (t.convertIndentation = function (e, t, n) { var i = e.getTabString()[0], s = e.getTabSize(); - n || (n = s), t || (t = i); + (n || (n = s), t || (t = i)); var o = t == " " ? t : r.stringRepeat(t, n), u = e.doc, a = u.getAllLines(), @@ -94,19 +94,19 @@ define("ace/ext/whitespace", ["require", "exports", "module", "ace/lib/lang"], f m = Math.floor(v / s), g = v % s, y = f[m] || (f[m] = r.stringRepeat(o, m)); - (y += l[g] || (l[g] = r.stringRepeat(" ", g))), + ((y += l[g] || (l[g] = r.stringRepeat(" ", g))), y != d && (u.removeInLine(c, 0, d.length), - u.insertInLine({ row: c, column: 0 }, y)); + u.insertInLine({ row: c, column: 0 }, y))); } } - e.setTabSize(n), e.setUseSoftTabs(t == " "); + (e.setTabSize(n), e.setUseSoftTabs(t == " ")); }), (t.$parseStringArg = function (e) { var t = {}; /t/.test(e) ? (t.ch = " ") : /s/.test(e) && (t.ch = " "); var n = e.match(/\d+/); - return n && (t.length = parseInt(n[0], 10)), t; + return (n && (t.length = parseInt(n[0], 10)), t); }), (t.$parseArg = function (e) { return e @@ -141,11 +141,11 @@ define("ace/ext/whitespace", ["require", "exports", "module", "ace/lib/lang"], f name: "setIndentation", exec: function (e, n) { var r = t.$parseArg(n); - r.length && e.session.setTabSize(r.length), - r.ch && e.session.setUseSoftTabs(r.ch == " "); + (r.length && e.session.setTabSize(r.length), + r.ch && e.session.setUseSoftTabs(r.ch == " ")); }, }, - ]); + ])); }); (function () { window.require(["ace/ext/whitespace"], function (m) { diff --git a/web/static/ace/keybinding-emacs.js b/web/static/ace/keybinding-emacs.js index c41c8295b..4d8d6cf94 100644 --- a/web/static/ace/keybinding-emacs.js +++ b/web/static/ace/keybinding-emacs.js @@ -1,4 +1,4 @@ -define( +(define( "ace/occur", [ "require", @@ -19,25 +19,25 @@ define( s = e("./search").Search, o = e("./edit_session").EditSession, u = e("./search_highlight").SearchHighlight; - r.inherits(a, s), + (r.inherits(a, s), function () { - (this.enter = function (e, t) { + ((this.enter = function (e, t) { if (!t.needle) return !1; var n = e.getCursorPosition(); this.displayOccurContent(e, t); var r = this.originalToOccurPosition(e.session, n); - return e.moveCursorToPosition(r), !0; + return (e.moveCursorToPosition(r), !0); }), (this.exit = function (e, t) { var n = t.translatePosition && e.getCursorPosition(), r = n && this.occurToOriginalPosition(e.session, n); - return this.displayOriginalContent(e), r && e.moveCursorToPosition(r), !0; + return (this.displayOriginalContent(e), r && e.moveCursorToPosition(r), !0); }), (this.highlight = function (e, t) { var n = (e.$occurHighlight = e.$occurHighlight || e.addDynamicMarker(new u(null, "ace_occur-highlight", "text"))); - n.setRegexp(t), e._emit("changeBackMarker"); + (n.setRegexp(t), e._emit("changeBackMarker")); }), (this.displayOccurContent = function (e, t) { this.$originalSession = e.session; @@ -46,19 +46,19 @@ define( return e.content; }), i = new o(r.join("\n")); - (i.$occur = this), + ((i.$occur = this), (i.$occurMatchingLines = n), e.setSession(i), (this.$useEmacsStyleLineStart = this.$originalSession.$useEmacsStyleLineStart), (i.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart), this.highlight(i, t.re), - i._emit("changeBackMarker"); + i._emit("changeBackMarker")); }), (this.displayOriginalContent = function (e) { - e.setSession(this.$originalSession), + (e.setSession(this.$originalSession), (this.$originalSession.$useEmacsStyleLineStart = - this.$useEmacsStyleLineStart); + this.$useEmacsStyleLineStart)); }), (this.originalToOccurPosition = function (e, t) { var n = e.$occurMatchingLines, @@ -86,14 +86,14 @@ define( : t.concat({ row: r, content: e.getLine(r) }); }, []) ); - }); - }.call(a.prototype); + })); + }.call(a.prototype)); var f = e("./lib/dom"); - f.importCssString( + (f.importCssString( ".ace_occur-highlight {\n border-radius: 4px;\n background-color: rgba(87, 255, 8, 0.25);\n position: absolute;\n z-index: 4;\n box-sizing: border-box;\n box-shadow: 0 0 4px rgb(91, 255, 50);\n}\n.ace_dark .ace_occur-highlight {\n background-color: rgb(80, 140, 85);\n box-shadow: 0 0 4px rgb(60, 120, 70);\n}\n", "incremental-occur-highlighting", ), - (t.Occur = a); + (t.Occur = a)); }, ), define( @@ -127,7 +127,7 @@ define( exec: function (e) { var t = e.session.$occur; if (!t) return; - t.exit(e, {}), e.session.$occur || f.uninstallFrom(e); + (t.exit(e, {}), e.session.$occur || f.uninstallFrom(e)); }, readOnly: !0, }, @@ -137,20 +137,20 @@ define( exec: function (e) { var t = e.session.$occur; if (!t) return; - t.exit(e, { translatePosition: !0 }), - e.session.$occur || f.uninstallFrom(e); + (t.exit(e, { translatePosition: !0 }), + e.session.$occur || f.uninstallFrom(e)); }, readOnly: !0, }, ], u = e("../keyboard/hash_handler").HashHandler, a = e("../lib/oop"); - a.inherits(f, u), + (a.inherits(f, u), function () { - (this.isOccurHandler = !0), + ((this.isOccurHandler = !0), (this.attach = function (e) { - u.call(this, o, e.commands.platform), (this.$editor = e); - }); + (u.call(this, o, e.commands.platform), (this.$editor = e)); + })); var e = this.handleKeyboard; this.handleKeyboard = function (t, n, r, i) { var s = e.call(this, t, n, r, i); @@ -159,14 +159,14 @@ define( }.call(f.prototype), (f.installIn = function (e) { var t = new this(); - e.keyBinding.addKeyboardHandler(t), e.commands.addCommands(o); + (e.keyBinding.addKeyboardHandler(t), e.commands.addCommands(o)); }), (f.uninstallFrom = function (e) { e.commands.removeCommands(o); var t = e.getKeyboardHandler(); t.isOccurHandler && e.keyBinding.removeKeyboardHandler(t); }), - (t.occurStartCommand = s); + (t.occurStartCommand = s)); }, ), define( @@ -188,14 +188,14 @@ define( i = e("../lib/oop"), s = e("../keyboard/hash_handler").HashHandler, o = e("./occur_commands").occurStartCommand; - (t.iSearchStartCommands = [ + ((t.iSearchStartCommands = [ { name: "iSearch", bindKey: { win: "Ctrl-F", mac: "Command-F" }, exec: function (e, t) { r.loadModule(["core", "ace/incremental_search"], function (n) { var r = (n.iSearch = n.iSearch || new n.IncrementalSearch()); - r.activate(e, t.backwards), t.jumpToFirstMatch && r.next(t); + (r.activate(e, t.backwards), t.jumpToFirstMatch && r.next(t)); }); }, readOnly: !0, @@ -243,14 +243,14 @@ define( name: "searchForward", bindKey: { win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G" }, exec: function (e, t) { - (t.useCurrentOrPrevSearch = !0), e.next(t); + ((t.useCurrentOrPrevSearch = !0), e.next(t)); }, }, { name: "searchBackward", bindKey: { win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G" }, exec: function (e, t) { - (t.useCurrentOrPrevSearch = !0), (t.backwards = !0), e.next(t); + ((t.useCurrentOrPrevSearch = !0), (t.backwards = !0), e.next(t)); }, }, { @@ -292,7 +292,7 @@ define( bindKey: "Ctrl-O", exec: function (e) { var t = i.mixin({}, e.$options); - e.deactivate(), o.exec(e.$editor, t); + (e.deactivate(), o.exec(e.$editor, t)); }, }, { @@ -338,7 +338,7 @@ define( return e.concat(t ? t : []); }, []) : []; - e.deactivate(!1), r.forEach(t.selection.addRange.bind(t.selection)); + (e.deactivate(!1), r.forEach(t.selection.addRange.bind(t.selection))); }, }, { @@ -358,15 +358,15 @@ define( })), i.inherits(u, s), function () { - (this.attach = function (e) { + ((this.attach = function (e) { var n = this.$iSearch; - s.call(this, t.iSearchCommands, e.commands.platform), + (s.call(this, t.iSearchCommands, e.commands.platform), (this.$commandExecHandler = e.commands.addEventListener( "exec", function (t) { if (!t.command.isIncrementalSearchCommand) return n.deactivate(); - t.stopPropagation(), t.preventDefault(); + (t.stopPropagation(), t.preventDefault()); var r = e.session.getScrollTop(), i = t.command.exec(n, t.args || {}); return ( @@ -375,13 +375,13 @@ define( i ); }, - )); + ))); }), (this.detach = function (e) { if (!this.$commandExecHandler) return; - e.commands.removeEventListener("exec", this.$commandExecHandler), - delete this.$commandExecHandler; - }); + (e.commands.removeEventListener("exec", this.$commandExecHandler), + delete this.$commandExecHandler); + })); var e = this.handleKeyboard; this.handleKeyboard = function (t, n, r, i) { if (((n === 1 || n === 8) && r === "v") || (n === 1 && r === "y")) @@ -395,7 +395,7 @@ define( return !1; }; }.call(u.prototype), - (t.IncrementalSearchKeyboardHandler = u); + (t.IncrementalSearchKeyboardHandler = u)); }, ), define( @@ -417,8 +417,8 @@ define( function (e, t, n) { "use strict"; function f() { - (this.$options = { wrap: !1, skipCurrent: !1 }), - (this.$keyboardHandler = new a(this)); + ((this.$options = { wrap: !1, skipCurrent: !1 }), + (this.$keyboardHandler = new a(this))); } function l(e) { return e instanceof RegExp; @@ -445,10 +445,10 @@ define( o = e("./search_highlight").SearchHighlight, u = e("./commands/incremental_search_commands"), a = u.IncrementalSearchKeyboardHandler; - r.inherits(f, s), + (r.inherits(f, s), function () { - (this.activate = function (e, t) { - (this.$editor = e), + ((this.activate = function (e, t) { + ((this.$editor = e), (this.$startPos = this.$currentPos = e.getCursorPosition()), (this.$options.needle = ""), (this.$options.backwards = t), @@ -460,17 +460,17 @@ define( this.onMouseDown.bind(this), )), this.selectionFix(e), - this.statusMessage(!0); + this.statusMessage(!0)); }), (this.deactivate = function (e) { this.cancelSearch(e); var t = this.$editor; - t.keyBinding.removeKeyboardHandler(this.$keyboardHandler), + (t.keyBinding.removeKeyboardHandler(this.$keyboardHandler), this.$mousedownHandler && (t.removeEventListener("mousedown", this.$mousedownHandler), delete this.$mousedownHandler), (t.onPaste = this.$originalEditorOnPaste), - this.message(""); + this.message("")); }), (this.selectionFix = function (e) { e.selection.isEmpty() && !e.session.$emacsMark && e.clearSelection(); @@ -480,7 +480,7 @@ define( n = (t.$isearchHighlight = t.$isearchHighlight || t.addDynamicMarker(new o(null, "ace_isearch-result", "text"))); - n.setRegexp(e), t._emit("changeBackMarker"); + (n.setRegexp(e), t._emit("changeBackMarker")); }), (this.cancelSearch = function (e) { var t = this.$editor; @@ -500,7 +500,7 @@ define( var n = this.$options; t && (n.needle = t.call(this, n.needle || "") || ""); if (n.needle.length === 0) - return this.statusMessage(!0), this.cancelSearch(!0); + return (this.statusMessage(!0), this.cancelSearch(!0)); n.start = this.$currentPos; var r = this.$editor.session, s = this.find(r), @@ -523,7 +523,7 @@ define( return this.highlightAndFindWithNeedle(!1, function (t) { if (!l(t)) return t + e; var n = c(t); - return (n.expression += e), p(n); + return ((n.expression += e), p(n)); }); }), (this.removeChar = function (e) { @@ -552,7 +552,7 @@ define( ); }), (this.onMouseDown = function (e) { - return this.deactivate(), !0; + return (this.deactivate(), !0); }), (this.onPaste = function (e) { this.addString(e); @@ -570,18 +570,18 @@ define( (this.statusMessage = function (e) { var t = this.$options, n = ""; - (n += t.backwards ? "reverse-" : ""), + ((n += t.backwards ? "reverse-" : ""), (n += "isearch: " + t.needle), (n += e ? "" : " (not found)"), - this.message(n); + this.message(n)); }), (this.message = function (e) { this.$editor.showCommandLine ? (this.$editor.showCommandLine(e), this.$editor.focus()) : console.log(e); - }); + })); }.call(f.prototype), - (t.IncrementalSearch = f); + (t.IncrementalSearch = f)); var d = e("./lib/dom"); d.importCssString && d.importCssString( @@ -602,10 +602,10 @@ define( e("./config").defineOptions(m.prototype, "editor", { useIncrementalSearch: { set: function (e) { - this.keyBinding.$handlers.forEach(function (t) { + (this.keyBinding.$handlers.forEach(function (t) { t.setupIncrementalSearch && t.setupIncrementalSearch(this, e); }), - this._emit("incrementalSearchSettingChanged", { isEnabled: e }); + this._emit("incrementalSearchSettingChanged", { isEnabled: e })); }, }, }); @@ -629,12 +629,14 @@ define( e("../incremental_search"); var i = e("../commands/incremental_search_commands"), s = e("./hash_handler").HashHandler; - (t.handler = new s()), (t.handler.isEmacs = !0), (t.handler.$id = "ace/keyboard/emacs"); + ((t.handler = new s()), + (t.handler.isEmacs = !0), + (t.handler.$id = "ace/keyboard/emacs")); var o = !1, u, a; - (t.handler.attach = function (e) { - o || + ((t.handler.attach = function (e) { + (o || ((o = !0), r.importCssString( " .emacs-mode .ace_cursor{ border: 1px rgba(50,250,50,0.8) solid!important; box-sizing: border-box!important; background-color: rgba(0,250,0,0.9); opacity: 0.5; } .emacs-mode .ace_hidden-cursors .ace_cursor{ opacity: 1; background-color: transparent; } .emacs-mode .ace_overwrite-cursors .ace_cursor { opacity: 1; background-color: transparent; border-width: 0 0 2px 2px !important; } .emacs-mode .ace_text-layer { z-index: 4 } .emacs-mode .ace_cursor-layer { z-index: 2 }", @@ -654,8 +656,8 @@ define( }), (e.pushEmacsMark = function (e, t) { var n = this.session.$emacsMark; - n && this.session.$emacsMarkRing.push(n), - !e || t ? this.setEmacsMark(e) : this.session.$emacsMarkRing.push(e); + (n && this.session.$emacsMarkRing.push(n), + !e || t ? this.setEmacsMark(e) : this.session.$emacsMarkRing.push(e)); }), (e.popEmacsMark = function () { var e = this.emacsMark(); @@ -671,7 +673,10 @@ define( i = this.session.$emacsMarkRing, s = i.length - (n - r), o = i[s] || t.anchor; - return e && i.splice(s, 1, "row" in e && "column" in e ? e : undefined), o; + return ( + e && i.splice(s, 1, "row" in e && "column" in e ? e : undefined), + o + ); }), e.on("click", l), e.on("changeSession", f), @@ -681,10 +686,10 @@ define( (t.handler.platform = e.commands.platform), (e.$emacsModeHandler = this), e.addEventListener("copy", this.onCopy), - e.addEventListener("paste", this.onPaste); + e.addEventListener("paste", this.onPaste)); }), (t.handler.detach = function (e) { - (e.renderer.$blockCursor = !1), + ((e.renderer.$blockCursor = !1), (e.session.$selectLongWords = u), (e.session.$useEmacsStyleLineStart = a), e.removeEventListener("click", l), @@ -693,10 +698,10 @@ define( e.commands.removeCommands(d), e.removeEventListener("copy", this.onCopy), e.removeEventListener("paste", this.onPaste), - (e.$emacsModeHandler = null); - }); + (e.$emacsModeHandler = null)); + })); var f = function (e) { - e.oldSession && + (e.oldSession && ((e.oldSession.$selectLongWords = u), (e.oldSession.$useEmacsStyleLineStart = a)), (u = e.session.$selectLongWords), @@ -705,7 +710,7 @@ define( (e.session.$useEmacsStyleLineStart = !0), e.session.hasOwnProperty("$emacsMark") || (e.session.$emacsMark = null), e.session.hasOwnProperty("$emacsMarkRing") || - (e.session.$emacsMarkRing = []); + (e.session.$emacsMarkRing = [])); }, l = function (e) { e.editor.session.$emacsMark = null; @@ -729,18 +734,18 @@ define( "S", "C", ]; - p.forEach(function (e) { + (p.forEach(function (e) { var t = 0; - e.split("-").forEach(function (e) { + (e.split("-").forEach(function (e) { t |= c[h[e]]; }), - (h[t] = e.toLowerCase() + "-"); + (h[t] = e.toLowerCase() + "-")); }), (t.handler.onCopy = function (e, n) { if (n.$handlesEmacsOnCopy) return; - (n.$handlesEmacsOnCopy = !0), + ((n.$handlesEmacsOnCopy = !0), t.handler.commands.killRingSave.exec(n), - (n.$handlesEmacsOnCopy = !1); + (n.$handlesEmacsOnCopy = !1)); }), (t.handler.onPaste = function (e, t) { t.pushEmacsMark(t.getCursorPosition()); @@ -750,7 +755,7 @@ define( if (!e) return; var n = this.commandKeyBinding; e.split("|").forEach(function (e) { - (e = e.toLowerCase()), (n[e] = t); + ((e = e.toLowerCase()), (n[e] = t)); var r = e.split(" ").slice(0, -1); r.reduce(function (e, t, n) { var r = e[n - 1] ? e[n - 1] + " " : ""; @@ -762,7 +767,7 @@ define( }), (t.handler.getStatusText = function (e, t) { var n = ""; - return t.count && (n += t.count), t.keyChain && (n += " " + t.keyChain), n; + return (t.count && (n += t.count), t.keyChain && (n += " " + t.keyChain), n); }), (t.handler.handleKeyboard = function (e, t, n, r) { if (r === -1) return undefined; @@ -772,7 +777,7 @@ define( i.pushEmacsMark(); if (e.count) { var s = new Array(e.count + 1).join(n); - return (e.count = null), { command: "insertstring", args: s }; + return ((e.count = null), { command: "insertstring", args: s }); } } var o = h[t]; @@ -785,25 +790,25 @@ define( { command: "null" } ); } - o && (n = o + n), e.keyChain && (n = e.keyChain += " " + n); + (o && (n = o + n), e.keyChain && (n = e.keyChain += " " + n)); var a = this.commandKeyBinding[n]; e.keyChain = a == "null" ? n : ""; if (!a) return undefined; if (a === "null") return { command: "null" }; - if (a === "universalArgument") return (e.count = -4), { command: "null" }; + if (a === "universalArgument") return ((e.count = -4), { command: "null" }); var f; typeof a != "string" && ((f = a.args), a.command && (a = a.command), a === "goorselect" && ((a = i.emacsMark() ? f[1] : f[0]), (f = null))); if (typeof a == "string") { - (a === "insertstring" || a === "splitline" || a === "togglecomment") && + ((a === "insertstring" || a === "splitline" || a === "togglecomment") && i.pushEmacsMark(), - (a = this.commands[a] || i.commands.commands[a]); + (a = this.commands[a] || i.commands.commands[a])); if (!a) return undefined; } - !a.readOnly && !a.isYank && (e.lastCommand = null), - !a.readOnly && i.emacsMark() && i.setEmacsMark(null); + (!a.readOnly && !a.isYank && (e.lastCommand = null), + !a.readOnly && i.emacsMark() && i.setEmacsMark(null)); if (e.count) { var u = e.count; e.count = 0; @@ -817,7 +822,7 @@ define( multiSelectAction: a.multiSelectAction, }, }; - f || (f = {}), typeof f == "object" && (f.count = u); + (f || (f = {}), typeof f == "object" && (f.count = u)); } return { command: a, args: f }; }), @@ -901,12 +906,12 @@ define( n = t.$cursorLayer.getPixelPosition(), r = t.$size.scrollerHeight - t.lineHeight, i = t.scrollTop; - Math.abs(n.top - i) < 2 + (Math.abs(n.top - i) < 2 ? (i = n.top - r) : Math.abs(n.top - i - r * 0.5) < 2 ? (i = n.top) : (i = n.top - r * 0.5), - e.session.setScrollTop(i); + e.session.setScrollTop(i)); }, selectRectangularRegion: function (e) { e.multiSelect.toggleBlockSelection(); @@ -918,7 +923,7 @@ define( t && e.moveCursorToPosition(t); } if (t && t.count) { - e.inMultiSelectMode ? e.forEachSelection(u) : u(), u(); + (e.inMultiSelectMode ? e.forEachSelection(u) : u(), u()); return; } var n = e.emacsMark(), @@ -931,17 +936,17 @@ define( return e.isEmpty(); }); if (s && (n || !o)) { - e.inMultiSelectMode + (e.inMultiSelectMode ? e.forEachSelection({ exec: e.clearSelection.bind(e) }) : e.clearSelection(), - n && e.pushEmacsMark(null); + n && e.pushEmacsMark(null)); return; } if (!n) { - i.forEach(function (t) { + (i.forEach(function (t) { e.pushEmacsMark(t); }), - e.setEmacsMark(i[i.length - 1]); + e.setEmacsMark(i[i.length - 1])); return; } }, @@ -957,8 +962,8 @@ define( } if (n.count) { var i = { row: r.lead.row, column: r.lead.column }; - r.clearSelection(), - r.moveCursorToPosition(t.emacsMarkForSelection(i)); + (r.clearSelection(), + r.moveCursorToPosition(t.emacsMarkForSelection(i))); } else r.selectToPosition(t.emacsMarkForSelection()); }, readOnly: !0, @@ -967,48 +972,48 @@ define( }, killWord: { exec: function (e, n) { - e.clearSelection(), + (e.clearSelection(), n == "left" ? e.selection.selectWordLeft() - : e.selection.selectWordRight(); + : e.selection.selectWordRight()); var r = e.getSelectionRange(), i = e.session.getTextRange(r); - t.killRing.add(i), e.session.remove(r), e.clearSelection(); + (t.killRing.add(i), e.session.remove(r), e.clearSelection()); }, multiSelectAction: "forEach", }, killLine: function (e) { - e.pushEmacsMark(null), e.clearSelection(); + (e.pushEmacsMark(null), e.clearSelection()); var n = e.getSelectionRange(), r = e.session.getLine(n.start.row); - (n.end.column = r.length), (r = r.substr(n.start.column)); + ((n.end.column = r.length), (r = r.substr(n.start.column))); var i = e.session.getFoldLine(n.start.row); - i && n.end.row != i.end.row && ((n.end.row = i.end.row), (r = "x")), + (i && n.end.row != i.end.row && ((n.end.row = i.end.row), (r = "x")), /^\s*$/.test(r) && (n.end.row++, (r = e.session.getLine(n.end.row)), - (n.end.column = /^\s*$/.test(r) ? r.length : 0)); + (n.end.column = /^\s*$/.test(r) ? r.length : 0))); var s = e.session.getTextRange(n); - e.prevOp.command == this ? t.killRing.append(s) : t.killRing.add(s), + (e.prevOp.command == this ? t.killRing.append(s) : t.killRing.add(s), e.session.remove(n), - e.clearSelection(); + e.clearSelection()); }, yank: function (e) { - e.onPaste(t.killRing.get() || ""), - (e.keyBinding.$data.lastCommand = "yank"); + (e.onPaste(t.killRing.get() || ""), + (e.keyBinding.$data.lastCommand = "yank")); }, yankRotate: function (e) { if (e.keyBinding.$data.lastCommand != "yank") return; - e.undo(), + (e.undo(), e.session.$emacsMarkRing.pop(), e.onPaste(t.killRing.rotate()), - (e.keyBinding.$data.lastCommand = "yank"); + (e.keyBinding.$data.lastCommand = "yank")); }, killRegion: { exec: function (e) { - t.killRing.add(e.getCopyText()), + (t.killRing.add(e.getCopyText()), e.commands.byName.cut.exec(e), - e.setEmacsMark(null); + e.setEmacsMark(null)); }, readOnly: !0, multiSelectAction: "forEach", @@ -1018,44 +1023,44 @@ define( e.$handlesEmacsOnCopy = !0; var n = e.session.$emacsMarkRing.slice(), r = []; - t.killRing.add(e.getCopyText()), + (t.killRing.add(e.getCopyText()), setTimeout(function () { function t() { var t = e.selection, n = t.getRange(), i = t.isBackwards() ? n.end : n.start; - r.push({ row: i.row, column: i.column }), - t.clearSelection(); + (r.push({ row: i.row, column: i.column }), + t.clearSelection()); } - (e.$handlesEmacsOnCopy = !1), + ((e.$handlesEmacsOnCopy = !1), e.inMultiSelectMode ? e.forEachSelection({ exec: t }) : t(), - (e.session.$emacsMarkRing = n.concat(r.reverse())); - }, 0); + (e.session.$emacsMarkRing = n.concat(r.reverse()))); + }, 0)); }, readOnly: !0, }, keyboardQuit: function (e) { - e.selection.clearSelection(), + (e.selection.clearSelection(), e.setEmacsMark(null), - (e.keyBinding.$data.count = null); + (e.keyBinding.$data.count = null)); }, focusCommandLine: function (e, t) { e.showCommandLine && e.showCommandLine(t); }, }), - t.handler.addCommands(i.iSearchStartCommands); + t.handler.addCommands(i.iSearchStartCommands)); var d = t.handler.commands; - (d.yank.isYank = !0), + ((d.yank.isYank = !0), (d.yankRotate.isYank = !0), (t.killRing = { $data: [], add: function (e) { - e && this.$data.push(e), this.$data.length > 30 && this.$data.shift(); + (e && this.$data.push(e), this.$data.length > 30 && this.$data.shift()); }, append: function (e) { var t = this.$data.length - 1, n = this.$data[t] || ""; - e && (n += e), n && (this.$data[t] = n); + (e && (n += e), n && (this.$data[t] = n)); }, get: function (e) { return ( @@ -1067,14 +1072,14 @@ define( ); }, pop: function () { - return this.$data.length > 1 && this.$data.pop(), this.get(); + return (this.$data.length > 1 && this.$data.pop(), this.get()); }, rotate: function () { - return this.$data.unshift(this.$data.pop()), this.get(); + return (this.$data.unshift(this.$data.pop()), this.get()); }, - }); + })); }, - ); + )); (function () { window.require(["ace/keyboard/emacs"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/keybinding-vim.js b/web/static/ace/keybinding-vim.js index 71dc000c7..669cdf919 100644 --- a/web/static/ace/keybinding-vim.js +++ b/web/static/ace/keybinding-vim.js @@ -47,26 +47,26 @@ define("ace/keyboard/vim", [ return new E(e.row, e.column); } function x(e) { - e.setOption("disableInput", !0), + (e.setOption("disableInput", !0), e.setOption("showCursorWhenSelecting", !1), v.signal(e, "vim-mode-change", { mode: "normal" }), e.on("cursorActivity", Gn), tt(e), - v.on(e.getInputField(), "paste", M(e)); + v.on(e.getInputField(), "paste", M(e))); } function T(e) { - e.setOption("disableInput", !1), + (e.setOption("disableInput", !1), e.off("cursorActivity", Gn), v.off(e.getInputField(), "paste", M(e)), - (e.state.vim = null); + (e.state.vim = null)); } function N(e, t) { - this == v.keyMap.vim && v.rmClass(e.getWrapperElement(), "cm-fat-cursor"), - (!t || t.attach != C) && T(e); + (this == v.keyMap.vim && v.rmClass(e.getWrapperElement(), "cm-fat-cursor"), + (!t || t.attach != C) && T(e)); } function C(e, t) { - this == v.keyMap.vim && v.addClass(e.getWrapperElement(), "cm-fat-cursor"), - (!t || t.attach != C) && x(e); + (this == v.keyMap.vim && v.addClass(e.getWrapperElement(), "cm-fat-cursor"), + (!t || t.attach != C) && x(e)); } function k(e, t) { if (!t) return undefined; @@ -74,7 +74,7 @@ define("ace/keyboard/vim", [ var n = O(e); if (!n) return !1; var r = v.Vim.findKey(t, n); - return typeof r == "function" && v.signal(t, "vim-keypress", n), r; + return (typeof r == "function" && v.signal(t, "vim-keypress", n), r); } function O(e) { if (e.charAt(0) == "'") return e.charAt(1); @@ -85,7 +85,7 @@ define("ace/keyboard/vim", [ var r = !1; for (var i = 0; i < t.length; i++) { var s = t[i]; - s in L ? (t[i] = L[s]) : (r = !0), s in A && (t[i] = A[s]); + (s in L ? (t[i] = L[s]) : (r = !0), s in A && (t[i] = A[s])); } return r ? (X(n) && (t[t.length - 1] = n.toLowerCase()), "<" + t.join("-") + ">") : !1; } @@ -130,7 +130,7 @@ define("ace/keyboard/vim", [ function K(e, t, n, r, i) { if (t === undefined && !i) throw Error("defaultValue is required unless callback is provided"); - n || (n = "string"), (J[e] = { type: n, defaultValue: t, callback: i }); + (n || (n = "string"), (J[e] = { type: n, defaultValue: t, callback: i })); if (r) for (var s = 0; s < r.length; s++) J[r[s]] = J[e]; t && Q(e, t); } @@ -163,12 +163,12 @@ define("ace/keyboard/vim", [ return (s || (i !== "local" && r) || {}).value; } function et() { - (this.latestRegister = undefined), + ((this.latestRegister = undefined), (this.isPlaying = !1), (this.isRecording = !1), (this.replaySearchQueries = []), (this.onRecordingDone = undefined), - (this.lastInsertModeChanges = Z()); + (this.lastInsertModeChanges = Z())); } function tt(e) { return ( @@ -213,40 +213,40 @@ define("ace/keyboard/vim", [ } } function ot() { - (this.prefixRepeat = []), + ((this.prefixRepeat = []), (this.motionRepeat = []), (this.operator = null), (this.operatorArgs = null), (this.motion = null), (this.motionArgs = null), (this.keyBuffer = []), - (this.registerName = null); + (this.registerName = null)); } function ut(e, t) { - (e.state.vim.inputState = new ot()), v.signal(e, "vim-command-done", t); + ((e.state.vim.inputState = new ot()), v.signal(e, "vim-command-done", t)); } function at(e, t, n) { - this.clear(), + (this.clear(), (this.keyBuffer = [e || ""]), (this.insertModeChanges = []), (this.searchQueries = []), (this.linewise = !!t), - (this.blockwise = !!n); + (this.blockwise = !!n)); } function ft(e, t) { var n = nt.registerController.registers; if (!e || e.length != 1) throw Error("Register name must be 1 character"); - (n[e] = t), q.push(e); + ((n[e] = t), q.push(e)); } function lt(e) { - (this.registers = e), + ((this.registers = e), (this.unnamedRegister = e['"'] = new at()), (e["."] = new at()), (e[":"] = new at()), - (e["/"] = new at()); + (e["/"] = new at())); } function ct() { - (this.historyBuffer = []), (this.iterator = 0), (this.initialPrefix = null); + ((this.historyBuffer = []), (this.iterator = 0), (this.initialPrefix = null)); } function dt(e, t) { pt[e] = t; @@ -275,7 +275,7 @@ define("ace/keyboard/vim", [ return t; } function St(e, t, n) { - return typeof t == "object" && ((n = t.ch), (t = t.line)), E(e.line + t, e.ch + n); + return (typeof t == "object" && ((n = t.ch), (t = t.line)), E(e.line + t, e.ch + n)); } function xt(e, t) { return { line: t.line - e.line, ch: t.line - e.line }; @@ -293,7 +293,7 @@ define("ace/keyboard/vim", [ !(i = Nt(e, a.keys)) ) continue; - i == "partial" && s.push(a), i == "full" && o.push(a); + (i == "partial" && s.push(a), i == "full" && o.push(a)); } return { partial: s.length && s, full: o.length && o }; } @@ -367,7 +367,7 @@ define("ace/keyboard/vim", [ function jt(e, t, n) { var r = Pt(e, t), i = new Array(n - r + 1).join(" "); - e.setCursor(E(t, r)), e.replaceRange(i, e.getCursor()); + (e.setCursor(E(t, r)), e.replaceRange(i, e.getCursor())); } function Ft(e, t) { var n = [], @@ -395,7 +395,7 @@ define("ace/keyboard/vim", [ var b = { anchor: new E(y, d), head: new E(y, v) }; n.push(b); } - return e.setSelections(n), (t.ch = v), (c.ch = d), c; + return (e.setSelections(n), (t.ch = v), (c.ch = d), c); } function It(e, t, n) { var r = []; @@ -444,9 +444,9 @@ define("ace/keyboard/vim", [ p = n.headMark.find(), d = p.line - h.line, v = p.ch - h.ch; - (r = { line: r.line + d, ch: d ? r.ch : v + r.ch }), + ((r = { line: r.line + d, ch: d ? r.ch : v + r.ch }), n.visualLine && ((t = E(t.line, 0)), (r = E(r.line, Pt(e, r.line)))), - e.setSelection(t, r); + e.setSelection(t, r)); } return [t, r]; }; @@ -455,7 +455,7 @@ define("ace/keyboard/vim", [ function Ut(e, t) { var n = t.sel.anchor, r = t.sel.head; - t.lastPastedText && + (t.lastPastedText && ((r = e.posFromIndex(e.indexFromPos(n) + t.lastPastedText.length)), (t.lastPastedText = null)), (t.lastSelection = { @@ -466,7 +466,7 @@ define("ace/keyboard/vim", [ visualMode: t.visualMode, visualLine: t.visualLine, visualBlock: t.visualBlock, - }); + })); } function zt(e, t, n) { var r = e.state.vim.sel, @@ -489,7 +489,7 @@ define("ace/keyboard/vim", [ t = t || r.sel; var n = n || r.visualLine ? "line" : r.visualBlock ? "block" : "char", i = Xt(e, t, n); - e.setSelections(i.ranges, i.primary), Yn(e); + (e.setSelections(i.ranges, i.primary), Yn(e)); } function Xt(e, t, n, r) { var i = Lt(t.head), @@ -507,8 +507,8 @@ define("ace/keyboard/vim", [ if (!Ot(t.head, t.anchor)) { s.ch = 0; var a = e.lastLine(); - i.line > a && (i.line = a), (i.ch = Pt(e, i.line)); - } else (i.ch = 0), (s.ch = Pt(e, s.line)); + (i.line > a && (i.line = a), (i.ch = Pt(e, i.line))); + } else ((i.ch = 0), (s.ch = Pt(e, s.line))); return { ranges: [{ anchor: s, head: i }], primary: 0 }; } if (n == "block") { @@ -525,17 +525,17 @@ define("ace/keyboard/vim", [ } function Vt(e) { var t = e.getCursor("head"); - return e.getSelection().length == 1 && (t = Mt(t, e.getCursor("anchor"))), t; + return (e.getSelection().length == 1 && (t = Mt(t, e.getCursor("anchor"))), t); } function $t(e, t) { var n = e.state.vim; - t !== !1 && e.setCursor(wt(e, n.sel.head)), + (t !== !1 && e.setCursor(wt(e, n.sel.head)), Ut(e, n), (n.visualMode = !1), (n.visualLine = !1), (n.visualBlock = !1), v.signal(e, "vim-mode-change", { mode: "normal" }), - n.fakeCursor && n.fakeCursor.clear(); + n.fakeCursor && n.fakeCursor.clear()); } function Jt(e, t, n) { var r = e.getRange(t, n); @@ -543,12 +543,12 @@ define("ace/keyboard/vim", [ var i = r.split("\n"); i.pop(); var s; - for (var s = i.pop(); i.length > 0 && s && V(s); s = i.pop()) n.line--, (n.ch = 0); + for (var s = i.pop(); i.length > 0 && s && V(s); s = i.pop()) (n.line--, (n.ch = 0)); s ? (n.line--, (n.ch = Pt(e, n.line))) : (n.ch = 0); } } function Kt(e, t, n) { - (t.ch = 0), (n.ch = 0), n.line++; + ((t.ch = 0), (n.ch = 0), n.line++); } function Qt(e) { if (!e) return 0; @@ -585,9 +585,9 @@ define("ace/keyboard/vim", [ At(t, n) || nt.jumpList.add(e, t, n); } function Zt(e, t) { - (nt.lastCharacterSearch.increment = e), + ((nt.lastCharacterSearch.increment = e), (nt.lastCharacterSearch.forward = t.forward), - (nt.lastCharacterSearch.selectedCharacter = t.selectedCharacter); + (nt.lastCharacterSearch.selectedCharacter = t.selectedCharacter)); } function nn(e, t, n, r) { var i = Lt(e.getCursor()), @@ -613,9 +613,9 @@ define("ace/keyboard/vim", [ p = tn[c].isComplete; h && h(l); while (a !== o && t) { - (l.index += s), (l.nextCh = l.lineText.charAt(l.index)); + ((l.index += s), (l.nextCh = l.lineText.charAt(l.index))); if (!l.nextCh) { - (a += s), (l.lineText = e.getLine(a) || ""); + ((a += s), (l.lineText = e.getLine(a) || "")); if (s > 0) l.index = 0; else { var d = l.lineText.length; @@ -634,7 +634,7 @@ define("ace/keyboard/vim", [ a = n ? 1 : -1, f = r ? P : D; if (i && u == "") { - (s += a), (u = e.getLine(s)); + ((s += a), (u = e.getLine(s))); if (!R(e, s)) return null; o = n ? 0 : u.length; } @@ -649,7 +649,7 @@ define("ace/keyboard/vim", [ if (f[d](u.charAt(o))) { c = o; while (o != l && f[d](u.charAt(o))) o += a; - (h = o), (p = c != h); + ((h = o), (p = c != h)); if (c == t.ch && s == t.line && h == c + a) continue; return { from: Math.min(c, h + 1), to: Math.max(c, h), line: s }; } @@ -657,7 +657,7 @@ define("ace/keyboard/vim", [ } s += a; if (!R(e, s)) return null; - (u = e.getLine(s)), (o = a > 0 ? 0 : u.length); + ((u = e.getLine(s)), (o = a > 0 ? 0 : u.length)); } } function sn(e, t, n, r, i, s) { @@ -672,7 +672,7 @@ define("ace/keyboard/vim", [ u.push(r ? { line: e.lastLine(), from: c, to: c } : { line: 0, from: 0, to: 0 }); break; } - u.push(l), (t = E(l.line, r ? l.to - 1 : l.from)); + (u.push(l), (t = E(l.line, r ? l.to - 1 : l.from))); } var h = u.length != n, p = u[0], @@ -703,7 +703,7 @@ define("ace/keyboard/vim", [ } function an(e, t, n, r) { if (!$(n, I)) return; - t.marks[n] && t.marks[n].clear(), (t.marks[n] = e.setBookmark(r)); + (t.marks[n] && t.marks[n].clear(), (t.marks[n] = e.setBookmark(r))); } function fn(e, t, n, r, i) { var s; @@ -736,7 +736,7 @@ define("ace/keyboard/vim", [ f, l = s; if (r) { - while (o <= l && l <= u && n > 0) p(l), h(l, r) && n--, (l += r); + while (o <= l && l <= u && n > 0) (p(l), h(l, r) && n--, (l += r)); return new E(l, 0); } var d = e.state.vim; @@ -746,9 +746,9 @@ define("ace/keyboard/vim", [ } var m = c(s); for (l = s; l <= u && n; l++) h(l, 1, !0) && (!i || c(l) != m) && n--; - (f = new E(l, 0)), l > u && !m ? (m = !0) : (i = !1); + ((f = new E(l, 0)), l > u && !m ? (m = !0) : (i = !1)); for (l = s; l > o; l--) if (!i || c(l) == m || l == s) if (h(l, -1, !0)) break; - return (a = new E(l, 0)), { start: a, end: f }; + return ((a = new E(l, 0)), { start: a, end: f }); } function cn(e, t, n, r) { var i = t, @@ -760,15 +760,15 @@ define("ace/keyboard/vim", [ a = { "(": "(", ")": "(", "[": "[", "]": "[", "{": "{", "}": "{" }[n], f = e.getLine(i.line).charAt(i.ch), l = f === a ? 1 : 0; - (s = e.scanForBracket(E(i.line, i.ch + l), -1, null, { bracketRegex: u })), - (o = e.scanForBracket(E(i.line, i.ch + l), 1, null, { bracketRegex: u })); + ((s = e.scanForBracket(E(i.line, i.ch + l), -1, null, { bracketRegex: u })), + (o = e.scanForBracket(E(i.line, i.ch + l), 1, null, { bracketRegex: u }))); if (!s || !o) return { start: i, end: i }; - (s = s.pos), (o = o.pos); + ((s = s.pos), (o = o.pos)); if ((s.line == o.line && s.ch > o.ch) || s.line > o.line) { var c = s; - (s = o), (o = c); + ((s = o), (o = c)); } - return r ? (o.ch += 1) : (s.ch += 1), { start: s, end: o }; + return (r ? (o.ch += 1) : (s.ch += 1), { start: s, end: o }); } function hn(e, t, n, r) { var i = Lt(t), @@ -829,7 +829,7 @@ define("ace/keyboard/vim", [ r = []; for (var i = 0; i < e.length; i++) { var s = e.charAt(i); - !n && s == t && r.push(i), (n = !n && s == "\\"); + (!n && s == t && r.push(i), (n = !n && s == "\\")); } return r; } @@ -875,7 +875,7 @@ define("ace/keyboard/vim", [ var r = !1; for (var i in xn) if (t.match(i, !0)) { - (r = !0), n.push(xn[i]); + ((r = !0), n.push(xn[i])); break; } r || n.push(t.next()); @@ -896,7 +896,7 @@ define("ace/keyboard/vim", [ o = u.indexOf("i") != -1; } if (!s) return null; - G("pcre") || (s = wn(s)), n && (t = /^[^A-Z]*$/.test(s)); + (G("pcre") || (s = wn(s)), n && (t = /^[^A-Z]*$/.test(s))); var a = new RegExp(s, t || o ? "i" : undefined); return a; } @@ -913,7 +913,7 @@ define("ace/keyboard/vim", [ '' + (e || "") + ''; - return t && (n += ' ' + t + ""), n; + return (t && (n += ' ' + t + ""), n); } function An(e, t) { var n = (t.prefix || "") + " " + (t.desc || ""), @@ -936,7 +936,7 @@ define("ace/keyboard/vim", [ var i = dn(e), s = Nn(t, !!n, !!r); if (!s) return; - return Dn(e, s), On(s, i.getQuery()) ? s : (i.setQuery(s), s); + return (Dn(e, s), On(s, i.getQuery()) ? s : (i.setQuery(s), s)); } function _n(e) { if (e.source.charAt(0) == "^") var t = !0; @@ -948,12 +948,12 @@ define("ace/keyboard/vim", [ } var r = n.match(e, !1); if (r) { - if (r[0].length == 0) return n.next(), "searching"; + if (r[0].length == 0) return (n.next(), "searching"); if (!n.sol()) { n.backUp(1); - if (!e.exec(n.next() + r[0])) return n.next(), null; + if (!e.exec(n.next() + r[0])) return (n.next(), null); } - return n.match(e), "searching"; + return (n.match(e), "searching"); } while (!n.eol()) { n.next(); @@ -967,13 +967,13 @@ define("ace/keyboard/vim", [ var n = dn(e), r = n.getOverlay(); if (!r || t != r.query) - r && e.removeOverlay(r), + (r && e.removeOverlay(r), (r = _n(t)), e.addOverlay(r), e.showMatchesOnScrollbar && (n.getScrollbarAnnotate() && n.getScrollbarAnnotate().clear(), n.setScrollbarAnnotate(e.showMatchesOnScrollbar(t))), - n.setOverlay(r); + n.setOverlay(r)); } function Pn(e, t, n, r) { return ( @@ -995,10 +995,10 @@ define("ace/keyboard/vim", [ } function Hn(e) { var t = dn(e); - e.removeOverlay(dn(e).getOverlay()), + (e.removeOverlay(dn(e).getOverlay()), t.setOverlay(null), t.getScrollbarAnnotate() && - (t.getScrollbarAnnotate().clear(), t.setScrollbarAnnotate(null)); + (t.getScrollbarAnnotate().clear(), t.setScrollbarAnnotate(null))); } function Bn(e, t, n) { return ( @@ -1017,7 +1017,7 @@ define("ace/keyboard/vim", [ function Un(e, t, n, r, i, s, o, u, a) { function c() { e.operation(function () { - while (!f) h(), p(); + while (!f) (h(), p()); d(); }); } @@ -1029,20 +1029,20 @@ define("ace/keyboard/vim", [ function p() { while (s.findNext() && Bn(s.from(), r, i)) { if (!n && l && s.from().line == l.line) continue; - e.scrollIntoView(s.from(), 30), + (e.scrollIntoView(s.from(), 30), e.setSelection(s.from(), s.to()), (l = s.from()), - (f = !1); + (f = !1)); return; } f = !0; } function d(t) { - t && t(), e.focus(); + (t && t(), e.focus()); if (l) { e.setCursor(l); var n = e.state.vim; - (n.exMode = !1), (n.lastHPos = n.lastHSPos = l.ch); + ((n.exMode = !1), (n.lastHPos = n.lastHSPos = l.ch)); } a && a(); } @@ -1051,14 +1051,14 @@ define("ace/keyboard/vim", [ var i = v.keyName(t); switch (i) { case "Y": - h(), p(); + (h(), p()); break; case "N": p(); break; case "A": var s = a; - (a = undefined), e.operation(c), (a = s); + ((a = undefined), e.operation(c), (a = s)); break; case "L": h(); @@ -1068,7 +1068,7 @@ define("ace/keyboard/vim", [ case "Ctrl-[": d(r); } - return f && d(r), !0; + return (f && d(r), !0); } e.state.vim.exMode = !0; var f = !1, @@ -1079,7 +1079,7 @@ define("ace/keyboard/vim", [ return; } if (!t) { - c(), a && a(); + (c(), a && a()); return; } An(e, { prefix: "replace with " + u + " (y/n/a/q/l)", onKeyDown: m }); @@ -1096,10 +1096,10 @@ define("ace/keyboard/vim", [ a = s.changes, o = [], f = 0; - while (f < a.length) o.push(a[f]), a[f] instanceof er ? f++ : (f += u); - (s.changes = o), e.off("change", Qn), v.off(e.getInputField(), "keydown", tr); + while (f < a.length) (o.push(a[f]), a[f] instanceof er ? f++ : (f += u)); + ((s.changes = o), e.off("change", Qn), v.off(e.getInputField(), "keydown", tr)); } - !i && + (!i && t.insertModeRepeat > 1 && (nr(e, t, t.insertModeRepeat - 1, !0), (t.lastEditInputState.repeatOverride = t.insertModeRepeat)), @@ -1111,38 +1111,38 @@ define("ace/keyboard/vim", [ e.toggleOverwrite(!1), r.setText(s.changes.join("")), v.signal(e, "vim-mode-change", { mode: "normal" }), - n.isRecording && Jn(n); + n.isRecording && Jn(n)); } function Wn(e) { b.unshift(e); } function Xn(e, t, n, r, i) { var s = { keys: e, type: t }; - (s[t] = n), (s[t + "Args"] = r); + ((s[t] = n), (s[t + "Args"] = r)); for (var o in i) s[o] = i[o]; Wn(s); } function Vn(e, t, n, r) { var i = nt.registerController.getRegister(r); if (r == ":") { - i.keyBuffer[0] && Rn.processCommand(e, i.keyBuffer[0]), (n.isPlaying = !1); + (i.keyBuffer[0] && Rn.processCommand(e, i.keyBuffer[0]), (n.isPlaying = !1)); return; } var s = i.keyBuffer, o = 0; - (n.isPlaying = !0), (n.replaySearchQueries = i.searchQueries.slice(0)); + ((n.isPlaying = !0), (n.replaySearchQueries = i.searchQueries.slice(0))); for (var u = 0; u < s.length; u++) { var a = s[u], f, l; while (a) { - (f = /<\w+-.+?>|<\w+>|./.exec(a)), + ((f = /<\w+-.+?>|<\w+>|./.exec(a)), (l = f[0]), (a = a.substring(f.index + l.length)), - v.Vim.handleKey(e, l, "macro"); + v.Vim.handleKey(e, l, "macro")); if (t.insertMode) { var c = i.insertModeChanges[o++].changes; - (nt.macroModeState.lastInsertModeChanges.changes = c), rr(e, c, 1), zn(e); + ((nt.macroModeState.lastInsertModeChanges.changes = c), rr(e, c, 1), zn(e)); } } } @@ -1174,10 +1174,10 @@ define("ace/keyboard/vim", [ r.expectCursorActivityForChange = !0; if (t.origin == "+input" || t.origin == "paste" || t.origin === undefined) { var i = t.text.join("\n"); - r.maybeReset && ((r.changes = []), (r.maybeReset = !1)), + (r.maybeReset && ((r.changes = []), (r.maybeReset = !1)), e.state.overwrite && !/\n/.test(i) ? r.changes.push([i]) - : r.changes.push(i); + : r.changes.push(i)); } t = t.next; } @@ -1198,8 +1198,8 @@ define("ace/keyboard/vim", [ var t = e.state.vim, n = wt(e, Lt(t.sel.head)), r = St(n, 0, 1); - t.fakeCursor && t.fakeCursor.clear(), - (t.fakeCursor = e.markText(n, r, { className: "cm-animate-fat-cursor" })); + (t.fakeCursor && t.fakeCursor.clear(), + (t.fakeCursor = e.markText(n, r, { className: "cm-animate-fat-cursor" }))); } function Zn(e, t) { var n = e.getCursor("anchor"), @@ -1215,11 +1215,11 @@ define("ace/keyboard/vim", [ if (t.visualMode) { var i = Ot(r, n) ? 0 : -1, s = Ot(r, n) ? -1 : 0; - (r = St(r, 0, i)), + ((r = St(r, 0, i)), (n = St(n, 0, s)), (t.sel = { anchor: n, head: r }), an(e, t, "<", Mt(r, n)), - an(e, t, ">", _t(r, n)); + an(e, t, ">", _t(r, n))); } else t.insertMode || (t.lastHPos = e.getCursor().ch); } function er(e) { @@ -1257,13 +1257,13 @@ define("ace/keyboard/vim", [ o = t.inputState; t.inputState = t.lastEditInputState; if (s && t.lastEditActionCommand.interlaceInsertRepeat) - for (var f = 0; f < n; f++) u(), a(1); - else r || u(), a(n); - (t.inputState = o), t.insertMode && !r && zn(e), (i.isPlaying = !1); + for (var f = 0; f < n; f++) (u(), a(1)); + else (r || u(), a(n)); + ((t.inputState = o), t.insertMode && !r && zn(e), (i.isPlaying = !1)); } function rr(e, t, n) { function r(t) { - return typeof t == "string" ? v.commands[t](e) : t(e), !0; + return (typeof t == "string" ? v.commands[t](e) : t(e), !0); } var i = e.getCursor("head"), s = nt.macroModeState.lastInsertModeChanges.inVisualBlock; @@ -1271,7 +1271,7 @@ define("ace/keyboard/vim", [ var o = e.state.vim, u = o.lastSelection, a = xt(u.anchor, u.head); - It(e, i, a.line + 1), (n = e.listSelections().length), e.setCursor(i); + (It(e, i, a.line + 1), (n = e.listSelections().length), e.setCursor(i)); } for (var f = 0; f < n; f++) { s && e.setCursor(St(i, f, 0)); @@ -1291,7 +1291,7 @@ define("ace/keyboard/vim", [ s && e.setCursor(St(i, 0, 1)); } function sr(e, t, n) { - t.length > 1 && t[0] == "n" && (t = t.replace("numpad", "")), (t = ir[t] || t); + (t.length > 1 && t[0] == "n" && (t = t.replace("numpad", "")), (t = ir[t] || t)); var r = ""; return ( n.ctrlKey && (r += "C-"), @@ -1307,10 +1307,10 @@ define("ace/keyboard/vim", [ return ( Object.keys(e).forEach(function (n) { var r = e[n]; - Array.isArray(r) + (Array.isArray(r) ? (r = r.slice()) : r && typeof r == "object" && r.constructor != Object && (r = ur(r)), - (t[n] = r); + (t[n] = r)); }), e.sel && (t.sel = { @@ -1334,7 +1334,7 @@ define("ace/keyboard/vim", [ else { var o = ur(i); e.operation(function () { - e.ace.forEachSelection(function () { + (e.ace.forEachSelection(function () { var i = e.ace.selection; e.state.vim.lastHPos = i.$desiredColumn == null ? i.lead.column : i.$desiredColumn; @@ -1342,24 +1342,24 @@ define("ace/keyboard/vim", [ u = e.getCursor("anchor"), a = Ot(s, u) ? 0 : -1, f = Ot(s, u) ? -1 : 0; - (s = St(s, 0, a)), + ((s = St(s, 0, a)), (u = St(u, 0, f)), (e.state.vim.sel.head = s), (e.state.vim.sel.anchor = u), (r = or(e, t, n)), (i.$desiredColumn = e.state.vim.lastHPos == -1 ? null : e.state.vim.lastHPos), - e.virtualSelectionMode() && (e.state.vim = ur(o)); + e.virtualSelectionMode() && (e.state.vim = ur(o))); }), - e.curOp.cursorActivity && !r && (e.curOp.cursorActivity = !1); + e.curOp.cursorActivity && !r && (e.curOp.cursorActivity = !1)); }, !0); } - return r && Zn(e, i), r; + return (r && Zn(e, i), r); } function lr(e, t) { t.off("beforeEndOperation", lr); var n = t.state.cm.vimCmd; - n && t.execCommand(n.exec ? n : n.name, n.args), (t.curOp = t.prevOp); + (n && t.execCommand(n.exec ? n : n.name, n.args), (t.curOp = t.prevOp)); } var i = e("../range").Range, s = e("../lib/event_emitter").EventEmitter, @@ -1374,7 +1374,7 @@ define("ace/keyboard/vim", [ d = e("../mode/text").Mode.prototype.tokenRe; e("../multi_select"); var v = function (e) { - (this.ace = e), + ((this.ace = e), (this.state = {}), (this.marks = {}), (this.$uid = 0), @@ -1383,11 +1383,11 @@ define("ace/keyboard/vim", [ (this.onBeforeEndOperation = this.onBeforeEndOperation.bind(this)), this.ace.on("change", this.onChange), this.ace.on("changeSelection", this.onSelectionChange), - this.ace.on("beforeEndOperation", this.onBeforeEndOperation); + this.ace.on("beforeEndOperation", this.onBeforeEndOperation)); }; - (v.Pos = function (e, t) { + ((v.Pos = function (e, t) { if (!(this instanceof E)) return new E(e, t); - (this.line = e), (this.ch = t); + ((this.line = e), (this.ch = t)); }), (v.defineOption = function (e, t, n) {}), (v.commands = { @@ -1444,12 +1444,12 @@ define("ace/keyboard/vim", [ return e < "" ? /^\w$/.test(e) : ((d.lastIndex = 0), d.test(e)); }), function () { - u.implement(v.prototype, s), + (u.implement(v.prototype, s), (this.destroy = function () { - this.ace.off("change", this.onChange), + (this.ace.off("change", this.onChange), this.ace.off("changeSelection", this.onSelectionChange), this.ace.off("beforeEndOperation", this.onBeforeEndOperation), - this.removeOverlay(); + this.removeOverlay()); }), (this.virtualSelectionMode = function () { return this.ace.inVirtualSelectionMode && this.ace.selection.index; @@ -1461,20 +1461,20 @@ define("ace/keyboard/vim", [ (n.changeHandlers = this._eventRegistry.change && this._eventRegistry.change.slice()); if (this.virtualSelectionMode()) return; - n.lastChange + (n.lastChange ? (n.lastChange.next = n.lastChange = t) : (n.lastChange = n.change = t), - this.$updateMarkers(e); + this.$updateMarkers(e)); }), (this.onSelectionChange = function () { var e = (this.curOp = this.curOp || {}); - e.cursorActivityHandlers || + (e.cursorActivityHandlers || (e.cursorActivityHandlers = this._eventRegistry.cursorActivity && this._eventRegistry.cursorActivity.slice()), (this.curOp.cursorActivity = !0), this.ace.inMultiSelectMode && - this.ace.keyBinding.removeKeyboardHandler(p.keyboardHandler); + this.ace.keyBinding.removeKeyboardHandler(p.keyboardHandler)); }), (this.operation = function (e, t) { if ((!t && this.curOp) || (t && this.curOp && this.curOp.force)) return e(); @@ -1521,10 +1521,10 @@ define("ace/keyboard/vim", [ return this.ace.session.getLength(); }), (this.setCursor = function (e, t) { - typeof e == "object" && ((t = e.ch), (e = e.line)), + (typeof e == "object" && ((t = e.ch), (e = e.line)), this.ace.inVirtualSelectionMode || this.ace.exitMultiSelectMode(), this.ace.session.unfold({ row: e, column: t }), - this.ace.selection.moveTo(e, t); + this.ace.selection.moveTo(e, t)); }), (this.getCursor = function (e) { var t = this.ace.selection, @@ -1558,14 +1558,14 @@ define("ace/keyboard/vim", [ i.comparePoints(t, n) < 0 ? new i.fromPoints(t, n) : new i.fromPoints(n, t); - return (r.cursor = i.comparePoints(r.start, n) ? r.end : r.start), r; + return ((r.cursor = i.comparePoints(r.start, n) ? r.end : r.start), r); }); if (this.ace.inVirtualSelectionMode) { this.ace.selection.fromOrientedRange(r[0]); return; } - t ? r[t] && r.push(r.splice(t, 1)[0]) : (r = r.reverse()), - n.toSingleRange(r[0].clone()); + (t ? r[t] && r.push(r.splice(t, 1)[0]) : (r = r.reverse()), + n.toSingleRange(r[0].clone())); var s = this.ace.session; for (var o = 0; o < r.length; o++) { var u = s.$clipRangeToDocument(r[o]); @@ -1574,9 +1574,9 @@ define("ace/keyboard/vim", [ }), (this.setSelection = function (e, t, n) { var r = this.ace.selection; - r.moveTo(e.line, e.ch), + (r.moveTo(e.line, e.ch), r.selectTo(t.line, t.ch), - n && n.origin == "*mouse" && this.onBeforeEndOperation(); + n && n.origin == "*mouse" && this.onBeforeEndOperation()); }), (this.somethingSelected = function (e) { return !this.ace.selection.isEmpty(); @@ -1608,22 +1608,22 @@ define("ace/keyboard/vim", [ } var l = t ? f : i.comparePoints(a, r); if (l > 0) { - (a.row += s), (a.column += a.row == r.row ? o : 0); + ((a.row += s), (a.column += a.row == r.row ? o : 0)); continue; } !t && l <= 0 && ((a.row = n.row), (a.column = n.column), l === 0 && (a.bias = 1)); } - }); + })); var e = function (e, t, n, r) { - (this.cm = e), + ((this.cm = e), (this.id = t), (this.row = n), (this.column = r), - (e.marks[this.id] = this); + (e.marks[this.id] = this)); }; - (e.prototype.clear = function () { + ((e.prototype.clear = function () { delete this.cm.marks[this.id]; }), (e.prototype.find = function () { @@ -1632,28 +1632,28 @@ define("ace/keyboard/vim", [ (this.setBookmark = function (t, n) { var r = new e(this, this.$uid++, t.line, t.ch); if (!n || !n.insertLeft) r.$insertRight = !0; - return (this.marks[r.id] = r), r; + return ((this.marks[r.id] = r), r); }), (this.moveH = function (e, t) { if (t == "char") { var n = this.ace.selection; - n.clearSelection(), n.moveCursorBy(0, e); + (n.clearSelection(), n.moveCursorBy(0, e)); } }), (this.findPosV = function (e, t, n, r) { if (n == "page") { var i = this.ace.renderer, s = i.layerConfig; - (t *= Math.floor(s.height / s.lineHeight)), (n = "line"); + ((t *= Math.floor(s.height / s.lineHeight)), (n = "line")); } if (n == "line") { var o = this.ace.session.documentToScreenPosition(e.line, e.ch); - r != null && (o.column = r), + (r != null && (o.column = r), (o.row += t), (o.row = Math.min( Math.max(0, o.row), this.ace.session.getScreenLength() - 1, - )); + ))); var u = this.ace.session.screenToDocumentPosition(o.row, o.column); return g(u); } @@ -1735,10 +1735,10 @@ define("ace/keyboard/vim", [ var n = this.ace.renderer, r = n.layerConfig, i = r.maxHeight; - (i -= (n.$size.scrollerHeight - n.lineHeight) * n.$scrollPastEnd), + ((i -= (n.$size.scrollerHeight - n.lineHeight) * n.$scrollPastEnd), t != null && this.ace.session.setScrollTop(Math.max(0, Math.min(t, i))), e != null && - this.ace.session.setScrollLeft(Math.max(0, Math.min(e, r.width))); + this.ace.session.setScrollLeft(Math.max(0, Math.min(e, r.width)))); }), (this.scrollInfo = function () { return 0; @@ -1762,7 +1762,8 @@ define("ace/keyboard/vim", [ }), (this.replaceRange = function (e, t, n) { return ( - n || (n = t), this.ace.session.replace(new i(t.line, t.ch, n.line, n.ch), e) + n || (n = t), + this.ace.session.replace(new i(t.line, t.ch, n.line, n.ch), e) ); }), (this.replaceSelections = function (e) { @@ -1790,7 +1791,7 @@ define("ace/keyboard/vim", [ }), (this.getWrapperElement = function () { return this.ace.containter; - }); + })); var t = { indentWithTabs: "useSoftTabs", indentUnit: "tabSize", @@ -1798,11 +1799,11 @@ define("ace/keyboard/vim", [ firstLineNumber: "firstLineNumber", readOnly: "readOnly", }; - (this.setOption = function (e, n) { + ((this.setOption = function (e, n) { this.state[e] = n; switch (e) { case "indentWithTabs": - (e = t[e]), (n = !n); + ((e = t[e]), (n = !n)); break; default: e = t[e]; @@ -1814,24 +1815,24 @@ define("ace/keyboard/vim", [ r && (n = this.ace.getOption(r)); switch (e) { case "indentWithTabs": - return (e = t[e]), !n; + return ((e = t[e]), !n); } return r ? n : this.state[e]; }), (this.toggleOverwrite = function (e) { - return (this.state.overwrite = e), this.ace.setOverwrite(e); + return ((this.state.overwrite = e), this.ace.setOverwrite(e)); }), (this.addOverlay = function (e) { if (!this.$searchHighlight || !this.$searchHighlight.session) { var t = new h(null, "ace_highlight-marker", "text"), n = this.ace.session.addDynamicMarker(t); - (t.id = n.id), + ((t.id = n.id), (t.session = this.ace.session), (t.destroy = function (e) { - t.session.off("change", t.updateOnChange), + (t.session.off("change", t.updateOnChange), t.session.off("changeEditor", t.destroy), t.session.removeMarker(t.id), - (t.session = null); + (t.session = null)); }), (t.updateOnChange = function (e) { var n = e.start.row; @@ -1840,12 +1841,12 @@ define("ace/keyboard/vim", [ : t.cache.splice(n, t.cache.length); }), t.session.on("changeEditor", t.destroy), - t.session.on("change", t.updateOnChange); + t.session.on("change", t.updateOnChange)); } var r = new RegExp(e.query.source, "gmi"); - (this.$searchHighlight = e.highlight = t), + ((this.$searchHighlight = e.highlight = t), this.$searchHighlight.setRegexp(r), - this.ace.renderer.updateBackMarkers(); + this.ace.renderer.updateBackMarkers()); }), (this.removeOverlay = function (e) { this.$searchHighlight && @@ -1919,16 +1920,16 @@ define("ace/keyboard/vim", [ }), (this.getMode = function () { return { name: this.getOption("mode") }; - }); - }.call(v.prototype); + })); + }.call(v.prototype)); var y = (v.StringStream = function (e, t) { - (this.pos = this.start = 0), + ((this.pos = this.start = 0), (this.string = e), (this.tabSize = t || 8), (this.lastColumnPos = this.lastColumnValue = 0), - (this.lineStart = 0); + (this.lineStart = 0)); }); - (y.prototype = { + ((y.prototype = { eol: function () { return this.pos >= this.string.length; }, @@ -1945,7 +1946,7 @@ define("ace/keyboard/vim", [ var t = this.string.charAt(this.pos); if (typeof e == "string") var n = t == e; else var n = t && (e.test ? e.test(t) : e(t)); - if (n) return ++this.pos, t; + if (n) return (++this.pos, t); }, eatWhile: function (e) { var t = this.pos; @@ -1962,7 +1963,7 @@ define("ace/keyboard/vim", [ }, skipTo: function (e) { var t = this.string.indexOf(e, this.pos); - if (t > -1) return (this.pos = t), !0; + if (t > -1) return ((this.pos = t), !0); }, backUp: function (e) { this.pos -= e; @@ -1982,7 +1983,7 @@ define("ace/keyboard/vim", [ return n ? e.toLowerCase() : e; }, i = this.string.substr(this.pos, e.length); - if (r(i) == r(e)) return t !== !1 && (this.pos += e.length), !0; + if (r(i) == r(e)) return (t !== !1 && (this.pos += e.length), !0); }, current: function () { return this.string.slice(this.start, this.pos); @@ -2017,24 +2018,24 @@ define("ace/keyboard/vim", [ ); } function t(e, t) { - e.state.currentNotificationClose && e.state.currentNotificationClose(), - (e.state.currentNotificationClose = t); + (e.state.currentNotificationClose && e.state.currentNotificationClose(), + (e.state.currentNotificationClose = t)); } - v.defineExtension("openDialog", function (n, r, i) { + (v.defineExtension("openDialog", function (n, r, i) { function a(e) { if (typeof e == "string") f.value = e; else { if (o) return; if (e && e.type == "blur" && document.activeElement === f) return; - (u.state.dialog = null), + ((u.state.dialog = null), (o = !0), s.parentNode.removeChild(s), u.focus(), - i.onClose && i.onClose(s); + i.onClose && i.onClose(s)); } } if (this.virtualSelectionMode()) return; - i || (i = {}), t(this, null); + (i || (i = {}), t(this, null)); var s = e(this, n, i.bottom), o = !1, u = this; @@ -2042,7 +2043,7 @@ define("ace/keyboard/vim", [ var f = s.getElementsByTagName("input")[0], l; if (f) - i.value && ((f.value = i.value), i.selectValueOnOpen !== !1 && f.select()), + (i.value && ((f.value = i.value), i.selectValueOnOpen !== !1 && f.select()), i.onInput && v.on(f, "input", function (e) { i.onInput(e, f.value, a); @@ -2054,23 +2055,23 @@ define("ace/keyboard/vim", [ v.on(f, "keydown", function (e) { if (i && i.onKeyDown && i.onKeyDown(e, f.value, a)) return; if (e.keyCode == 27 || (i.closeOnEnter !== !1 && e.keyCode == 13)) - f.blur(), v.e_stop(e), a(); + (f.blur(), v.e_stop(e), a()); e.keyCode == 13 && r(f.value); }), i.closeOnBlur !== !1 && v.on(f, "blur", a), - f.focus(); + f.focus()); else if ((l = s.getElementsByTagName("button")[0])) - v.on(l, "click", function () { - a(), u.focus(); + (v.on(l, "click", function () { + (a(), u.focus()); }), i.closeOnBlur !== !1 && v.on(l, "blur", a), - l.focus(); + l.focus()); return a; }), v.defineExtension("openNotification", function (n, r) { function a() { if (s) return; - (s = !0), clearTimeout(o), i.parentNode.removeChild(i); + ((s = !0), clearTimeout(o), i.parentNode.removeChild(i)); } if (this.virtualSelectionMode()) return; t(this, a); @@ -2080,13 +2081,13 @@ define("ace/keyboard/vim", [ u = r && typeof r.duration != "undefined" ? r.duration : 5e3; return ( v.on(i, "click", function (e) { - v.e_preventDefault(e), a(); + (v.e_preventDefault(e), a()); }), u && (o = setTimeout(a, u)), a ); - }); - })(); + })); + })()); var b = [ { keys: "", type: "keyToKey", toKeys: "h" }, { keys: "", type: "keyToKey", toKeys: "l" }, @@ -2804,7 +2805,7 @@ define("ace/keyboard/vim", [ function l(n) { var r = ++t % e, o = i[r]; - o && o.clear(), (i[r] = s.setBookmark(n)); + (o && o.clear(), (i[r] = s.setBookmark(n))); } var a = t % e, f = i[a]; @@ -2812,17 +2813,17 @@ define("ace/keyboard/vim", [ var c = f.find(); c && !At(c, o) && l(o); } else l(o); - l(u), (n = t), (r = t - e + 1), r < 0 && (r = 0); + (l(u), (n = t), (r = t - e + 1), r < 0 && (r = 0)); } function o(s, o) { - (t += o), t > n ? (t = n) : t < r && (t = r); + ((t += o), t > n ? (t = n) : t < r && (t = r)); var u = i[(e + t) % e]; if (u && !u.find()) { var a = o > 0 ? 1 : -1, f, l = s.getCursor(); do { - (t += a), (u = i[(e + t) % e]); + ((t += a), (u = i[(e + t) % e])); if (u && (f = u.find()) && !At(l, f)) break; } while (t < n && t > r); } @@ -2846,9 +2847,9 @@ define("ace/keyboard/vim", [ et.prototype = { exitMacroRecordMode: function () { var e = nt.macroModeState; - e.onRecordingDone && e.onRecordingDone(), + (e.onRecordingDone && e.onRecordingDone(), (e.onRecordingDone = undefined), - (e.isRecording = !1); + (e.isRecording = !1)); }, enterMacroRecordMode: function (e, t) { var n = nt.registerController.getRegister(t); @@ -2895,7 +2896,7 @@ define("ace/keyboard/vim", [ e + '", command not registered', ); - (qn[e] = n), (Rn.commandMap_[t] = { name: e, shortName: t, type: "api" }); + ((qn[e] = n), (Rn.commandMap_[t] = { name: e, shortName: t, type: "api" })); }, handleKey: function (e, t, n) { var r = this.findKey(e, t, n); @@ -2905,21 +2906,21 @@ define("ace/keyboard/vim", [ function i() { var r = nt.macroModeState; if (r.isRecording) { - if (t == "q") return r.exitMacroRecordMode(), ut(e), !0; + if (t == "q") return (r.exitMacroRecordMode(), ut(e), !0); n != "mapping" && $n(r, t); } } function s() { if (t == "") - return ut(e), r.visualMode ? $t(e) : r.insertMode && zn(e), !0; + return (ut(e), r.visualMode ? $t(e) : r.insertMode && zn(e), !0); } function o(n) { var r; while (n) - (r = /<\w+-.+?>|<\w+>|./.exec(n)), + ((r = /<\w+-.+?>|<\w+>|./.exec(n)), (t = r[0]), (n = n.substring(r.index + t.length)), - v.Vim.handleKey(e, t, "mapping"); + v.Vim.handleKey(e, t, "mapping")); } function u() { if (s()) return !0; @@ -2931,7 +2932,7 @@ define("ace/keyboard/vim", [ u = ht.matchCommand(n, b, r.inputState, "insert"); u.type != "none" && (o = u); } - if (o.type == "none") return ut(e), !1; + if (o.type == "none") return (ut(e), !1); if (o.type == "partial") return ( it && window.clearTimeout(it), @@ -2949,21 +2950,21 @@ define("ace/keyboard/vim", [ } nt.macroModeState.lastInsertModeChanges.changes.pop(); } - return ut(e), o.command; + return (ut(e), o.command); } function a() { if (i() || s()) return !0; var n = (r.inputState.keyBuffer = r.inputState.keyBuffer + t); if (/^[1-9]\d*$/.test(n)) return !0; var o = /^(\d*)(.*)$/.exec(n); - if (!o) return ut(e), !1; + if (!o) return (ut(e), !1); var u = r.visualMode ? "visual" : "normal", a = ht.matchCommand(o[2] || o[1], b, r.inputState, u); - if (a.type == "none") return ut(e), !1; + if (a.type == "none") return (ut(e), !1); if (a.type == "partial") return !0; r.inputState.keyBuffer = ""; var o = /^(\d*)(.*)$/.exec(n); - return o[1] && o[1] != "0" && r.inputState.pushRepeatDigit(o[1]), a.command; + return (o[1] && o[1] != "0" && r.inputState.pushRepeatDigit(o[1]), a.command); } var r = tt(e), f; @@ -2985,10 +2986,10 @@ define("ace/keyboard/vim", [ : ht.processCommand(e, r, f); } catch (t) { throw ( - ((e.state.vim = undefined), + (e.state.vim = undefined), tt(e), v.Vim.suppressErrorLogging || console.log(t), - t) + t ); } return !0; @@ -3008,7 +3009,7 @@ define("ace/keyboard/vim", [ exitVisualMode: $t, exitInsertMode: zn, }; - (ot.prototype.pushRepeatDigit = function (e) { + ((ot.prototype.pushRepeatDigit = function (e) { this.operator ? (this.motionRepeat = this.motionRepeat.concat(e)) : (this.prefixRepeat = this.prefixRepeat.concat(e)); @@ -3016,18 +3017,19 @@ define("ace/keyboard/vim", [ (ot.prototype.getRepeat = function () { var e = 0; if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) - (e = 1), + ((e = 1), this.prefixRepeat.length > 0 && (e *= parseInt(this.prefixRepeat.join(""), 10)), - this.motionRepeat.length > 0 && (e *= parseInt(this.motionRepeat.join(""), 10)); + this.motionRepeat.length > 0 && + (e *= parseInt(this.motionRepeat.join(""), 10))); return e; }), (at.prototype = { setText: function (e, t, n) { - (this.keyBuffer = [e || ""]), (this.linewise = !!t), (this.blockwise = !!n); + ((this.keyBuffer = [e || ""]), (this.linewise = !!t), (this.blockwise = !!n)); }, pushText: function (e, t) { - t && (this.linewise || this.keyBuffer.push("\n"), (this.linewise = !0)), - this.keyBuffer.push(e); + (t && (this.linewise || this.keyBuffer.push("\n"), (this.linewise = !0)), + this.keyBuffer.push(e)); }, pushInsertModeChanges: function (e) { this.insertModeChanges.push(Z(e)); @@ -3036,10 +3038,10 @@ define("ace/keyboard/vim", [ this.searchQueries.push(e); }, clear: function () { - (this.keyBuffer = []), + ((this.keyBuffer = []), (this.insertModeChanges = []), (this.searchQueries = []), - (this.linewise = !1); + (this.linewise = !1)); }, toString: function () { return this.keyBuffer.join(""); @@ -3065,8 +3067,8 @@ define("ace/keyboard/vim", [ return; } var o = X(e); - o ? s.pushText(n, r) : s.setText(n, r, i), - this.unnamedRegister.setText(s.toString(), r); + (o ? s.pushText(n, r) : s.setText(n, r, i), + this.unnamedRegister.setText(s.toString(), r)); }, getRegister: function (e) { return this.isValidRegister(e) @@ -3090,19 +3092,20 @@ define("ace/keyboard/vim", [ for (var i = this.iterator + r; t ? i >= 0 : i < n.length; i += r) { var s = n[i]; for (var o = 0; o <= s.length; o++) - if (this.initialPrefix == s.substring(0, o)) return (this.iterator = i), s; + if (this.initialPrefix == s.substring(0, o)) + return ((this.iterator = i), s); } - if (i >= n.length) return (this.iterator = n.length), this.initialPrefix; + if (i >= n.length) return ((this.iterator = n.length), this.initialPrefix); if (i < 0) return e; }, pushInput: function (e) { var t = this.historyBuffer.indexOf(e); - t > -1 && this.historyBuffer.splice(t, 1), e.length && this.historyBuffer.push(e); + (t > -1 && this.historyBuffer.splice(t, 1), e.length && this.historyBuffer.push(e)); }, reset: function () { - (this.initialPrefix = null), (this.iterator = this.historyBuffer.length); + ((this.initialPrefix = null), (this.iterator = this.historyBuffer.length)); }, - }); + })); var ht = { matchCommand: function (e, t, n, r) { var i = Tt(e, t, r, n); @@ -3146,38 +3149,38 @@ define("ace/keyboard/vim", [ } }, processMotion: function (e, t, n) { - (t.inputState.motion = n.motion), + ((t.inputState.motion = n.motion), (t.inputState.motionArgs = Et(n.motionArgs)), - this.evalInput(e, t); + this.evalInput(e, t)); }, processOperator: function (e, t, n) { var r = t.inputState; if (r.operator) { if (r.operator == n.operator) { - (r.motion = "expandToLine"), + ((r.motion = "expandToLine"), (r.motionArgs = { linewise: !0 }), - this.evalInput(e, t); + this.evalInput(e, t)); return; } ut(e); } - (r.operator = n.operator), + ((r.operator = n.operator), (r.operatorArgs = Et(n.operatorArgs)), - t.visualMode && this.evalInput(e, t); + t.visualMode && this.evalInput(e, t)); }, processOperatorMotion: function (e, t, n) { var r = t.visualMode, i = Et(n.operatorMotionArgs); - i && r && i.visualLine && (t.visualLine = !0), + (i && r && i.visualLine && (t.visualLine = !0), this.processOperator(e, t, n), - r || this.processMotion(e, t, n); + r || this.processMotion(e, t, n)); }, processAction: function (e, t, n) { var r = t.inputState, i = r.getRepeat(), s = !!i, o = Et(n.actionArgs) || {}; - r.selectedCharacter && (o.selectedCharacter = r.selectedCharacter), + (r.selectedCharacter && (o.selectedCharacter = r.selectedCharacter), n.operator && this.processOperator(e, t, n), n.motion && this.processMotion(e, t, n), (n.motion || n.operator) && this.evalInput(e, t), @@ -3187,15 +3190,15 @@ define("ace/keyboard/vim", [ ut(e), (t.lastMotion = null), n.isEdit && this.recordLastEdit(t, r, n), - yt[n.action](e, o, t); + yt[n.action](e, o, t)); }, processSearch: function (e, t, n) { function a(r, i, s) { - nt.searchHistoryController.pushInput(r), nt.searchHistoryController.reset(); + (nt.searchHistoryController.pushInput(r), nt.searchHistoryController.reset()); try { Mn(e, r, i, s); } catch (o) { - Cn(e, "Invalid regex: " + r), ut(e); + (Cn(e, "Invalid regex: " + r), ut(e)); return; } ht.processMotion(e, t, { @@ -3205,7 +3208,7 @@ define("ace/keyboard/vim", [ }); } function f(t) { - e.scrollTo(u.left, u.top), a(t, !0, !0); + (e.scrollTo(u.left, u.top), a(t, !0, !0)); var n = nt.macroModeState; n.isRecording && Kn(n, t); } @@ -3271,17 +3274,17 @@ define("ace/keyboard/vim", [ d || ((d = Gt(e, !1, !0, !1, !1)), (m = !1)); if (!d) return; var p = e.getLine(d.start.line).substring(d.start.ch, d.end.ch); - m && i ? (p = "\\b" + p + "\\b") : (p = Bt(p)), + (m && i ? (p = "\\b" + p + "\\b") : (p = Bt(p)), (nt.jumpList.cachedCursor = e.getCursor()), e.setCursor(d.start), - a(p, !0, !1); + a(p, !0, !1)); } }, processEx: function (e, t, n) { function r(t) { - nt.exCommandHistoryController.pushInput(t), + (nt.exCommandHistoryController.pushInput(t), nt.exCommandHistoryController.reset(), - Rn.processCommand(e, t); + Rn.processCommand(e, t)); } function i(t, n, r) { var i = v.keyName(t), @@ -3293,12 +3296,12 @@ define("ace/keyboard/vim", [ i == "Ctrl-[" || (i == "Backspace" && n == "") ) - nt.exCommandHistoryController.pushInput(n), + (nt.exCommandHistoryController.pushInput(n), nt.exCommandHistoryController.reset(), v.e_stop(t), ut(e), r(), - e.focus(); + e.focus()); i == "Up" || i == "Down" ? (v.e_stop(t), (s = i == "Up" ? !0 : !1), @@ -3345,15 +3348,15 @@ define("ace/keyboard/vim", [ p, d, v; - s && this.recordLastEdit(t, n), - n.repeatOverride !== undefined ? (v = n.repeatOverride) : (v = n.getRepeat()); + (s && this.recordLastEdit(t, n), + n.repeatOverride !== undefined ? (v = n.repeatOverride) : (v = n.getRepeat())); if (v > 0 && i.explicitRepeat) i.repeatIsExplicit = !0; else if (i.noRepeat || (!i.explicitRepeat && v === 0)) - (v = 1), (i.repeatIsExplicit = !1); - n.selectedCharacter && + ((v = 1), (i.repeatIsExplicit = !1)); + (n.selectedCharacter && (i.selectedCharacter = o.selectedCharacter = n.selectedCharacter), (i.repeat = v), - ut(e); + ut(e)); if (r) { var m = pt[r](e, f, i, t); t.lastMotion = pt[r]; @@ -3366,16 +3369,16 @@ define("ace/keyboard/vim", [ y = g.cachedCursor; y ? (Yt(e, y, m), delete g.cachedCursor) : Yt(e, f, m); } - m instanceof Array ? ((d = m[0]), (p = m[1])) : (p = m), p || (p = Lt(f)); + (m instanceof Array ? ((d = m[0]), (p = m[1])) : (p = m), p || (p = Lt(f))); if (t.visualMode) { if (!t.visualBlock || p.ch !== Infinity) p = wt(e, p, t.visualBlock); - d && (d = wt(e, d, !0)), + (d && (d = wt(e, d, !0)), (d = d || h), (a.anchor = d), (a.head = p), Wt(e), an(e, t, "<", Ot(d, p) ? d : p), - an(e, t, ">", Ot(d, p) ? p : d); + an(e, t, ">", Ot(d, p) ? p : d)); } else s || ((p = wt(e, p)), e.setCursor(p.line, p.ch)); } if (s) { @@ -3384,7 +3387,7 @@ define("ace/keyboard/vim", [ var b = o.lastSel, w = Math.abs(b.head.line - b.anchor.line), S = Math.abs(b.head.ch - b.anchor.ch); - b.visualLine + (b.visualLine ? (p = E(h.line + w, h.ch)) : b.visualBlock ? (p = E(h.line + w, h.ch + S)) @@ -3395,7 +3398,7 @@ define("ace/keyboard/vim", [ (t.visualLine = b.visualLine), (t.visualBlock = b.visualBlock), (a = t.sel = { anchor: d, head: p }), - Wt(e); + Wt(e)); } else t.visualMode && (o.lastSel = { @@ -3406,11 +3409,11 @@ define("ace/keyboard/vim", [ }); var x, T, N, C, k; if (t.visualMode) { - (x = Mt(a.head, a.anchor)), + ((x = Mt(a.head, a.anchor)), (T = _t(a.head, a.anchor)), (N = t.visualLine || o.linewise), (C = t.visualBlock ? "block" : N ? "line" : "char"), - (k = Xt(e, { anchor: x, head: T }, C)); + (k = Xt(e, { anchor: x, head: T }, C))); if (N) { var L = k.ranges; if (C == "block") @@ -3419,33 +3422,33 @@ define("ace/keyboard/vim", [ else C == "line" && (L[0].head = E(L[0].head.line + 1, 0)); } } else { - (x = Lt(d || h)), (T = Lt(p || c)); + ((x = Lt(d || h)), (T = Lt(p || c))); if (Ot(T, x)) { var O = x; - (x = T), (T = O); + ((x = T), (T = O)); } - (N = i.linewise || o.linewise), + ((N = i.linewise || o.linewise), N ? Kt(e, x, T) : i.forward && Jt(e, x, T), - (C = "char"); + (C = "char")); var M = !i.inclusive || N; k = Xt(e, { anchor: x, head: T }, C, M); } - e.setSelections(k.ranges, k.primary), + (e.setSelections(k.ranges, k.primary), (t.lastMotion = null), (o.repeat = v), (o.registerName = u), - (o.linewise = N); + (o.linewise = N)); var _ = mt[s](e, o, k.ranges, h, p); - t.visualMode && $t(e, _ != null), _ && e.setCursor(_); + (t.visualMode && $t(e, _ != null), _ && e.setCursor(_)); } }, recordLastEdit: function (e, t, n) { var r = nt.macroModeState; if (r.isPlaying) return; - (e.lastEditInputState = t), + ((e.lastEditInputState = t), (e.lastEditActionCommand = n), (r.lastInsertModeChanges.changes = []), - (r.lastInsertModeChanges.expectCursorActivityForChange = !1); + (r.lastInsertModeChanges.expectCursorActivityForChange = !1)); }, }, pt = { @@ -3471,7 +3474,7 @@ define("ace/keyboard/vim", [ i = r.getQuery(); if (!i) return; var s = !n.forward; - return (s = r.isReversed() ? !s : s), Dn(e, i), Pn(e, s, i, n.repeat); + return ((s = r.isReversed() ? !s : s), Dn(e, i), Pn(e, s, i, n.repeat)); }, goToMark: function (e, t, n, r) { var i = Fn(e, r, n.selectedCharacter); @@ -3499,7 +3502,7 @@ define("ace/keyboard/vim", [ if (l || c) i = a; } } - return n.linewise && (i = E(i.line, Qt(e.getLine(i.line)))), i; + return (n.linewise && (i = E(i.line, Qt(e.getLine(i.line)))), i); }, moveByCharacters: function (e, t, n) { var r = t, @@ -3556,9 +3559,9 @@ define("ace/keyboard/vim", [ o = e.coordsChar(a, "div"); else { var f = e.charCoords(E(e.firstLine(), 0), "div"); - (f.left = r.lastHSPos), (o = e.coordsChar(f, "div")); + ((f.left = r.lastHSPos), (o = e.coordsChar(f, "div"))); } - return (r.lastHPos = o.ch), o; + return ((r.lastHPos = o.ch), o); }, moveByPage: function (e, t, n) { var r = t, @@ -3579,7 +3582,7 @@ define("ace/keyboard/vim", [ var s = pt.moveByDisplayLines(e, t, n, r); if (!s) return null; var a = e.charCoords(s, "local"); - return e.scrollTo(null, i.top + a.top - u.top), s; + return (e.scrollTo(null, i.top + a.top - u.top), s); }, moveByWords: function (e, t, n) { return sn(e, t, n.repeat, !!n.forward, !!n.wordEnd, !!n.bigWord); @@ -3588,11 +3591,11 @@ define("ace/keyboard/vim", [ var r = n.repeat, i = on(e, r, n.forward, n.selectedCharacter), s = n.forward ? -1 : 1; - return Zt(s, n), i ? ((i.ch += s), i) : null; + return (Zt(s, n), i ? ((i.ch += s), i) : null); }, moveToCharacter: function (e, t, n) { var r = n.repeat; - return Zt(0, n), on(e, r, n.forward, n.selectedCharacter) || t; + return (Zt(0, n), on(e, r, n.forward, n.selectedCharacter) || t); }, moveToSymbol: function (e, t, n) { var r = n.repeat; @@ -3600,14 +3603,18 @@ define("ace/keyboard/vim", [ }, moveToColumn: function (e, t, n, r) { var i = n.repeat; - return (r.lastHPos = i - 1), (r.lastHSPos = e.charCoords(t, "div").left), un(e, i); + return ( + (r.lastHPos = i - 1), + (r.lastHSPos = e.charCoords(t, "div").left), + un(e, i) + ); }, moveToEol: function (e, t, n, r) { var i = t; r.lastHPos = Infinity; var s = E(i.line + n.repeat - 1, Infinity), o = e.clipPos(s); - return o.ch--, (r.lastHSPos = e.charCoords(o, "div").left), s; + return (o.ch--, (r.lastHSPos = e.charCoords(o, "div").left), s); }, moveToFirstNonWhiteSpaceCharacter: function (e, t) { var n = t; @@ -3655,11 +3662,11 @@ define("ace/keyboard/vim", [ else if (o === "w") a = Gt(e, u, !0, !1); else { if (o !== "p") return null; - (a = ln(e, t, n.repeat, 0, u)), (n.linewise = !0); + ((a = ln(e, t, n.repeat, 0, u)), (n.linewise = !0)); if (r.visualMode) r.visualLine || (r.visualLine = !0); else { var f = r.inputState.operatorArgs; - f && (f.linewise = !0), a.end.line--; + (f && (f.linewise = !0), a.end.line--); } } return e.state.vim.visualMode ? zt(e, a.start, a.end) : [a.start, a.end]; @@ -3669,7 +3676,7 @@ define("ace/keyboard/vim", [ i = n.repeat, s = n.forward === r.forward, o = (r.increment ? 1 : 0) * (s ? -1 : 1); - e.moveH(-o, "char"), (n.inclusive = s ? !0 : !1); + (e.moveH(-o, "char"), (n.inclusive = s ? !0 : !1)); var u = on(e, i, s, r.selectedCharacter); return u ? ((u.ch += o), u) : (e.moveH(o, "char"), t); }, @@ -3694,26 +3701,26 @@ define("ace/keyboard/vim", [ } var l = new E(o.line - 1, Number.MAX_VALUE), c = e.firstLine() == e.lastLine(); - u.line > e.lastLine() && t.linewise && !c + (u.line > e.lastLine() && t.linewise && !c ? e.replaceRange("", l, u) : e.replaceRange("", o, u), t.linewise && (c || (e.setCursor(l), v.commands.newlineAndIndent(e)), (o.ch = Number.MAX_VALUE)), - (r = o); + (r = o)); } else { i = e.getSelection(); var h = vt("", n.length); - e.replaceSelections(h), (r = Mt(n[0].head, n[0].anchor)); + (e.replaceSelections(h), (r = Mt(n[0].head, n[0].anchor))); } - nt.registerController.pushText( + (nt.registerController.pushText( t.registerName, "change", i, t.linewise, n.length > 1, ), - yt.enterInsertMode(e, { head: r }, e.state.vim); + yt.enterInsertMode(e, { head: r }, e.state.vim)); }, delete: function (e, t, n) { var r, @@ -3722,7 +3729,7 @@ define("ace/keyboard/vim", [ if (!s.visualBlock) { var o = n[0].anchor, u = n[0].head; - t.linewise && + (t.linewise && u.line != e.firstLine() && o.line == e.lastLine() && o.line == u.line - 1 && @@ -3732,11 +3739,11 @@ define("ace/keyboard/vim", [ (i = e.getRange(o, u)), e.replaceRange("", o, u), (r = o), - t.linewise && (r = pt.moveToFirstNonWhiteSpaceCharacter(e, o)); + t.linewise && (r = pt.moveToFirstNonWhiteSpaceCharacter(e, o))); } else { i = e.getSelection(); var a = vt("", n.length); - e.replaceSelections(a), (r = n[0].anchor); + (e.replaceSelections(a), (r = n[0].anchor)); } nt.registerController.pushText( t.registerName, @@ -3811,9 +3818,9 @@ define("ace/keyboard/vim", [ s = nt.jumpList, o = s.move(e, i ? r : -r), u = o ? o.find() : undefined; - (u = u ? u : e.getCursor()), + ((u = u ? u : e.getCursor()), e.setCursor(u), - (e.ace.curOp.command.scrollIntoView = "center-animate"); + (e.ace.curOp.command.scrollIntoView = "center-animate")); }, scroll: function (e, t, n) { if (n.visualMode) return; @@ -3884,7 +3891,7 @@ define("ace/keyboard/vim", [ }, enterInsertMode: function (e, t, n) { if (e.getOption("readOnly")) return; - (n.insertMode = !0), (n.insertModeRepeat = (t && t.repeat) || 1); + ((n.insertMode = !0), (n.insertModeRepeat = (t && t.repeat) || 1)); var r = t ? t.insertAt : null, i = n.sel, s = t.head || e.getCursor("head"), @@ -3913,7 +3920,7 @@ define("ace/keyboard/vim", [ ? (s = St(i.head, 0, 1)) : (s = E(i.anchor.line, 0)); else if (r == "inplace" && n.visualMode) return; - e.setOption("disableInput", !1), + (e.setOption("disableInput", !1), t && t.replace ? (e.toggleOverwrite(!0), e.setOption("keyMap", "vim-replace"), @@ -3924,7 +3931,7 @@ define("ace/keyboard/vim", [ nt.macroModeState.isPlaying || (e.on("change", Qn), v.on(e.getInputField(), "keydown", tr)), n.visualMode && $t(e), - It(e, s, o); + It(e, s, o)); }, toggleVisualMode: function (e, t, n) { var r = t.repeat, @@ -3960,7 +3967,7 @@ define("ace/keyboard/vim", [ var i = r.anchorMark.find(), s = r.headMark.find(); if (!i || !s) return; - (n.sel = { anchor: i, head: s }), + ((n.sel = { anchor: i, head: s }), (n.visualMode = !0), (n.visualLine = r.visualLine), (n.visualBlock = r.visualBlock), @@ -3970,41 +3977,41 @@ define("ace/keyboard/vim", [ v.signal(e, "vim-mode-change", { mode: "visual", subMode: n.visualLine ? "linewise" : n.visualBlock ? "blockwise" : "", - }); + })); } }, joinLines: function (e, t, n) { var r, i; if (n.visualMode) { - (r = e.getCursor("anchor")), (i = e.getCursor("head")); + ((r = e.getCursor("anchor")), (i = e.getCursor("head"))); if (Ot(i, r)) { var s = i; - (i = r), (r = s); + ((i = r), (r = s)); } i.ch = Pt(e, i.line) - 1; } else { var o = Math.max(t.repeat, 2); - (r = e.getCursor()), (i = wt(e, E(r.line + o - 1, Infinity))); + ((r = e.getCursor()), (i = wt(e, E(r.line + o - 1, Infinity)))); } var u = 0; for (var a = r.line; a < i.line; a++) { u = Pt(e, r.line); var s = E(r.line + 1, Pt(e, r.line + 1)), f = e.getRange(r, s); - (f = f.replace(/\n\s*/g, " ")), e.replaceRange(f, r, s); + ((f = f.replace(/\n\s*/g, " ")), e.replaceRange(f, r, s)); } var l = E(r.line, u); - n.visualMode && $t(e, !1), e.setCursor(l); + (n.visualMode && $t(e, !1), e.setCursor(l)); }, newLineAndEnterInsertMode: function (e, t, n) { n.insertMode = !0; var r = Lt(e.getCursor()); if (r.line === e.firstLine() && !t.after) - e.replaceRange("\n", E(e.firstLine(), 0)), e.setCursor(e.firstLine(), 0); + (e.replaceRange("\n", E(e.firstLine(), 0)), e.setCursor(e.firstLine(), 0)); else { - (r.line = t.after ? r.line : r.line - 1), + ((r.line = t.after ? r.line : r.line - 1), (r.ch = Pt(e, r.line)), - e.setCursor(r); + e.setCursor(r)); var i = v.commands.newlineAndIndentContinueComment || v.commands.newlineAndIndent; i(e); @@ -4067,7 +4074,7 @@ define("ace/keyboard/vim", [ x = e.getSelection(), T = e.listSelections(), N = new Array(T.length).join("1").split("1"); - n.lastSelection && (y = n.lastSelection.headMark.find()), + (n.lastSelection && (y = n.lastSelection.headMark.find()), nt.registerController.unnamedRegister.setText(x), d ? (e.replaceSelections(N), @@ -4084,7 +4091,7 @@ define("ace/keyboard/vim", [ : (e.replaceRange(s, w, S), (m = e.posFromIndex(e.indexFromPos(w) + s.length - 1))), y && (n.lastSelection.headMark = e.setBookmark(y)), - p && (m.ch = 0); + p && (m.ch = 0)); } else if (d) { e.setCursor(r); for (var v = 0; v < s.length; v++) { @@ -4093,24 +4100,24 @@ define("ace/keyboard/vim", [ var k = Pt(e, C); k < r.ch && jt(e, C, r.ch); } - e.setCursor(r), + (e.setCursor(r), Ft(e, E(r.line + s.length - 1, r.ch)), e.replaceSelections(s), - (m = r); + (m = r)); } else - e.replaceRange(s, r), + (e.replaceRange(s, r), p && t.after ? (m = E(r.line + 1, Qt(e.getLine(r.line + 1)))) : p && !t.after ? (m = E(r.line, Qt(e.getLine(r.line)))) : !p && t.after ? ((g = e.indexFromPos(r)), (m = e.posFromIndex(g + s.length - 1))) - : ((g = e.indexFromPos(r)), (m = e.posFromIndex(g + s.length))); - n.visualMode && $t(e, !1), e.setCursor(m); + : ((g = e.indexFromPos(r)), (m = e.posFromIndex(g + s.length)))); + (n.visualMode && $t(e, !1), e.setCursor(m)); }, undo: function (e, t) { e.operation(function () { - kt(e, v.commands.undo, t.repeat)(), e.setCursor(e.getCursor("anchor")); + (kt(e, v.commands.undo, t.repeat)(), e.setCursor(e.getCursor("anchor"))); }); }, redo: function (e, t) { @@ -4129,24 +4136,24 @@ define("ace/keyboard/vim", [ s, o, u = e.listSelections(); - if (n.visualMode) (i = e.getCursor("start")), (o = e.getCursor("end")); + if (n.visualMode) ((i = e.getCursor("start")), (o = e.getCursor("end"))); else { var a = e.getLine(i.line); - (s = i.ch + t.repeat), s > a.length && (s = a.length), (o = E(i.line, s)); + ((s = i.ch + t.repeat), s > a.length && (s = a.length), (o = E(i.line, s))); } if (r == "\n") - n.visualMode || e.replaceRange("", i, o), + (n.visualMode || e.replaceRange("", i, o), (v.commands.newlineAndIndentContinueComment || v.commands.newlineAndIndent)( e, - ); + )); else { var f = e.getRange(i, o); f = f.replace(/[^\n]/g, r); if (n.visualBlock) { var l = new Array(e.getOption("tabSize") + 1).join(" "); - (f = e.getSelection()), + ((f = e.getSelection()), (f = f.replace(/\t/g, l).replace(/[^\n]/g, r).split("\n")), - e.replaceSelections(f); + e.replaceSelections(f)); } else e.replaceRange(f, i, o); n.visualMode ? ((i = Ot(u[0].anchor, u[0].head) ? u[0].anchor : u[0].head), @@ -4164,7 +4171,7 @@ define("ace/keyboard/vim", [ u, a; while ((s = i.exec(r)) !== null) { - (o = s.index), (u = o + s[0].length); + ((o = s.index), (u = o + s[0].length)); if (n.ch < u) break; } if (!t.backtrack && u <= n.ch) return; @@ -4179,16 +4186,16 @@ define("ace/keyboard/vim", [ a.charAt(0) === "-" ? (a = "-" + f + d + a.substr(1)) : (a = f + d + a); var v = E(n.line, o), m = E(n.line, u); - e.replaceRange(a, v, m), e.setCursor(E(n.line, o + a.length - 1)); + (e.replaceRange(a, v, m), e.setCursor(E(n.line, o + a.length - 1))); }, repeatLastEdit: function (e, t, n) { var r = n.lastEditInputState; if (!r) return; var i = t.repeat; - i && t.repeatIsExplicit + (i && t.repeatIsExplicit ? (n.lastEditInputState.repeatOverride = i) : (i = n.lastEditInputState.repeatOverride || i), - nr(e, n, i, !1); + nr(e, n, i, !1)); }, indent: function (e, t) { e.indentLine(e.getCursor().line, t.indentRight); @@ -4220,8 +4227,8 @@ define("ace/keyboard/vim", [ }, section: { init: function (e) { - (e.curMoveThrough = !0), - (e.symb = (e.forward ? "]" : "[") === e.symb ? "{" : "}"); + ((e.curMoveThrough = !0), + (e.symb = (e.forward ? "]" : "[") === e.symb ? "{" : "}")); }, isComplete: function (e) { return e.index === 0 && e.nextCh === e.symb; @@ -4230,13 +4237,13 @@ define("ace/keyboard/vim", [ comment: { isComplete: function (e) { var t = e.lastCh === "*" && e.nextCh === "/"; - return (e.lastCh = e.nextCh), t; + return ((e.lastCh = e.nextCh), t); }, }, method: { init: function (e) { - (e.symb = e.symb === "m" ? "{" : "}"), - (e.reverseSymb = e.symb === "{" ? "}" : "{"); + ((e.symb = e.symb === "m" ? "{" : "}"), + (e.reverseSymb = e.symb === "{" ? "}" : "{")); }, isComplete: function (e) { return e.nextCh === e.symb ? !0 : !1; @@ -4262,7 +4269,7 @@ define("ace/keyboard/vim", [ }, }, }; - K("pcre", !0, "boolean"), + (K("pcre", !0, "boolean"), (pn.prototype = { getQuery: function () { return nt.query; @@ -4288,7 +4295,7 @@ define("ace/keyboard/vim", [ setScrollbarAnnotate: function (e) { this.annotate = e; }, - }); + })); var En = { "\\n": "\n", "\\r": "\r", "\\t": " " }, xn = { "\\/": "/", "\\\\": "\\", "\\n": "\n", "\\r": "\r", "\\t": " " }, Ln = "(Javascript regexp)", @@ -4299,7 +4306,7 @@ define("ace/keyboard/vim", [ processCommand: function (e, t, n) { var r = this; e.operation(function () { - (e.curOp.isVimOp = !0), r._processCommand(e, t, n); + ((e.curOp.isVimOp = !0), r._processCommand(e, t, n)); }); }, _processCommand: function (e, t, n) { @@ -4321,9 +4328,9 @@ define("ace/keyboard/vim", [ else { f = this.matchCommand_(u.commandName); if (f) { - (l = f.name), + ((l = f.name), f.excludeFromCommandHistory && i.setText(s), - this.parseCommandArgs_(o, u, f); + this.parseCommandArgs_(o, u, f)); if (f.type == "exToKey") { for (var c = 0; c < f.toKeys.length; c++) v.Vim.handleKey(e, f.toKeys[c], "mapping"); @@ -4340,21 +4347,21 @@ define("ace/keyboard/vim", [ return; } try { - qn[l](e, u), (!f || !f.possiblyAsync) && u.callback && u.callback(); + (qn[l](e, u), (!f || !f.possiblyAsync) && u.callback && u.callback()); } catch (a) { throw (Cn(e, a), a); } }, parseInput_: function (e, t, n) { - t.eatWhile(":"), + (t.eatWhile(":"), t.eat("%") ? ((n.line = e.firstLine()), (n.lineEnd = e.lastLine())) : ((n.line = this.parseLineSpec_(e, t)), n.line !== undefined && t.eat(",") && - (n.lineEnd = this.parseLineSpec_(e, t))); + (n.lineEnd = this.parseLineSpec_(e, t)))); var r = t.match(/^(\w+)/); - return r ? (n.commandName = r[1]) : (n.commandName = t.match(/.*/)[0]), n; + return (r ? (n.commandName = r[1]) : (n.commandName = t.match(/.*/)[0]), n); }, parseLineSpec_: function (e, t) { var n = t.match(/^(\d+)/); @@ -4371,9 +4378,9 @@ define("ace/keyboard/vim", [ return this.parseLineSpecOffset_(t, i.line); case "-": case "+": - return t.backUp(1), this.parseLineSpecOffset_(t, e.getCursor().line); + return (t.backUp(1), this.parseLineSpecOffset_(t, e.getCursor().line)); default: - return t.backUp(1), undefined; + return (t.backUp(1), undefined); } }, parseLineSpecOffset_: function (e, t) { @@ -4423,10 +4430,10 @@ define("ace/keyboard/vim", [ : (this.commandMap_[r] = { name: r, type: "exToKey", toKeys: t, user: !0 }); } else if (t != ":" && t.charAt(0) == ":") { var i = { keys: e, type: "keyToEx", exArgs: { input: t.substring(1) } }; - n && (i.context = n), b.unshift(i); + (n && (i.context = n), b.unshift(i)); } else { var i = { keys: e, type: "keyToKey", toKeys: t }; - n && (i.context = n), b.unshift(i); + (n && (i.context = n), b.unshift(i)); } }, unmap: function (e, t) { @@ -4501,7 +4508,7 @@ define("ace/keyboard/vim", [ u = !1; if (s.charAt(s.length - 1) == "?") { if (o) throw Error("Trailing characters: " + t.argString); - (s = s.substring(0, s.length - 1)), (u = !0); + ((s = s.substring(0, s.length - 1)), (u = !0)); } o === undefined && s.substring(0, 2) == "no" && ((s = s.substring(2)), (o = !1)); var a = J[s] && J[s].type == "boolean"; @@ -4519,10 +4526,10 @@ define("ace/keyboard/vim", [ } }, setlocal: function (e, t) { - (t.setCfg = { scope: "local" }), this.set(e, t); + ((t.setCfg = { scope: "local" }), this.set(e, t)); }, setglobal: function (e, t) { - (t.setCfg = { scope: "global" }), this.set(e, t); + ((t.setCfg = { scope: "global" }), this.set(e, t)); }, registers: function (e, t) { var n = t.args, @@ -4555,7 +4562,7 @@ define("ace/keyboard/vim", [ var u = e.match(/([dinuox]+)?\s*(\/.+\/)?\s*/); if (!u && !e.eol()) return "Invalid arguments"; if (u[1]) { - (r = u[1].indexOf("i") != -1), (i = u[1].indexOf("u") != -1); + ((r = u[1].indexOf("i") != -1), (i = u[1].indexOf("u") != -1)); var a = u[1].indexOf("d") != -1 || (u[1].indexOf("n") != -1 && 1), f = u[1].indexOf("x") != -1 && 1, l = u[1].indexOf("o") != -1 && 1; @@ -4568,7 +4575,7 @@ define("ace/keyboard/vim", [ function S(e, t) { if (n) { var i; - (i = e), (e = t), (t = i); + ((i = e), (e = t), (t = i)); } r && ((e = e.toLowerCase()), (t = t.toLowerCase())); var o = s && d.exec(e), @@ -4584,7 +4591,7 @@ define("ace/keyboard/vim", [ function x(e, t) { if (n) { var i; - (i = e), (e = t), (t = i); + ((i = e), (e = t), (t = i)); } return ( r && ((e[0] = e[0].toLowerCase()), (t[0] = t[0].toLowerCase())), @@ -4637,7 +4644,7 @@ define("ace/keyboard/vim", [ var T = p, N; p = []; - for (var b = 0; b < T.length; b++) T[b] != N && p.push(T[b]), (N = T[b]); + for (var b = 0; b < T.length; b++) (T[b] != N && p.push(T[b]), (N = T[b])); } e.replaceRange(p.join("\n"), c, h); }, @@ -4696,7 +4703,7 @@ define("ace/keyboard/vim", [ f = !1, l = !1; if (r.length) - (i = r[0]), + ((i = r[0]), (s = r[1]), i && i[i.length - 1] === "$" && @@ -4704,7 +4711,7 @@ define("ace/keyboard/vim", [ s !== undefined && (G("pcre") ? (s = Tn(s)) : (s = Sn(s)), (nt.lastSubstituteReplacePart = s)), - (o = r[2] ? r[2].split(" ") : []); + (o = r[2] ? r[2].split(" ") : [])); else if (n && n.length) { Cn(e, "Substitutions should be of the form :s/pattern/replace/"); return; @@ -4732,8 +4739,8 @@ define("ace/keyboard/vim", [ p = h.getQuery(), d = t.line !== undefined ? t.line : e.getCursor().line, v = t.lineEnd || d; - d == e.firstLine() && v == e.lastLine() && (v = Infinity), - a && ((d = v), (v = d + a - 1)); + (d == e.firstLine() && v == e.lastLine() && (v = Infinity), + a && ((d = v), (v = d + a - 1))); var m = wt(e, E(d, 0)), g = e.getSearchCursor(p, m); Un(e, f, l, d, v, g, p, s, t.callback); @@ -4793,7 +4800,7 @@ define("ace/keyboard/vim", [ }, }, Rn = new In(); - (v.keyMap.vim = { attach: C, detach: N, call: k }), + ((v.keyMap.vim = { attach: C, detach: N, call: k }), K("insertModeEscKeysTimeout", 200, "number"), (v.keyMap["vim-insert"] = { "Ctrl-N": "autocomplete", @@ -4816,7 +4823,7 @@ define("ace/keyboard/vim", [ }), rt(), (v.Vim = S()), - (S = v.Vim); + (S = v.Vim)); var ir = { return: "CR", backspace: "BS", @@ -4834,14 +4841,14 @@ define("ace/keyboard/vim", [ enter: "CR", }, or = S.handleKey.bind(S); - (S.handleKey = function (e, t, n) { + ((S.handleKey = function (e, t, n) { return e.operation(function () { return or(e, t, n); }, !0); }), - (t.CodeMirror = v); + (t.CodeMirror = v)); var fr = S.maybeInitVimState_; - (t.handler = { + ((t.handler = { $id: "ace/keyboard/vim", drawCursor: function (e, t, n, r, s) { var u = this.state.vim || {}, @@ -4855,10 +4862,10 @@ define("ace/keyboard/vim", [ : s.selection.isBackwards() || s.selection.isEmpty(); !h && c > a && (c -= a); } - !u.insertMode && u.status && ((f /= 2), (l += f)), + (!u.insertMode && u.status && ((f /= 2), (l += f)), o.translate(e, c, l), o.setStyle(e.style, "width", a + "px"), - o.setStyle(e.style, "height", f + "px"); + o.setStyle(e.style, "height", f + "px")); }, handleKeyboard: function (e, t, n, r, i) { var s = e.editor, @@ -4893,9 +4900,9 @@ define("ace/keyboard/vim", [ h = sr(t, n, i || {}); u.status == null && (u.status = ""); var p = ar(o, h, "user"); - (u = fr(o)), + ((u = fr(o)), p && u.status != null ? (u.status += h) : u.status == null && (u.status = ""), - o._signal("changeStatus"); + o._signal("changeStatus")); if (!p && (t != -1 || l)) return; return { command: "null", passEvent: !p }; } @@ -4903,43 +4910,43 @@ define("ace/keyboard/vim", [ attach: function (e) { function n() { var n = fr(t).insertMode; - t.ace.renderer.setStyle("normal-mode", !n), + (t.ace.renderer.setStyle("normal-mode", !n), e.textInput.setCommandMode(!n), (e.renderer.$keepTextAreaAtCursor = n), - (e.renderer.$blockCursor = !n); + (e.renderer.$blockCursor = !n)); } e.state || (e.state = {}); var t = new v(e); - (e.state.cm = t), + ((e.state.cm = t), (e.$vimModeHandler = this), v.keyMap.vim.attach(t), (fr(t).status = null), t.on("vim-command-done", function () { if (t.virtualSelectionMode()) return; - (fr(t).status = null), + ((fr(t).status = null), t.ace._signal("changeStatus"), - t.ace.session.markUndoGroup(); + t.ace.session.markUndoGroup()); }), t.on("changeStatus", function () { - t.ace.renderer.updateCursor(), t.ace._signal("changeStatus"); + (t.ace.renderer.updateCursor(), t.ace._signal("changeStatus")); }), t.on("vim-mode-change", function () { if (t.virtualSelectionMode()) return; - n(), t._signal("changeStatus"); + (n(), t._signal("changeStatus")); }), n(), - (e.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(t)); + (e.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(t))); }, detach: function (e) { var t = e.state.cm; - v.keyMap.vim.detach(t), + (v.keyMap.vim.detach(t), t.destroy(), (e.state.cm = null), (e.$vimModeHandler = null), (e.renderer.$cursorLayer.drawCursor = null), e.renderer.setStyle("normal-mode", !1), e.textInput.setCommandMode(!1), - (e.renderer.$keepTextAreaAtCursor = !0); + (e.renderer.$keepTextAreaAtCursor = !0)); }, getStatusText: function (e) { var t = e.state.cm, @@ -5028,8 +5035,10 @@ define("ace/keyboard/vim", [ }, ), (yt.aceCommand = function (e, t, n) { - (e.vimCmd = t), - e.ace.inVirtualSelectionMode ? e.ace.on("beforeEndOperation", lr) : lr(null, e.ace); + ((e.vimCmd = t), + e.ace.inVirtualSelectionMode + ? e.ace.on("beforeEndOperation", lr) + : lr(null, e.ace)); }), (yt.fold = function (e, t, n) { e.ace.execCommand( @@ -5041,7 +5050,7 @@ define("ace/keyboard/vim", [ (t.handler.defaultKeymap = b), (t.handler.actions = yt), (t.Vim = S), - S.map("Y", "yy", "normal"); + S.map("Y", "yy", "normal")); }); (function () { window.require(["ace/keyboard/vim"], function (m) { diff --git a/web/static/ace/mode-json.js b/web/static/ace/mode-json.js index cff4390fa..e4e1d2281 100644 --- a/web/static/ace/mode-json.js +++ b/web/static/ace/mode-json.js @@ -1,4 +1,4 @@ -define( +(define( "ace/mode/json_highlight_rules", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text_highlight_rules"], function (e, t, n) { @@ -37,7 +37,7 @@ define( ], }; }; - r.inherits(s, i), (t.JsonHighlightRules = s); + (r.inherits(s, i), (t.JsonHighlightRules = s)); }, ), define( @@ -47,8 +47,8 @@ define( "use strict"; var r = e("../range").Range, i = function () {}; - (function () { - (this.checkOutdent = function (e, t) { + ((function () { + ((this.checkOutdent = function (e, t) { return /^\s+$/.test(e) ? /^\s*\}/.test(t) : !1; }), (this.autoOutdent = function (e, t) { @@ -63,9 +63,9 @@ define( }), (this.$getIndent = function (e) { return e.match(/^\s*/)[0]; - }); + })); }).call(i.prototype), - (t.MatchingBraceOutdent = i); + (t.MatchingBraceOutdent = i)); }, ), define( @@ -85,9 +85,9 @@ define( this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + e.end), ))); }); - r.inherits(o, s), + (r.inherits(o, s), function () { - (this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/), + ((this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/), (this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/), (this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/), (this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/), @@ -169,8 +169,8 @@ define( } var l = n; if (l > o) return new i(o, r, l, t.length); - }); - }.call(o.prototype); + })); + }.call(o.prototype)); }, ), define( @@ -197,14 +197,14 @@ define( a = e("./folding/cstyle").FoldMode, f = e("../worker/worker_client").WorkerClient, l = function () { - (this.HighlightRules = s), + ((this.HighlightRules = s), (this.$outdent = new o()), (this.$behaviour = new u()), - (this.foldingRules = new a()); + (this.foldingRules = new a())); }; - r.inherits(l, i), + (r.inherits(l, i), function () { - (this.getNextLineIndent = function (e, t, n) { + ((this.getNextLineIndent = function (e, t, n) { var r = this.$getIndent(t); if (e == "start") { var i = t.match(/^.*[\{\(\[]\s*$/); @@ -231,11 +231,11 @@ define( t ); }), - (this.$id = "ace/mode/json"); + (this.$id = "ace/mode/json")); }.call(l.prototype), - (t.Mode = l); + (t.Mode = l)); }, - ); + )); (function () { window.require(["ace/mode/json"], function (m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/web/static/ace/theme-dark.js b/web/static/ace/theme-dark.js index f36b95101..5bd32e670 100644 --- a/web/static/ace/theme-dark.js +++ b/web/static/ace/theme-dark.js @@ -1,8 +1,8 @@ define("ace/theme/dark", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { - (t.isDark = !0), + ((t.isDark = !0), (t.cssClass = "ace-chaos"), (t.cssText = - ".ace-chaos .ace_scroller { background: #000!important;} .ace-chaos .ace_gutter {background: #141414;color: #595959;border-right: 1px solid #282828;}.ace-chaos .ace_gutter-cell.ace_warning {background-image: none;background: #FC0;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_gutter-cell.ace_error {background-position: -6px center;background-image: none;background: #F10;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_print-margin {border-left: 1px solid #555;right: 0;background: #1D1D1D;}.ace-chaos {background-color: #161616;color: #FFF;}.ace-chaos .ace_cursor {border-left: 2px solid #FFFFFF;}.ace-chaos .ace_cursor.ace_overwrite {border-left: 0px;border-bottom: 1px solid #FFFFFF;}.ace-chaos .ace_marker-layer .ace_selection {background: #102510;}.ace-chaos .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-chaos .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #FCE94F;}.ace-chaos .ace_marker-layer .ace_active-line {background: #333;}.ace-chaos .ace_gutter-active-line {background-color: #222;}.ace-chaos .ace_invisible {color: #404040;}.ace-chaos .ace_keyword {color:#00698F;}.ace-chaos .ace_keyword.ace_operator {color:#FF308F;}.ace-chaos .ace_constant {color:#1EDAFB;}.ace-chaos .ace_constant.ace_language {color:#EFA060;}.ace-chaos .ace_constant.ace_library {color:#8DFF0A;}.ace-chaos .ace_constant.ace_numeric {color:#FF6050;}.ace-chaos .ace_invalid {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_invalid.ace_deprecated {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_support {color: #999;}.ace-chaos .ace_support.ace_function {color:#00AEEF;}.ace-chaos .ace_function {color:#00AEEF;}.ace-chaos .ace_string {color:#60A060;}.ace-chaos .ace_comment {color:#555;font-style:italic;padding-bottom: 0px;}.ace-chaos .ace_variable {color:#a0a0a0;}.ace-chaos .ace_meta.ace_tag {color:#BE53E6;}.ace-chaos .ace_entity.ace_other.ace_attribute-name {color:#FFFF89;}.ace-chaos .ace_markup.ace_underline {text-decoration: underline;}.ace-chaos .ace_fold-widget {text-align: center;}.ace-chaos .ace_fold-widget:hover {color: #777;}.ace-chaos .ace_fold-widget.ace_start,.ace-chaos .ace_fold-widget.ace_end,.ace-chaos .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-chaos .ace_fold-widget.ace_start:after {content: '\u25be'}.ace-chaos .ace_fold-widget.ace_end:after {content: '\u25b4'}.ace-chaos .ace_fold-widget.ace_closed:after {content: '\u2023'}.ace-chaos .ace_indent-guide {border-right:1px dotted #333;margin-right:-1px;}.ace-chaos .ace_fold { background: #222; border-radius: 3px; color: #7AF; border: none; }.ace-chaos .ace_fold:hover {background: #CCC; color: #000;}"); + ".ace-chaos .ace_scroller { background: #000!important;} .ace-chaos .ace_gutter {background: #141414;color: #595959;border-right: 1px solid #282828;}.ace-chaos .ace_gutter-cell.ace_warning {background-image: none;background: #FC0;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_gutter-cell.ace_error {background-position: -6px center;background-image: none;background: #F10;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_print-margin {border-left: 1px solid #555;right: 0;background: #1D1D1D;}.ace-chaos {background-color: #161616;color: #FFF;}.ace-chaos .ace_cursor {border-left: 2px solid #FFFFFF;}.ace-chaos .ace_cursor.ace_overwrite {border-left: 0px;border-bottom: 1px solid #FFFFFF;}.ace-chaos .ace_marker-layer .ace_selection {background: #102510;}.ace-chaos .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-chaos .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #FCE94F;}.ace-chaos .ace_marker-layer .ace_active-line {background: #333;}.ace-chaos .ace_gutter-active-line {background-color: #222;}.ace-chaos .ace_invisible {color: #404040;}.ace-chaos .ace_keyword {color:#00698F;}.ace-chaos .ace_keyword.ace_operator {color:#FF308F;}.ace-chaos .ace_constant {color:#1EDAFB;}.ace-chaos .ace_constant.ace_language {color:#EFA060;}.ace-chaos .ace_constant.ace_library {color:#8DFF0A;}.ace-chaos .ace_constant.ace_numeric {color:#FF6050;}.ace-chaos .ace_invalid {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_invalid.ace_deprecated {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_support {color: #999;}.ace-chaos .ace_support.ace_function {color:#00AEEF;}.ace-chaos .ace_function {color:#00AEEF;}.ace-chaos .ace_string {color:#60A060;}.ace-chaos .ace_comment {color:#555;font-style:italic;padding-bottom: 0px;}.ace-chaos .ace_variable {color:#a0a0a0;}.ace-chaos .ace_meta.ace_tag {color:#BE53E6;}.ace-chaos .ace_entity.ace_other.ace_attribute-name {color:#FFFF89;}.ace-chaos .ace_markup.ace_underline {text-decoration: underline;}.ace-chaos .ace_fold-widget {text-align: center;}.ace-chaos .ace_fold-widget:hover {color: #777;}.ace-chaos .ace_fold-widget.ace_start,.ace-chaos .ace_fold-widget.ace_end,.ace-chaos .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-chaos .ace_fold-widget.ace_start:after {content: '\u25be'}.ace-chaos .ace_fold-widget.ace_end:after {content: '\u25b4'}.ace-chaos .ace_fold-widget.ace_closed:after {content: '\u2023'}.ace-chaos .ace_indent-guide {border-right:1px dotted #333;margin-right:-1px;}.ace-chaos .ace_fold { background: #222; border-radius: 3px; color: #7AF; border: none; }.ace-chaos .ace_fold:hover {background: #CCC; color: #000;}")); var r = e("../lib/dom"); r.importCssString(t.cssText, t.cssClass); }); diff --git a/web/static/ace/theme-light.js b/web/static/ace/theme-light.js index f41bded2e..23a231ee5 100644 --- a/web/static/ace/theme-light.js +++ b/web/static/ace/theme-light.js @@ -1,8 +1,8 @@ define("ace/theme/light", ["require", "exports", "module", "ace/lib/dom"], function (e, t, n) { - (t.isDark = !1), + ((t.isDark = !1), (t.cssClass = "ace-dawn"), (t.cssText = - ".ace-dawn .ace_scroller { background-color: #FFF!important;} .ace-dawn .ace_gutter {background: #ebebeb;color: #333}.ace-dawn .ace_print-margin {width: 1px;background: #e8e8e8}.ace-dawn {background-color: #F9F9F9;color: #080808}.ace-dawn .ace_cursor {color: #000000}.ace-dawn .ace_marker-layer .ace_selection {background: rgba(39, 95, 255, 0.30)}.ace-dawn.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #F9F9F9;}.ace-dawn .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-dawn .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(75, 75, 126, 0.50)}.ace-dawn .ace_marker-layer .ace_active-line {background: rgba(36, 99, 180, 0.12)}.ace-dawn .ace_gutter-active-line {background-color : #dcdcdc}.ace-dawn .ace_marker-layer .ace_selected-word {border: 1px solid rgba(39, 95, 255, 0.30)}.ace-dawn .ace_invisible {color: rgba(75, 75, 126, 0.50)}.ace-dawn .ace_keyword,.ace-dawn .ace_meta {color: #794938}.ace-dawn .ace_constant,.ace-dawn .ace_constant.ace_character,.ace-dawn .ace_constant.ace_character.ace_escape,.ace-dawn .ace_constant.ace_other {color: #811F24}.ace-dawn .ace_invalid.ace_illegal {text-decoration: underline;font-style: italic;color: #F8F8F8;background-color: #B52A1D}.ace-dawn .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #B52A1D}.ace-dawn .ace_support {color: #691C97}.ace-dawn .ace_support.ace_constant {color: #B4371F}.ace-dawn .ace_fold {background-color: #794938;border-color: #080808}.ace-dawn .ace_list,.ace-dawn .ace_markup.ace_list,.ace-dawn .ace_support.ace_function {color: #693A17}.ace-dawn .ace_storage {font-style: italic;color: #A71D5D}.ace-dawn .ace_string {color: #0B6125}.ace-dawn .ace_string.ace_regexp {color: #CF5628}.ace-dawn .ace_comment {font-style: italic;color: #5A525F}.ace-dawn .ace_heading,.ace-dawn .ace_markup.ace_heading {color: #19356D}.ace-dawn .ace_variable {color: #234A97}.ace-dawn .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y}"); + ".ace-dawn .ace_scroller { background-color: #FFF!important;} .ace-dawn .ace_gutter {background: #ebebeb;color: #333}.ace-dawn .ace_print-margin {width: 1px;background: #e8e8e8}.ace-dawn {background-color: #F9F9F9;color: #080808}.ace-dawn .ace_cursor {color: #000000}.ace-dawn .ace_marker-layer .ace_selection {background: rgba(39, 95, 255, 0.30)}.ace-dawn.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #F9F9F9;}.ace-dawn .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-dawn .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(75, 75, 126, 0.50)}.ace-dawn .ace_marker-layer .ace_active-line {background: rgba(36, 99, 180, 0.12)}.ace-dawn .ace_gutter-active-line {background-color : #dcdcdc}.ace-dawn .ace_marker-layer .ace_selected-word {border: 1px solid rgba(39, 95, 255, 0.30)}.ace-dawn .ace_invisible {color: rgba(75, 75, 126, 0.50)}.ace-dawn .ace_keyword,.ace-dawn .ace_meta {color: #794938}.ace-dawn .ace_constant,.ace-dawn .ace_constant.ace_character,.ace-dawn .ace_constant.ace_character.ace_escape,.ace-dawn .ace_constant.ace_other {color: #811F24}.ace-dawn .ace_invalid.ace_illegal {text-decoration: underline;font-style: italic;color: #F8F8F8;background-color: #B52A1D}.ace-dawn .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #B52A1D}.ace-dawn .ace_support {color: #691C97}.ace-dawn .ace_support.ace_constant {color: #B4371F}.ace-dawn .ace_fold {background-color: #794938;border-color: #080808}.ace-dawn .ace_list,.ace-dawn .ace_markup.ace_list,.ace-dawn .ace_support.ace_function {color: #693A17}.ace-dawn .ace_storage {font-style: italic;color: #A71D5D}.ace-dawn .ace_string {color: #0B6125}.ace-dawn .ace_string.ace_regexp {color: #CF5628}.ace-dawn .ace_comment {font-style: italic;color: #5A525F}.ace-dawn .ace_heading,.ace-dawn .ace_markup.ace_heading {color: #19356D}.ace-dawn .ace_variable {color: #234A97}.ace-dawn .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y}")); var r = e("../lib/dom"); r.importCssString(t.cssText, t.cssClass); }); diff --git a/web/static/ace/worker-coffee.js b/web/static/ace/worker-coffee.js index 564efb5f4..2692b5bca 100644 --- a/web/static/ace/worker-coffee.js +++ b/web/static/ace/worker-coffee.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,7 +160,7 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -168,10 +168,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -316,11 +316,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -329,7 +329,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -340,11 +340,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -366,9 +366,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -389,18 +389,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -417,7 +417,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -426,7 +426,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -465,18 +465,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -495,7 +495,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -514,16 +514,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -541,7 +541,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -552,19 +552,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -581,7 +581,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -597,7 +597,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -625,8 +625,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -707,10 +707,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -753,8 +753,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -789,7 +789,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -813,7 +813,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -822,12 +822,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -853,13 +853,13 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -872,10 +872,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -942,18 +942,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -964,28 +964,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,7 +1025,7 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/coffee/coffee", [], function (require, exports, module) { @@ -1047,10 +1047,10 @@ throw new TypeError( "Super expression must either be null or a function, not " + typeof t, ); - (e.prototype = Object.create(t && t.prototype, { + ((e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, })), - t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t)); + t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : (e.__proto__ = t))); } function _classCallCheck(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); @@ -1100,7 +1100,7 @@ r = !0 ); } catch (e) { - (i = !0), (s = e); + ((i = !0), (s = e)); } finally { try { !r && o["return"] && o["return"](); @@ -1119,14 +1119,14 @@ _createClass = (function () { function e(e, t) { for (var n = 0, r; n < t.length; n++) - (r = t[n]), + ((r = t[n]), (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), - Object.defineProperty(e, r.key, r); + Object.defineProperty(e, r.key, r)); } return function (t, n, r) { - return n && e(t.prototype, n), r && e(t, r), t; + return (n && e(t.prototype, n), r && e(t, r), t); }; })(); (function (root) { @@ -1183,7 +1183,7 @@ return ( function () { var t, n, r, i, s, o, u, a; - (e.starts = function (e, t, n) { + ((e.starts = function (e, t, n) { return t === e.substr(n, t.length); }), (e.ends = function (e, t, n) { @@ -1197,13 +1197,13 @@ function (e, t) { var n; for (n = ""; 0 < t; ) - 1 & t && (n += e), (t >>>= 1), (e += e); + (1 & t && (n += e), (t >>>= 1), (e += e)); return n; }), (e.compact = function (e) { var t, n, r, i; for (i = [], t = 0, r = e.length; t < r; t++) - (n = e[t]), n && i.push(n); + ((n = e[t]), n && i.push(n)); return i; }), (e.count = function (e, t) { @@ -1218,23 +1218,23 @@ (i = e.extend = function (e, t) { var n, r; - for (n in t) (r = t[n]), (e[n] = r); + for (n in t) ((r = t[n]), (e[n] = r)); return e; }), (e.flatten = s = function (t) { var n, r, i, o; for (r = [], i = 0, o = t.length; i < o; i++) - (n = t[i]), + ((n = t[i]), "[object Array]" === Object.prototype.toString.call(n) ? (r = r.concat(s(n))) - : r.push(n); + : r.push(n)); return r; }), (e.del = function (e, t) { var n; - return (n = e[t]), delete e[t], n; + return ((n = e[t]), delete e[t], n); }), (e.some = null == (o = Array.prototype.some) @@ -1259,14 +1259,14 @@ n < s; n++ ) - (o = f[n]), + ((o = f[n]), t.test(o) ? ((i = !1), a.push(o)) : i || u.test(o) ? ((i = !0), a.push("# " + o)) : !i && r.test(o) ? a.push(o) - : ((i = !0), a.push("# " + o)); + : ((i = !0), a.push("# " + o))); return a.join("\n"); }), (n = function (e, t) { @@ -1392,11 +1392,11 @@ (e.throwSyntaxError = function (e, t) { var n; throw ( - ((n = new SyntaxError(e)), + (n = new SyntaxError(e)), (n.location = t), (n.toString = a), (n.stack = n.toString()), - n) + n ); }), (e.updateSyntaxError = function (e, t, n) { @@ -1464,7 +1464,7 @@ : " " === e ? "tab" : e; - }); + })); }.call(this), { exports: e }.exports ); @@ -1509,10 +1509,10 @@ r < i; r++ ) - (n = s[r]), + ((n = s[r]), n.unshift ? o.push(n) - : t.comments.push(n); + : t.comments.push(n)); t.comments = o.concat(t.comments); } else t.comments = e.comments; return delete e.comments; @@ -1569,7 +1569,7 @@ e < t; e++ ) - (i = n[e]), + ((i = n[e]), r.push( i[0] + "/" + @@ -1577,7 +1577,7 @@ (i.comments ? "*" : ""), - ); + )); return r; } .call(this) @@ -1621,7 +1621,7 @@ e < t; e++ ) - (i = n[e]), + ((i = n[e]), r.push( i[0] + "/" + @@ -1629,7 +1629,7 @@ (i.comments ? "*" : ""), - ); + )); return r; } .call(this) @@ -1736,11 +1736,11 @@ r < o; r++ ) - (i = a[r]), + ((i = a[r]), x( i, this.tokens[t], - ); + )); return this.tokens.splice( 0, t, @@ -1916,14 +1916,14 @@ 0 > t.call(v, c)))); ) - ((s = this.tag(n)), + (((s = this.tag(n)), 0 <= t.call(a, s)) && i.push(this.tag(n)), ((o = this.tag(n)), 0 <= t.call(f, o)) && i.length && i.pop(), - (n -= 1); + (n -= 1)); return ( (h = this.tag(n)), 0 <= t.call(r, h) @@ -2659,9 +2659,10 @@ rt, 3, ); - (W = it[0]), + ((W = + it[0]), (U = - it[1]); + it[1])); var st = it[2]; if ( @@ -2839,10 +2840,10 @@ a < f; a++ ) - (s = h[a]), + ((s = h[a]), (s.unshift = - !0); - return x(e, i[u]), 1; + !0)); + return (x(e, i[u]), 1); }), (r = function (e, r, i) { var s, u, a; @@ -2893,7 +2894,7 @@ -1 !== a; ) - !1 === + (!1 === e .comments[ a @@ -2915,8 +2916,8 @@ a, 1, )), - a--; - 0 !== + a--); + (0 !== u.comments .length && (c = r( @@ -2932,7 +2933,7 @@ e, n, s, - ); + )); } else { for ( u = { @@ -2947,7 +2948,8 @@ -1 !== a; ) - !e.comments[ + (!e + .comments[ a ].newLine || e @@ -2968,7 +2970,7 @@ a, 1, )), - a--; + a--); 0 !== u.comments .length && @@ -3014,9 +3016,9 @@ : u[2]) ) { var f = s; - (i = f.first_line), + ((i = f.first_line), (r = - f.first_column); + f.first_column)); } else if ( (o = null == @@ -3025,9 +3027,9 @@ : a[2]) ) { var l = o; - (i = l.last_line), + ((i = l.last_line), (r = - l.last_column); + l.last_column)); } else i = r = 0; return ( (e[2] = { @@ -3707,7 +3709,7 @@ e ); })(); - return (e.prototype.generate = b), e; + return ((e.prototype.generate = b), e); }.call(this), r = [ ["(", ")"], @@ -3729,9 +3731,12 @@ w++ ) { var C = _slicedToArray(r[w], 2); - (E = C[0]), (T = C[1]), f.push((d[T] = E)), a.push((d[E] = T)); + ((E = C[0]), + (T = C[1]), + f.push((d[T] = E)), + a.push((d[E] = T))); } - (u = ["CATCH", "THEN", "ELSE", "FINALLY"].concat(a)), + ((u = ["CATCH", "THEN", "ELSE", "FINALLY"].concat(a)), (h = [ "IDENTIFIER", "PROPERTY", @@ -3842,7 +3847,7 @@ "THROW", "UNARY", "YIELD", - ].concat(p.concat(c.concat(i.concat(s))))); + ].concat(p.concat(c.concat(i.concat(s)))))); }.call(this), { exports: e }.exports ); @@ -3928,9 +3933,9 @@ Et, St, xt; - (K = r.Rewriter), (O = r.INVERSES); + ((K = r.Rewriter), (O = r.INVERSES)); var Tt = require("./helpers"); - (dt = Tt.count), + ((dt = Tt.count), (St = Tt.starts), (pt = Tt.compact), (Et = Tt.repeat), @@ -4091,14 +4096,16 @@ "own" === u && "FOR" === this.tag()) ) return ( - this.token("OWN", u), u.length + this.token("OWN", u), + u.length ); if ( "from" === u && "YIELD" === this.tag() ) return ( - this.token("FROM", u), u.length + this.token("FROM", u), + u.length ); if ("as" === u && this.seenImport) { if ("*" === this.value()) @@ -4114,7 +4121,7 @@ "IDENTIFIER", this.value(!0), ]; - (g[0] = q[0]), (g[1] = q[1]); + ((g[0] = q[0]), (g[1] = q[1])); } if ( "DEFAULT" === @@ -4166,12 +4173,15 @@ this.chunk.slice(3), )) ) { - this.token("SUPER", "super"), + (this.token("SUPER", "super"), this.token( "CALL_START", "(", ), - this.token("CALL_END", ")"); + this.token( + "CALL_END", + ")", + )); var U = M, z = _slicedToArray(U, 2); return ( @@ -4354,8 +4364,8 @@ m[2].first_line, m[2].first_column, ]; - (j[2].first_line = W[0]), - (j[2].first_column = W[1]); + ((j[2].first_line = W[0]), + (j[2].first_column = W[1])); } return ( r && @@ -4383,7 +4393,8 @@ ); } return ( - this.token("DEFAULT", u), u.length + this.token("DEFAULT", u), + u.length ); }, }, @@ -4476,7 +4487,7 @@ y, b; if (((v = r[0]), !v)) return 0; - (d = this.prev()), + ((d = this.prev()), d && "from" === this.value() && (this.seenImport || @@ -4493,7 +4504,7 @@ ? w : void 0; })()), - (f = 3 === v.length); + (f = 3 === v.length)); var x = this.matchWithInterpolations( g, v, @@ -4516,23 +4527,23 @@ e < t; l = ++e ) - (y = b[l]), + ((y = b[l]), "NEOSTRING" === y[0] && n.push( y[1], - ); + )); return n; })().join("#{}"); (p = E.exec(u)); ) - (s = p[1]), + ((s = p[1]), (null === c || (0 < (m = s.length) && m < c.length)) && - (c = s); - c && (h = RegExp("\\n" + c, "g")), + (c = s)); + (c && (h = RegExp("\\n" + c, "g")), this.mergeInterpolationTokens( b, { delimiter: o }, @@ -4563,7 +4574,7 @@ e ); }, - ); + )); } else this.mergeInterpolationTokens( b, @@ -4682,13 +4693,13 @@ e < t; a = ++e ) - (s = o[a]), + ((s = o[a]), n.push({ content: s, here: null != u, newLine: h || 0 !== a, - }); + })); return n; })()), (d = this.prev()), @@ -4793,10 +4804,10 @@ c < h; c++ ) - (s = u[c]), + ((s = u[c]), this.commentToken( s, - ); + )); break; case !(p = z.exec(this.chunk)): var E = p, @@ -4857,7 +4868,7 @@ ); break; case !y && 1 !== b.length: - (r = r + ((r = r ? this.formatRegex(r, { flags: f, delimiter: "/", @@ -4880,10 +4891,10 @@ 0, a, d, - ); + )); break; default: - this.token( + (this.token( "REGEX_START", "(", 0, @@ -4939,7 +4950,7 @@ ")", a - 1, 0, - ); + )); } return a; }, @@ -5025,7 +5036,7 @@ (this.indentLiteral = u), i.length ); - (r = + ((r = l - this.indent + this.outdebt), this.token( "INDENT", @@ -5040,7 +5051,7 @@ (this.outdebt = this.indebt = 0), (this.indent = l), - (this.indentLiteral = u); + (this.indentLiteral = u)); } else l < this.baseIndent ? this.error( @@ -5061,7 +5072,7 @@ value: function (n, r, i) { var s, o, u, a; for (s = this.indent - n; 0 < n; ) - (u = + ((u = this.indents[ this.indents.length - 1 ]), @@ -5094,7 +5105,7 @@ i, ), (n -= o)) - : (this.outdebt = n = 0); + : (this.outdebt = n = 0)); return ( o && (this.outdebt -= n), this.suppressSemicolons(), @@ -5271,9 +5282,9 @@ 1 ); if (">" === u) { - this.pair("/>"), + (this.pair("/>"), (c = this.token("]", "]")), - this.token(",", ","); + this.token(",", ",")); var x = this.matchWithInterpolations( A, @@ -5396,9 +5407,9 @@ if ((n = R.exec(this.chunk))) { var b = n, w = _slicedToArray(b, 1); - (y = w[0]), + ((y = w[0]), u.test(y) && - this.tagParameters(); + this.tagParameters()); } else y = this.chunk.charAt(0); if ( ((m = y), @@ -5459,7 +5470,7 @@ !1), ";" === y) ) - ((l = null == s ? void 0 : s[0]), + (((l = null == s ? void 0 : s[0]), 0 <= t.call( ["="].concat( @@ -5472,7 +5483,7 @@ this.seenImport = this.seenExport = !1), - (m = "TERMINATOR"); + (m = "TERMINATOR")); else if ( "*" === y && "EXPORT" === @@ -5500,9 +5511,9 @@ !s.spaced && ((c = s[0]), 0 <= t.call(o, c)) ) - "?" === s[0] && + ("?" === s[0] && (s[0] = "FUNC_EXIST"), - (m = "CALL_START"); + (m = "CALL_START")); else if ( "[" === y && ((((h = s[0]), @@ -5631,15 +5642,15 @@ break; var M = w, _ = _slicedToArray(M, 1); - (g = _[0]), (m = g.length - 1); + ((g = _[0]), (m = g.length - 1)); var D = this.getLineAndColumnFromChunk( S + m, ), P = _slicedToArray(D, 2); - (b = P[0]), + ((b = P[0]), (p = P[1]), - (N = C.slice(m)); + (N = C.slice(m))); var H = new e().tokenize(N, { line: b, column: p, @@ -5653,7 +5664,7 @@ c) ) { var B, j, F, I; - (B = E), + ((B = E), (j = _slicedToArray(B, 1)), (x = j[0]), B, @@ -5667,9 +5678,9 @@ "", "end of interpolation", h[2], - ]); + ])); } - "TERMINATOR" === + ("TERMINATOR" === (null == (T = E[1]) ? void 0 : T[0]) && E.splice(1, 1), @@ -5692,7 +5703,7 @@ ))), L.push(["TOKENS", E]), (C = C.slice(v)), - (S += v); + (S += v)); } return ( C.slice(0, s.length) !== s && @@ -5805,7 +5816,7 @@ } x.splice(1, 0, m); } - (d = x[0]), (E = x); + ((d = x[0]), (E = x)); break; case "NEOSTRING": if ( @@ -5819,7 +5830,7 @@ if (0 !== a) continue; o = this.tokens.length; } - 2 === a && + (2 === a && null != o && this.tokens.splice( o, @@ -5832,9 +5843,9 @@ r, )), (d = w), - (E = [w]); + (E = [w])); } - this.tokens.length > u && + (this.tokens.length > u && ((g = this.token("+", "+")), (g[2] = { first_line: d[2].first_line, @@ -5847,7 +5858,7 @@ (T = this.tokens).push.apply( T, _toConsumableArray(E), - ); + )); } if (v) { var L = n.call(t, -1), @@ -5939,12 +5950,12 @@ 0 < s) ) { var a, f; - (o = u.split("\n")), + ((o = u.split("\n")), (a = n.call(o, -1)), (f = _slicedToArray(a, 1)), (i = f[0]), a, - (r = i.length); + (r = i.length)); } else r += u.length; return [this.chunkLine + s, r]; }, @@ -5971,9 +5982,9 @@ r, ), f = _slicedToArray(a, 2); - (o.first_line = f[0]), + ((o.first_line = f[0]), (o.first_column = f[1]), - (s = 0 < i ? i - 1 : 0); + (s = 0 < i ? i - 1 : 0)); var l = this.getLineAndColumnFromChunk( r + s, ), @@ -6267,7 +6278,7 @@ value: function () { var n, r, i; for (i = []; ";" === this.value(); ) - this.tokens.pop(), + (this.tokens.pop(), ((n = null == (r = this.prev()) ? void 0 @@ -6286,7 +6297,7 @@ "unexpected ;", ), ) - : i.push(void 0); + : i.push(void 0)); return i; }, }, @@ -6581,7 +6592,7 @@ "||", "BIN?", "EXTENDS", - ]); + ])); }.call(this), { exports: e }.exports ); @@ -25402,10 +25413,10 @@ for (var d in this.yy) Object.prototype.hasOwnProperty.call(this.yy, d) && (p.yy[d] = this.yy[d]); - h.setInput(e, p.yy), + (h.setInput(e, p.yy), (p.yy.lexer = h), (p.yy.parser = this), - "undefined" == typeof h.yylloc && (h.yylloc = {}); + "undefined" == typeof h.yylloc && (h.yylloc = {})); var v = h.yylloc; i.push(v); var m = h.options && h.options.ranges; @@ -25438,7 +25449,7 @@ this.terminals_[T] && T > 2 && k.push("'" + this.terminals_[T] + "'"); - (L = h.showPosition + ((L = h.showPosition ? "Parse error on line " + (u + 1) + ":\n" + @@ -25462,7 +25473,7 @@ line: h.yylineno, loc: v, expected: k, - }); + })); } if (S[0] instanceof Array && 1 < S.length) throw new Error( @@ -25473,7 +25484,7 @@ ); switch (S[0]) { case 1: - n.push(b), + (n.push(b), r.push(h.yytext), i.push(h.yylloc), n.push(S[1]), @@ -25484,7 +25495,7 @@ (o = h.yytext), (u = h.yylineno), (v = h.yylloc), - 0 < f && f--); + 0 < f && f--)); break; case 2: if ( @@ -25516,7 +25527,7 @@ "undefined" != typeof x) ) return x; - N && + (N && ((n = n.slice(0, 2 * -1 * N)), (r = r.slice(0, -1 * N)), (i = i.slice(0, -1 * N))), @@ -25527,7 +25538,7 @@ s[n[n.length - 2]][ n[n.length - 1] ]), - n.push(C); + n.push(C)); break; case 3: return !0; @@ -25536,7 +25547,7 @@ return !0; }, }; - return (e.prototype = oi), (oi.Parser = e), new e(); + return ((e.prototype = oi), (oi.Parser = e), new e()); })(); return ( "undefined" != typeof require && @@ -25561,7 +25572,7 @@ function e(t, n, r, i) { _classCallCheck(this, e); var s, o; - (this.parent = t), + ((this.parent = t), (this.expressions = n), (this.method = r), (this.referencedVars = i), @@ -25575,7 +25586,7 @@ null == (s = null == (o = this.parent) ? void 0 : o.root) ? this - : s); + : s)); } return ( _createClass(e, [ @@ -25739,8 +25750,8 @@ e < n; e++ ) - (t = r[e]), - "var" === t.type && i.push(t.name); + ((t = r[e]), + "var" === t.type && i.push(t.name)); return i; } .call(this) @@ -25759,11 +25770,11 @@ t < n; t++ ) - (s = r[t]), + ((s = r[t]), s.type.assigned && i.push( s.name + " = " + s.type.value, - ); + )); return i; }, }, @@ -25898,9 +25909,9 @@ var fn = require("./scope"); gt = fn.Scope; var ln = require("./lexer"); - (Qt = ln.isUnassignable), (z = ln.JS_FORBIDDEN); + ((Qt = ln.isUnassignable), (z = ln.JS_FORBIDDEN)); var cn = require("./helpers"); - (qt = cn.compact), + ((qt = cn.compact), (Wt = cn.flatten), (zt = cn.extend), (Yt = cn.merge), @@ -25924,14 +25935,14 @@ return this; }), (tt = function () { - return (this.negated = !this.negated), this; + return ((this.negated = !this.negated), this); }), (e.CodeFragment = v = (function () { function e(t, n) { _classCallCheck(this, e); var r; - (this.code = "" + n), + ((this.code = "" + n), (this.type = (null == t || null == (r = t.constructor) ? void 0 @@ -25939,7 +25950,7 @@ (this.locationData = null == t ? void 0 : t.locationData), (this.comments = - null == t ? void 0 : t.comments); + null == t ? void 0 : t.comments)); } return ( _createClass(e, [ @@ -25964,7 +25975,7 @@ return (function () { var n, r, i; for (i = [], n = 0, r = e.length; n < r; n++) - (t = e[n]), i.push(t.code); + ((t = e[n]), i.push(t.code)); return i; })().join(""); }), @@ -26105,14 +26116,14 @@ ? void 0 : l.isGenerator) ): - a.unshift( + (a.unshift( this.makeCode( "(yield* ", ), ), a.push( this.makeCode(")"), - ); + )); break; case !( s.isAsync || @@ -26120,14 +26131,14 @@ ? void 0 : c.isAsync) ): - a.unshift( + (a.unshift( this.makeCode( "(await ", ), ), a.push( this.makeCode(")"), - ); + )); } return a; }, @@ -26309,7 +26320,10 @@ !1, function (e) { if (t(e)) - return (n = e), !1; + return ( + (n = e), + !1 + ); }, ), n @@ -26535,12 +26549,12 @@ o < u; s = ++o ) - (i = t[s]), + ((i = t[s]), s && r.push( this.makeCode(n), ), - (r = r.concat(i)); + (r = r.concat(i))); return r; }, }, @@ -26593,7 +26607,7 @@ 0 <= s; i = s += -1 ) - (r = t[i]), + ((r = t[i]), r.fragments && (n.apply( t, @@ -26603,7 +26617,7 @@ )), ), ), - o); + o)); return t; }, }, @@ -26663,7 +26677,7 @@ n.__proto__ || Object.getPrototypeOf(n) ).call(this), ); - return (t.expressions = qt(Wt(e || []))), t; + return ((t.expressions = qt(Wt(e || []))), t); } return ( _inherits(n, e), @@ -26755,7 +26769,7 @@ r--; ) { - (n = this.expressions[r]), + ((n = this.expressions[r]), (this.expressions[r] = n.makeReturn(t)), n instanceof vt && @@ -26763,7 +26777,7 @@ this.expressions.splice( r, 1, - ); + )); break; } return this; @@ -26848,14 +26862,14 @@ d, 1, ); - (f = v[0]), + ((f = v[0]), "" === f.code || f.isComment || o.push( this.makeCode( ";", ), - ); + )); } s.push(o); } else @@ -26923,8 +26937,8 @@ r < i; r++ ) - (s = u[r]), - t.scope.parameter(s); + ((s = u[r]), + t.scope.parameter(s)); return ( (n = this.compileWithDeclarations( @@ -26990,15 +27004,15 @@ 9e9, ); var b = [this.spaced, !1]; - (y = b[0]), - (this.spaced = b[1]); + ((y = b[0]), + (this.spaced = b[1])); var w = [ this.compileNode(t), y, ]; - (a = w[0]), + ((a = w[0]), (this.spaced = w[1]), - (this.expressions = m); + (this.expressions = m)); } d = this.compileNode(t); var E = t; @@ -27071,7 +27085,7 @@ ), ); } - n && + (n && (o && a.push( this.makeCode( @@ -27101,7 +27115,7 @@ ? "\n" : ""), ), - ); + )); } else a.length && d.length && @@ -27202,7 +27216,7 @@ e < t; e++ ) - (i = + ((i = n[ e ]), @@ -27217,7 +27231,7 @@ ) : r.push( i.code, - ); + )); return r; })() .join( @@ -27247,10 +27261,10 @@ -1 === v) ) if (0 === y) - (g.code = + ((g.code = "\n" + g.code), - (v = 0); + (v = 0)); else { if ( !g.isStringWithInterpolations || @@ -27258,14 +27272,14 @@ g.code ) continue; - (r = + ((r = r.slice( 1, ) + "\n"), - (v = 1); + (v = 1)); } - delete s.precedingComments, + (delete s.precedingComments, (g.code = g.code.slice( 0, @@ -27274,7 +27288,7 @@ r + g.code.slice( v, - )); + ))); break; } } @@ -27368,7 +27382,7 @@ e; t++ ) - (i = + ((i = n[ t ]), @@ -27383,7 +27397,7 @@ ) : r.push( i.code, - ); + )); return r; })() .join( @@ -27412,12 +27426,12 @@ k === n.length - 1 ) - (C.code += + ((C.code += "\n"), (v = C .code - .length); + .length)); else { if ( !C.isStringWithInterpolations || @@ -27425,10 +27439,11 @@ C.code ) continue; - (r += "\n"), - (v = 0); + ((r += + "\n"), + (v = 0)); } - delete s.followingComments, + (delete s.followingComments, "\n" === C.code && (r = @@ -27444,7 +27459,7 @@ r + C.code.slice( v, - )); + ))); break; } } @@ -27468,7 +27483,7 @@ n ); })(a); - return (e.prototype.children = ["expressions"]), e; + return ((e.prototype.children = ["expressions"]), e); }.call(this)), (e.Literal = G = function () { @@ -27481,7 +27496,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.value = e), n; + return ((n.value = e), n); } return ( _inherits(t, e), @@ -27523,7 +27538,7 @@ t ); })(a); - return (e.prototype.shouldCache = nt), e; + return ((e.prototype.shouldCache = nt), e); }.call(this)), (e.NumberLiteral = st = (function (e) { @@ -27538,7 +27553,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(G)), (e.InfinityLiteral = U = (function (e) { @@ -27671,7 +27686,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(G)), (e.PassthroughLiteral = lt = (function (e) { @@ -27686,7 +27701,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(G)), (e.IdentifierLiteral = _ = function () { @@ -27716,7 +27731,7 @@ t ); })(G); - return (e.prototype.isAssignable = Bt), e; + return ((e.prototype.isAssignable = Bt), e); }.call(this)), (e.CSXTag = c = (function (e) { @@ -27731,7 +27746,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(_)), (e.PropertyName = ct = function () { @@ -27748,9 +27763,9 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(G); - return (e.prototype.isAssignable = Bt), e; + return ((e.prototype.isAssignable = Bt), e); }.call(this)), (e.ComputedPropertyName = m = (function (e) { @@ -27921,7 +27936,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(G)), (e.BooleanLiteral = l = (function (e) { @@ -27936,7 +27951,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(G)), (e.Return = vt = function () { @@ -27949,7 +27964,7 @@ n.__proto__ || Object.getPrototypeOf(n) ).call(this), ); - return (t.expression = e), t; + return ((t.expression = e), t); } return ( _inherits(n, e), @@ -28029,7 +28044,8 @@ ), ); return ( - r.push(this.makeCode(";")), r + r.push(this.makeCode(";")), + r ); }, }, @@ -28473,7 +28489,7 @@ r++ ) { var u; - (s = o[r]), + ((s = o[r]), (u = n).push.apply( u, _toConsumableArray( @@ -28481,7 +28497,7 @@ t, ), ), - ); + )); } return n; }, @@ -28599,7 +28615,8 @@ ); })(a); return ( - (e.prototype.children = ["base", "properties"]), e + (e.prototype.children = ["base", "properties"]), + e ); }.call(this)), (e.HereComment = O = @@ -28655,10 +28672,10 @@ i < u; i++ ) - (a = l[i]), + ((a = l[i]), (o = /^\s*/.exec(a)[0]), o.length > s.length && - (s = o); + (s = o)); this.content = this.content.replace( RegExp("^(" + o + ")", "gm"), "", @@ -28839,7 +28856,7 @@ var r, i, s, o, u, a, f, l; if (this.soak) { if (this.variable instanceof xt) - (o = new G( + ((o = new G( this.variable.compile( n, ), @@ -28850,7 +28867,7 @@ .accessor && this.variable.error( "Unsupported reference to 'super'", - ); + )); else { if ( (i = on( @@ -28867,7 +28884,7 @@ c, 2, ); - (o = h[0]), (l = h[1]); + ((o = h[0]), (l = h[1])); } return ( (l = new t(l, this.args)), @@ -28884,7 +28901,8 @@ } for (r = this, a = []; ; ) { if (r.variable instanceof t) { - a.push(r), (r = r.variable); + (a.push(r), + (r = r.variable)); continue; } if (!(r.variable instanceof Pt)) @@ -28907,13 +28925,13 @@ s < u; s++ ) - (r = f[s]), + ((r = f[s]), i && (r.variable instanceof t ? (r.variable = i) : (r.variable.base = i)), - (i = on(n, r, "variable")); + (i = on(n, r, "variable"))); return i; }, }, @@ -28957,9 +28975,9 @@ e < t; e++ ) - (s = n[e]), + ((s = n[e]), s instanceof d && - r.push(s); + r.push(s)); return r; }.call(this)), 0 < o.length && @@ -28975,9 +28993,9 @@ }, ), w = _slicedToArray(b, 1); - (a = w[0]), + ((a = w[0]), (this.variable.base.cached = - a); + a)); } for ( g = this.args, @@ -28987,7 +29005,7 @@ u = ++c ) { var E; - (s = g[u]), + ((s = g[u]), u && f.push( this.makeCode(", "), @@ -29000,7 +29018,7 @@ V, ), ), - ); + )); } return ( (l = []), @@ -29077,7 +29095,7 @@ l++ ) { var v; - (h = p[l]), + ((h = p[l]), (i = h.base), (o = (null == i @@ -29111,11 +29129,11 @@ J, ), ), - ); + )); } if (a) { var m, g; - f.push(this.makeCode(">")), + (f.push(this.makeCode(">")), (m = f).push.apply( m, _toConsumableArray( @@ -29136,7 +29154,7 @@ ), ], ), - ); + )); } else f.push(this.makeCode(" />")); return f; }, @@ -29145,7 +29163,10 @@ t ); })(a); - return (e.prototype.children = ["variable", "args"]), e; + return ( + (e.prototype.children = ["variable", "args"]), + e + ); }.call(this)), (e.SuperCall = Tt = function () { @@ -29214,9 +29235,9 @@ ) { var u = o.cache(n, null, Bt), a = _slicedToArray(u, 2); - (o = a[0]), + ((o = a[0]), (r = a[1]), - s.push(r); + s.push(r)); } return ( s.unshift(o), @@ -29249,7 +29270,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.accessor = e), n; + return ((n.accessor = e), n); } return ( _inherits(t, e), @@ -29270,7 +29291,7 @@ null == this.accessor) ) { var c = r; - (i = c.name), + ((i = c.name), (l = c.variable), (i.shouldCache() || (i instanceof R && @@ -29287,7 +29308,7 @@ (this.accessor = null == s ? i - : new R(s)); + : new R(s))); } return ( (null == (u = this.accessor) || @@ -29314,7 +29335,7 @@ t ); })(a); - return (e.prototype.children = ["accessor"]), e; + return ((e.prototype.children = ["accessor"]), e); }.call(this)), (e.RegexWithInterpolations = dt = (function (e) { @@ -29338,7 +29359,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(h)), (e.TaggedTemplateCall = Lt = (function (e) { @@ -29386,7 +29407,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (r.child = e), (r.parent = n), r; + return ((r.child = e), (r.parent = n), r); } return ( _inherits(t, e), @@ -29404,7 +29425,10 @@ t ); })(a); - return (e.prototype.children = ["child", "parent"]), e; + return ( + (e.prototype.children = ["child", "parent"]), + e + ); }.call(this)), (e.Access = i = function () { @@ -29417,7 +29441,11 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (r.name = e), (r.soak = "soak" === n), r; + return ( + (r.name = e), + (r.soak = "soak" === n), + r + ); } return ( _inherits(t, e), @@ -29468,7 +29496,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.index = e), n; + return ((n.index = e), n); } return ( _inherits(t, e), @@ -29496,7 +29524,7 @@ t ); })(a); - return (e.prototype.children = ["index"]), e; + return ((e.prototype.children = ["index"]), e); }.call(this)), (e.Range = ht = function () { @@ -29524,14 +29552,14 @@ key: "compileVariables", value: function (t) { var n, r; - (t = Yt(t, { top: !0 })), - (n = Rt(t, "shouldCache")); + ((t = Yt(t, { top: !0 })), + (n = Rt(t, "shouldCache"))); var i = this.cacheToCodeFragments( this.from.cache(t, V, n), ), s = _slicedToArray(i, 2); - (this.fromC = s[0]), - (this.fromVar = s[1]); + ((this.fromC = s[0]), + (this.fromVar = s[1])); var o = this.cacheToCodeFragments( this.to.cache(t, V, n), ), @@ -29546,8 +29574,8 @@ r.cache(t, V, n), ), f = _slicedToArray(a, 2); - (this.step = f[0]), - (this.stepVar = f[1]); + ((this.step = f[0]), + (this.stepVar = f[1])); } return ( (this.fromNum = @@ -29591,7 +29619,7 @@ !t.index) ) return this.compileArray(t); - (a = + ((a = null != this.fromNum && null != this.toNum), (o = Rt(t, "index")), @@ -29611,7 +29639,7 @@ this.step !== this.stepVar && (m += ", " + this.step), (l = o + " <" + this.equals), - (s = o + " >" + this.equals); + (s = o + " >" + this.equals)); var g = [this.fromNum, this.toNum]; return ( (i = g[0]), @@ -29855,7 +29883,7 @@ t ); })(a); - return (e.prototype.children = ["from", "to"]), e; + return ((e.prototype.children = ["from", "to"]), e); }.call(this)), (e.Slice = yt = function () { @@ -29868,7 +29896,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.range = e), n; + return ((n.range = e), n); } return ( _inherits(t, e), @@ -29941,7 +29969,7 @@ t ); })(a); - return (e.prototype.children = ["range"]), e; + return ((e.prototype.children = ["range"]), e); }.call(this)), (e.Obj = ot = function () { @@ -30058,11 +30086,11 @@ l < g; l++ ) - (E = x[l]), + ((E = x[l]), E instanceof Pt && E.error( "cannot have an implicit value in an implicit object", - ); + )); if (this.hasSplat() && !this.csx) return this.compileSpread(n); if ( @@ -30086,7 +30114,7 @@ S instanceof o) ) { var L = S; - (k = L.value), + ((k = L.value), (C = k.unwrapAll()), C instanceof s || C instanceof t @@ -30094,7 +30122,7 @@ : C instanceof o && (C.nestedLhs = - !0); + !0)); } for ( f = !0, @@ -30104,11 +30132,11 @@ d < b; d++ ) - (S = N[d]), + ((S = N[d]), S instanceof o && "object" === S.context && - (f = !1); + (f = !1)); for ( r = [], r.push( @@ -30172,7 +30200,7 @@ O, 2, ); - (p = M[0]), + ((p = M[0]), (k = M[1]), p instanceof _ && (p = new ct( @@ -30182,7 +30210,7 @@ p, k, "object", - )); + ))); } else if ( p instanceof Pt && p.base instanceof m @@ -30199,7 +30227,7 @@ D, 2, ); - (p = P[0]), + ((p = P[0]), (k = P[1]), p instanceof _ && @@ -30210,7 +30238,7 @@ p, k, "object", - )); + ))); } else S = new o( p, @@ -30226,7 +30254,7 @@ S, "object", )); - a && r.push(this.makeCode(a)), + (a && r.push(this.makeCode(a)), (A = r).push.apply( A, _toConsumableArray( @@ -30239,7 +30267,7 @@ c && r.push( this.makeCode(c), - ); + )); } return ( r.push( @@ -30284,7 +30312,7 @@ n < r; n++ ) - (i = s[n]), + ((i = s[n]), i instanceof o && "object" === i.context && @@ -30292,7 +30320,9 @@ (i = i.unwrapAll()), null == i.eachName ? u.push(void 0) - : u.push(i.eachName(t)); + : u.push( + i.eachName(t), + )); return u; }, }, @@ -30322,7 +30352,8 @@ ); } return ( - (c = []), (a = []) + (c = []), + (a = []) ); }, s = 0, @@ -30330,13 +30361,13 @@ s < o; s++ ) - (u = f[s]), + ((u = f[s]), u instanceof bt ? (c.push( new Pt(u.name), ), i()) - : a.push(u); + : a.push(u)); return ( i(), l[0] instanceof t || @@ -30363,7 +30394,7 @@ r = ++i ) { var f; - (u = a[r]), + ((u = a[r]), (u.csx = !0), (s = r === a.length - 1 @@ -30384,7 +30415,7 @@ ), ), ), - n.push(this.makeCode(s)); + n.push(this.makeCode(s))); } return this.front ? this.wrapInParentheses(n) @@ -30395,7 +30426,7 @@ t ); })(a); - return (e.prototype.children = ["properties"]), e; + return ((e.prototype.children = ["properties"]), e); }.call(this)), (e.Arr = s = function () { @@ -30412,7 +30443,7 @@ n.__proto__ || Object.getPrototypeOf(n) ).call(this), ); - return (r.lhs = t), (r.objects = e || []), r; + return ((r.lhs = t), (r.objects = e || []), r); } return ( _inherits(n, e), @@ -30514,7 +30545,7 @@ h < v; E = ++h ) - (w = C[E]), + ((w = C[E]), (k = w.unwrapAll()), k.comments && 0 === @@ -30528,7 +30559,7 @@ this.lhs && (k instanceof n || k instanceof ot) && - (k.lhs = !0); + (k.lhs = !0)); for ( s = function () { var e, t, n, i; @@ -30540,13 +30571,13 @@ e < t; e++ ) - (w = n[e]), + ((w = n[e]), i.push( w.compileToFragments( r, V, ), - ); + )); return i; }.call(this), S = s.length, @@ -30564,15 +30595,15 @@ d < g; d++ ) - (o = f[d]), + ((o = f[d]), o.isHereComment ? (o.code = o.code.trim()) : 0 !== c && !1 === l && Vt(o) && - (l = !0); - 0 !== c && + (l = !0)); + (0 !== c && x && (!a(f) || c === S - 1) && i.push(this.makeCode(", ")), @@ -30580,7 +30611,7 @@ (L = i).push.apply( L, _toConsumableArray(f), - ); + )); } if (l || 0 <= t.call(Xt(i), "\n")) { for ( @@ -30588,7 +30619,7 @@ T < y; u = ++T ) - (o = i[u]), + ((o = i[u]), o.isHereComment ? (o.code = en( @@ -30603,8 +30634,8 @@ !o.isElision) && (o.code = ",\n" + - r.indent); - i.unshift( + r.indent)); + (i.unshift( this.makeCode( "[\n" + r.indent, ), @@ -30615,18 +30646,18 @@ this.tab + "]", ), - ); + )); } else { for ( N = 0, b = i.length; N < b; N++ ) - (o = i[N]), + ((o = i[N]), o.isHereComment && - (o.code += " "); - i.unshift(this.makeCode("[")), - i.push(this.makeCode("]")); + (o.code += " ")); + (i.unshift(this.makeCode("[")), + i.push(this.makeCode("]"))); } return i; }, @@ -30659,9 +30690,9 @@ n < r; n++ ) - (i = s[n]), + ((i = s[n]), (i = i.unwrapAll()), - o.push(i.eachName(t)); + o.push(i.eachName(t))); return o; }, }, @@ -30669,7 +30700,7 @@ n ); })(a); - return (e.prototype.children = ["objects"]), e; + return ((e.prototype.children = ["objects"]), e); }.call(this)), (e.Class = p = function () { @@ -30730,10 +30761,10 @@ ) { var s = this.variable.cache(t), u = _slicedToArray(s, 2); - (this.variable = u[0]), - (this.variableRef = u[1]); + ((this.variable = u[0]), + (this.variableRef = u[1])); } - this.variable && + (this.variable && (r = new o( this.variable, r, @@ -30745,7 +30776,7 @@ }, )), (this.compileNode = - this.compileClassDeclaration); + this.compileClassDeclaration)); try { return r.compileToFragments(t); } finally { @@ -30811,7 +30842,7 @@ !this.body.isEmpty()) ) { var o; - (this.body.spaced = !0), + ((this.body.spaced = !0), i.push(this.makeCode("\n")), (o = i).push.apply( o, @@ -30826,10 +30857,11 @@ this.makeCode( "\n" + this.tab, ), - ); + )); } return ( - i.push(this.makeCode("}")), i + i.push(this.makeCode("}")), + i ); }, }, @@ -30924,7 +30956,7 @@ (t = y[r]); ) - (c = + ((c = this.addInitializerExpression( t, )) && @@ -30932,8 +30964,8 @@ u.push(c), l.push(c), (E = r + 1)), - r++; - b(), + r++); + (b(), n.apply( o, [ @@ -30942,20 +30974,20 @@ ].concat(u), ), u, - (a += u.length); + (a += u.length)); } else - (c = + ((c = this.addInitializerExpression( s, )) && (l.push(c), (o[a] = c)), - (a += 1); + (a += 1)); for ( p = 0, m = l.length; p < m; p++ ) - (g = l[p]), + ((g = l[p]), g instanceof d && (g.ctor ? (this.ctor && @@ -30970,7 +31002,7 @@ : g.bound && this.boundMethods.push( g, - )); + ))); if (l.length !== o.length) return ( (this.body.expressions = @@ -30984,10 +31016,10 @@ e < t; e++ ) - (s = l[e]), + ((s = l[e]), n.push( s.hoist(), - ); + )); return n; })()), new f(o) @@ -31119,7 +31151,7 @@ e < r; e++ ) - (t = s[e]), + ((t = s[e]), this.parent && (t.classVariable = this.variableRef), @@ -31146,7 +31178,7 @@ ], ), ), - ); + )); return u; }.call(this)), null @@ -31182,7 +31214,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (r.class = e), (r.body = n), r; + return ((r.class = e), (r.body = n), r); } return ( _inherits(t, e), @@ -31333,7 +31365,7 @@ i < s; r = ++i ) - (u = a[r]), + ((u = a[r]), u instanceof Pt && u.isObject( @@ -31355,7 +31387,7 @@ t.name, ) && (u.value.isStatic = - !0); + !0)); e.expressions = Wt( e.expressions, ); @@ -31399,7 +31431,7 @@ e < a; e++ ) - (n = t[e]), + ((n = t[e]), (l = n.variable), (r = null == l @@ -31442,7 +31474,7 @@ )), (n.variable = l)), - c.push(n); + c.push(n)); return c; }.call(this)), qt(a) @@ -31605,7 +31637,7 @@ null != this.defaultBinding) ) { var r; - (r = n).push.apply( + ((r = n).push.apply( r, _toConsumableArray( this.defaultBinding.compileNode( @@ -31616,7 +31648,7 @@ null != this.namedImports && n.push( this.makeCode(", "), - ); + )); } if (null != this.namedImports) { var i; @@ -31733,7 +31765,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(S)), (e.ExportDefaultDeclaration = x = (function (e) { @@ -31748,7 +31780,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(S)), (e.ExportAllDeclaration = E = (function (e) { @@ -31763,7 +31795,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(S)), (e.ModuleSpecifierList = et = function () { @@ -31776,7 +31808,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.specifiers = e), n; + return ((n.specifiers = e), n); } return ( _inherits(t, e), @@ -31798,13 +31830,13 @@ e < n; e++ ) - (a = r[e]), + ((a = r[e]), i.push( a.compileToFragments( t, V, ), - ); + )); return i; }.call(this)), 0 !== this.specifiers.length) @@ -31821,7 +31853,7 @@ s = ++o ) { var f; - (i = r[s]), + ((i = r[s]), s && n.push( this.makeCode( @@ -31834,7 +31866,7 @@ _toConsumableArray( i, ), - ); + )); } n.push(this.makeCode("\n}")); } else n.push(this.makeCode("{}")); @@ -31845,7 +31877,7 @@ t ); })(a); - return (e.prototype.children = ["specifiers"]), e; + return ((e.prototype.children = ["specifiers"]), e); }.call(this)), (e.ImportSpecifierList = I = (function (e) { @@ -31860,7 +31892,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(et)), (e.ExportSpecifierList = C = (function (e) { @@ -31875,7 +31907,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(et)), (e.ModuleSpecifier = Z = function () { @@ -31968,7 +32000,8 @@ ); })(a); return ( - (e.prototype.children = ["original", "alias"]), e + (e.prototype.children = ["original", "alias"]), + e ); }.call(this)), (e.ImportSpecifier = F = @@ -32032,7 +32065,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(F)), (e.ImportNamespaceSpecifier = j = (function (e) { @@ -32047,7 +32080,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(F)), (e.ExportSpecifier = N = (function (e) { @@ -32062,7 +32095,7 @@ ) ); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(Z)), (e.Assign = o = function () { @@ -32330,7 +32363,7 @@ : m.length) ) { var E, S, x, T; - (g = + ((g = this.variable .properties), (E = g), @@ -32351,7 +32384,7 @@ ? void 0 : y.value) && (this.value.name = - a); + a)); } return (this.csx && (this.value.base.csxAttribute = @@ -32516,13 +32549,13 @@ E, 2, ); - (y.value.value = + ((y.value.value = S[0]), - (m = S[1]); + (m = S[1])); } if (p) { var x; - (d = new Pt( + ((d = new Pt( a.base, a.properties.concat( [ @@ -32552,7 +32585,7 @@ d, ), ), - ); + )); } } else y instanceof bt && @@ -32580,7 +32613,7 @@ t; e++ ) - (g = + ((g = n[ e ]), @@ -32590,7 +32623,7 @@ u( g, ), - ); + )); return r; })(), ), @@ -32628,7 +32661,7 @@ a < l; a++ ) - (c = p[a]), + ((c = p[a]), (m = new h( new Pt( new G( @@ -32655,7 +32688,7 @@ : null, }, ), - ); + )); return ( (n = d.compileToFragments(t)), t.level === K && @@ -32739,9 +32772,9 @@ e < t; E = ++e ) - (L = O[E]), + ((L = O[E]), L instanceof bt && - n.push(E); + n.push(E)); return n; })()), (v = (function () { @@ -32753,9 +32786,9 @@ e < t; E = ++e ) - (L = O[E]), + ((L = O[E]), L instanceof w && - n.push(E); + n.push(E)); return n; })()), (q = [].concat( @@ -32847,11 +32880,11 @@ t < n; E = ++t ) - (L = e[E]), + ((L = e[E]), L.base instanceof ot && L.base.hasSplat() && - r.push(E); + r.push(E)); return r; }), (y = function (e) { @@ -32863,11 +32896,11 @@ t < n; E = ++t ) - (L = e[E]), + ((L = e[E]), L instanceof r && "object" === L.context && - i.push(E); + i.push(E)); return i; }), (A = function (e) { @@ -32927,7 +32960,7 @@ s = S.variable; } - (c = s.this + ((c = s.this ? s .properties[0] .name @@ -32946,9 +32979,9 @@ c, ), ], - )); + ))); } else - (s = + ((s = (function () { switch ( !1 @@ -32999,8 +33032,8 @@ ], ); } - })()); - (d = Qt( + })())); + ((d = Qt( s.unwrap() .value, )), @@ -33021,7 +33054,7 @@ V, ), ), - ); + )); } return m; }), @@ -33241,7 +33274,7 @@ o.cache(t, $), ), v = _slicedToArray(d, 2); - (u = v[0]), (a = v[1]); + ((u = v[0]), (a = v[1])); } else u = a = "0"; l ? (null == o @@ -33310,9 +33343,9 @@ this, ), ); - return (n.glyph = e), n; + return ((n.glyph = e), n); } - return _inherits(t, e), t; + return (_inherits(t, e), t); })(a)), (e.Code = d = function () { @@ -33542,7 +33575,7 @@ b < x; g = ++b ) - (O = R[g]), + ((O = R[g]), O.splat || O instanceof w ? (m ? O.error( @@ -33771,7 +33804,7 @@ ), ), )), - H.push(j))); + H.push(j)))); if ( (0 !== B.length && p.unshift( @@ -33800,7 +33833,7 @@ t; e++ ) - (O = + ((O = B[ e ]), @@ -33808,7 +33841,7 @@ O.asReference( n, ), - ); + )); return r; })(), ), @@ -33938,7 +33971,7 @@ .length) ) { var rt; - (d = + ((d = n.scope.variables.splice( J, )), @@ -33949,7 +33982,7 @@ _toConsumableArray( d, ), - ); + )); } } if ( @@ -33967,8 +34000,8 @@ S < N; S++ ) - (l = $[S]), - (l.unshift = !1); + ((l = $[S]), + (l.unshift = !1)); this.compileCommentFragments( n, this.funcGlyph, @@ -33987,7 +34020,7 @@ n.scope, n.scope.parent, ]; - (k = it[0]), + ((k = it[0]), (n.scope = it[1]), (A = this.name.compileToFragments( @@ -33995,7 +34028,7 @@ )), "." === A[0].code && A.shift(), - (n.scope = k); + (n.scope = k)); } if ( ((u = this.joinFragmentArrays( @@ -34008,12 +34041,12 @@ t < e; t++ ) - (C = L[t]), + ((C = L[t]), n.push( this.makeCode( C, ), - ); + )); return n; }.call(this), " ", @@ -34081,8 +34114,8 @@ n < r; n++ ) - (i = s[n]), - o.push(i.eachName(t)); + ((i = s[n]), + o.push(i.eachName(t))); return o; }, }, @@ -34383,7 +34416,7 @@ s < u; s++ ) - (l = h[s]), + ((l = h[s]), (a = l), l instanceof o && null == l.context && @@ -34427,7 +34460,7 @@ l.error( "illegal parameter " + l.compile(), - ); + )); }, }, { @@ -34465,7 +34498,7 @@ n ); })(a); - return (e.prototype.children = ["name", "value"]), e; + return ((e.prototype.children = ["name", "value"]), e); }.call(this)), (e.Splat = bt = function () { @@ -34478,7 +34511,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.name = e.compile ? e : new G(e)), n; + return ((n.name = e.compile ? e : new G(e)), n); } return ( _inherits(t, e), @@ -34524,7 +34557,7 @@ t ); })(a); - return (e.prototype.children = ["name"]), e; + return ((e.prototype.children = ["name"]), e); }.call(this)), (e.Expansion = w = function () { @@ -34563,7 +34596,7 @@ t ); })(a); - return (e.prototype.shouldCache = nt), e; + return ((e.prototype.shouldCache = nt), e); }.call(this)), (e.Elision = g = function () { @@ -34668,7 +34701,7 @@ { key: "addBody", value: function (t) { - return (this.body = t), this; + return ((this.body = t), this); }, }, { @@ -34915,11 +34948,11 @@ n && n.operator; ) - t && + (t && (t = n.operator in r), - (n = n.first); + (n = n.first)); if (!t) return new ft( this, @@ -34929,10 +34962,10 @@ n && n.operator; ) - (n.invert = !n.invert), + ((n.invert = !n.invert), (n.operator = r[n.operator]), - (n = n.first); + (n = n.first)); return this; } return (o = r[this.operator]) @@ -34989,11 +35022,11 @@ i < s; i++ ) - (u = l[i]), + ((u = l[i]), u.value ? (a.push(u.value), delete u.value) - : a.push(u); + : a.push(u)); return ( (n = new h(t, a)), (n.do = !0), @@ -35404,7 +35437,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (r.object = e), (r.array = n), r; + return ((r.object = e), (r.array = n), r); } return ( _inherits(t, e), @@ -35455,7 +35488,7 @@ c, h, p; - (h = r[0]), (l = r[1]); + ((h = r[0]), (l = r[1])); var d = this.negated ? [" !== ", " && "] : [" === ", " || "], @@ -35470,7 +35503,7 @@ a < f; o = ++a ) - (u = c[o]), + ((u = c[o]), o && p.push( this.makeCode(s), @@ -35482,7 +35515,7 @@ t, W, ), - )); + ))); return t.level < $ ? p : this.wrapInParentheses(p); @@ -35733,7 +35766,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.expression = e), n; + return ((n.expression = e), n); } return ( _inherits(t, e), @@ -35804,9 +35837,9 @@ r < i; r++ ) - (n = o[r]), + ((n = o[r]), 0 > t.call(s, n) && - s.push(n); + s.push(n)); return delete e.comments; } }, @@ -35837,7 +35870,7 @@ ? ["===", "||"] : ["!==", "&&"], o = _slicedToArray(s, 2); - (n = o[0]), + ((n = o[0]), (r = o[1]), (i = "typeof " + @@ -35856,9 +35889,9 @@ n + " " + this - .comparisonTarget)); + .comparisonTarget))); } else - (n = + ((n = "null" === this.comparisonTarget ? this.negated @@ -35872,7 +35905,7 @@ " " + n + " " + - this.comparisonTarget); + this.comparisonTarget)); return [ this.makeCode( t.level <= X @@ -35903,7 +35936,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.body = e), n; + return ((n.body = e), n); } return ( _inherits(t, e), @@ -35968,7 +36001,7 @@ t ); })(a); - return (e.prototype.children = ["body"]), e; + return ((e.prototype.children = ["body"]), e); }.call(this)), (e.StringWithInterpolations = St = function () { @@ -35981,7 +36014,7 @@ t.__proto__ || Object.getPrototypeOf(t) ).call(this), ); - return (n.body = e), n; + return ((n.body = e), n); } return ( _inherits(t, e), @@ -36030,14 +36063,14 @@ e.comments ) { var a; - (a = + ((a = l).push.apply( a, _toConsumableArray( e.comments, ), ), - delete e.comments; + delete e.comments); } return ( s.push(e), @@ -36058,14 +36091,14 @@ n < i; n++ ) - (t = + ((t = l[ n ]), (t.unshift = !0), (t.newLine = - !0); + !0)); It(l, e); } return ( @@ -36101,14 +36134,14 @@ r < o; r++ ) - (t = + ((t = u[ r ]), (t.unshift = !1), (t.newLine = - !0); + !0)); It( e.comments, s[ @@ -36137,7 +36170,7 @@ i instanceof Et) ) { var h; - (i.value = i.unquote( + ((i.value = i.unquote( !0, this.csx, )), @@ -36166,10 +36199,10 @@ n, ), ), - ); + )); } else { var p; - this.csx || + (this.csx || u.push( this.makeCode("$"), ), @@ -36202,7 +36235,7 @@ _toConsumableArray( r, ), - ); + )); } return ( this.csx || @@ -36236,7 +36269,7 @@ t ); })(a); - return (e.prototype.children = ["body"]), e; + return ((e.prototype.children = ["body"]), e); }.call(this)), (e.For = L = function () { @@ -36280,7 +36313,7 @@ r.object) ) { var c = [r.index, r.name]; - (r.name = c[0]), (r.index = c[1]); + ((r.name = c[0]), (r.index = c[1])); } for ( ((null == (u = r.index) @@ -36338,10 +36371,10 @@ n < s; n++ ) - (t = o[n]), + ((t = o[n]), (t.newLine = t.unshift = - !0); + !0)); return Zt(e, r[i]); } }, @@ -36454,10 +36487,10 @@ ), ), z = _slicedToArray(U, 2); - (j = z[0]), + ((j = z[0]), (I = z[1]), this.step.isNumber() && - (F = +I); + (F = +I)); } return ( this.pattern && (C = E), @@ -36758,7 +36791,8 @@ n < r; n++ ) - (i = s[n]), i[1].makeReturn(t); + ((i = s[n]), + i[1].makeReturn(t)); return ( t && (this.otherwise || @@ -36823,7 +36857,7 @@ h < d; h++ ) - (i = m[h]), + ((i = m[h]), this.subject || (i = i.invert()), (u = u.concat( @@ -36837,7 +36871,7 @@ this.makeCode( ":\n", ), - )); + ))); if ( (0 < (r = @@ -37262,16 +37296,16 @@ }), (Zt = function (e, t) { if (null != e && e.comments) - return It(e.comments, t), delete e.comments; + return (It(e.comments, t), delete e.comments); }), (un = function (e, t) { var n, r, i, s, o; for (i = !1, r = s = 0, o = e.length; s < o; r = ++s) if (((n = e[r]), !n.isComment)) { - e.splice(r, 0, t), (i = !0); + (e.splice(r, 0, t), (i = !0)); break; } - return i || e.push(t), e; + return (i || e.push(t), e); }), (Jt = function (e) { return e instanceof _ && "arguments" === e.value; @@ -37290,8 +37324,8 @@ (on = function (e, t, n) { var r; if ((r = t[n].unfoldSoak(e))) - return (t[n] = r.body), (r.body = new Pt(t)), r; - }); + return ((t[n] = r.body), (r.body = new Pt(t)), r); + })); }.call(this), { exports: e }.exports ); @@ -37301,11 +37335,11 @@ return ( function () { var t, n; - (t = (function () { + ((t = (function () { function e(t) { - _classCallCheck(this, e), + (_classCallCheck(this, e), (this.line = t), - (this.columns = []); + (this.columns = [])); } return ( _createClass(e, [ @@ -37349,7 +37383,7 @@ (n = function () { var e = (function () { function e() { - _classCallCheck(this, e), (this.lines = []); + (_classCallCheck(this, e), (this.lines = [])); } return ( _createClass(e, [ @@ -37447,11 +37481,11 @@ ) if (((p = m[s]), !!p)) { for (; b < p.line; ) - (o = 0), + ((o = 0), (d = !1), (r += ";"), - b++; - d && + b++); + (d && ((r += ","), (d = !1)), (r += @@ -37478,7 +37512,7 @@ )), (u = p.sourceColumn), - (d = !0); + (d = !0)); } return ( (g = t.sourceFiles @@ -37512,10 +37546,11 @@ f || !n; ) - (u = f & s), + ((u = f & s), (f >>= i), f && (u |= r), - (n += this.encodeBase64(u)); + (n += + this.encodeBase64(u))); return n; }, }, @@ -37550,7 +37585,7 @@ e ); }.call(this)), - (e.exports = n); + (e.exports = n)); }.call(this), e.exports ); @@ -37578,7 +37613,7 @@ g; i = n.Lexer; var y = require("./parser"); - (d = y.parser), + ((d = y.parser), (c = require("./helpers")), (s = require("./sourcemap")), (p = require("../../package.json")), @@ -37669,8 +37704,8 @@ (t.referencedVars = (function () { var e, t, n; for (n = [], e = 0, t = O.length; e < t; e++) - (A = O[e]), - "IDENTIFIER" === A[0] && n.push(A[1]); + ((A = O[e]), + "IDENTIFIER" === A[0] && n.push(A[1])); return n; })()), null == t.bare || !0 !== t.bare) @@ -37695,7 +37730,7 @@ b < S; b++ ) - (f = l[b]), + ((f = l[b]), p && (f.locationData && !/^[;\s]*$/.test(f.code) && @@ -37714,7 +37749,7 @@ f.code.length - (f.code.lastIndexOf("\n") + 1)) : (n += f.code.length)), - (w += f.code); + (w += f.code)); if ( (t.header && ((g = @@ -37731,7 +37766,7 @@ throw new Error( "The transpile option must be given an object with options to pass to Babel", ); - (M = t.transpile.transpile), + ((M = t.transpile.transpile), delete t.transpile.transpile, (_ = Object.assign({}, t.transpile)), P && @@ -37739,7 +37774,7 @@ (_.inputSourceMap = P), (D = M(w, _)), (w = D.code), - P && D.map && (P = D.map); + P && D.map && (P = D.map)); } return ( t.inlineMap && @@ -37785,16 +37820,16 @@ if (((n = d.tokens[this.pos++]), n)) { var r = n, i = _slicedToArray(r, 3); - (t = i[0]), + ((t = i[0]), (this.yytext = i[1]), (this.yylloc = i[2]), (d.errorToken = n.origin || n), - (this.yylineno = this.yylloc.first_line); + (this.yylineno = this.yylloc.first_line)); } else t = ""; return t; }, setInput: function (t) { - return (d.tokens = t), (this.pos = 0); + return ((d.tokens = t), (this.pos = 0)); }, upcomingInput: function () { return ""; @@ -37809,7 +37844,7 @@ o, u, a; - (u = r.errorToken), (a = r.tokens); + ((u = r.errorToken), (a = r.tokens)); var f = u, l = _slicedToArray(f, 3); return ( @@ -37973,7 +38008,7 @@ "The arguments were: " + JSON.stringify(n), ) ); - }); + })); }.call(this), { exports: e }.exports ); @@ -37987,7 +38022,7 @@ CoffeeScript, compile, runScripts; - (CoffeeScript = require("./coffeescript")), + ((CoffeeScript = require("./coffeescript")), (compile = CoffeeScript.compile), (CoffeeScript.eval = function (code) { var options = @@ -38023,7 +38058,8 @@ ? arguments[1] : {}; return ( - (t.inlineMap = !0), CoffeeScript.compile(e, t) + (t.inlineMap = !0), + CoffeeScript.compile(e, t) ); }), (CoffeeScript.load = function (e, t) { @@ -38077,10 +38113,10 @@ e < n; e++ ) - (u = f[e]), + ((u = f[e]), ((r = u.type), 0 <= indexOf.call(t, r)) && - i.push(u); + i.push(u)); return i; })(), i = 0, @@ -38103,7 +38139,7 @@ s < o; r = ++s ) - (a = e[r]), + ((a = e[r]), (function (r, i) { var s, o; return ( @@ -38116,7 +38152,7 @@ CoffeeScript.load( o, function (t) { - return (e[i] = t), n(); + return ((e[i] = t), n()); }, s, !0, @@ -38129,7 +38165,7 @@ (s.sourceFiles = ["embedded"]), (e[i] = [r.innerHTML, s])) ); - })(a, r); + })(a, r)); return n(); }), window.addEventListener @@ -38138,7 +38174,7 @@ runScripts, !1, ) - : window.attachEvent("onload", runScripts)); + : window.attachEvent("onload", runScripts))); }.call(this), module.exports ); @@ -38160,9 +38196,9 @@ s = e("../mode/coffee/coffee"); window.addEventListener = function () {}; var o = (t.Worker = function (e) { - i.call(this, e), this.setTimeout(250); + (i.call(this, e), this.setTimeout(250)); }); - r.inherits(o, i), + (r.inherits(o, i), function () { this.onUpdate = function () { var e = this.doc.getValue(), @@ -38183,13 +38219,13 @@ } this.sender.emit("annotate", t); }; - }.call(o.prototype); + }.call(o.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -38262,35 +38298,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -38303,7 +38339,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -38330,7 +38366,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -38432,15 +38468,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -38450,8 +38486,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -38473,9 +38509,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -38484,7 +38520,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -38511,10 +38547,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -38537,16 +38573,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -38558,7 +38594,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -38568,7 +38604,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -38587,8 +38623,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -38633,4 +38669,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/ace/worker-css.js b/web/static/ace/worker-css.js index 3b015c715..7725aa51b 100644 --- a/web/static/ace/worker-css.js +++ b/web/static/ace/worker-css.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,11 +160,11 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -177,10 +177,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -247,18 +247,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -269,28 +269,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -298,10 +298,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -446,11 +446,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -459,7 +459,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -470,11 +470,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -496,9 +496,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -519,18 +519,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -547,7 +547,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -556,7 +556,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -595,18 +595,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -625,7 +625,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -644,16 +644,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -671,7 +671,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -682,19 +682,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -711,7 +711,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -727,7 +727,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -755,8 +755,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -837,10 +837,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -883,8 +883,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -919,7 +919,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -943,7 +943,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -952,12 +952,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -983,9 +983,9 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,7 +1025,7 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/css/csslint", [], function (require, exports, module) { @@ -1040,11 +1040,11 @@ if (typeof e != "object") return e; if (util.isArray(e)) a = []; else if (util.isRegExp(e)) - (a = new RegExp(e.source, util.getRegExpFlags(e))), - e.lastIndex && (a.lastIndex = e.lastIndex); + ((a = new RegExp(e.source, util.getRegExpFlags(e))), + e.lastIndex && (a.lastIndex = e.lastIndex)); else if (util.isDate(e)) a = new Date(e.getTime()); else { - if (o && Buffer.isBuffer(e)) return (a = new Buffer(e.length)), e.copy(a), a; + if (o && Buffer.isBuffer(e)) return ((a = new Buffer(e.length)), e.copy(a), a); typeof r == "undefined" ? (a = Object.create(Object.getPrototypeOf(e))) : (a = Object.create(r)); @@ -1052,7 +1052,7 @@ if (t) { var f = i.indexOf(e); if (f != -1) return s[f]; - i.push(e), s.push(a); + (i.push(e), s.push(a)); } for (var l in e) a[l] = u(e[l], n - 1); return a; @@ -1067,41 +1067,41 @@ ); } function Reporter(e, t) { - (this.messages = []), (this.stats = []), (this.lines = e), (this.ruleset = t); + ((this.messages = []), (this.stats = []), (this.lines = e), (this.ruleset = t)); } var parserlib = {}; - (function () { + ((function () { function e() { this._listeners = {}; } function t(e) { - (this._input = e.replace(/\n\r?/g, "\n")), + ((this._input = e.replace(/\n\r?/g, "\n")), (this._line = 1), (this._col = 1), - (this._cursor = 0); + (this._cursor = 0)); } function n(e, t, n) { - (this.col = n), (this.line = t), (this.message = e); + ((this.col = n), (this.line = t), (this.message = e)); } function r(e, t, n, r) { - (this.col = n), (this.line = t), (this.text = e), (this.type = r); + ((this.col = n), (this.line = t), (this.text = e), (this.type = r)); } function i(e, n) { - (this._reader = e ? new t(e.toString()) : null), + ((this._reader = e ? new t(e.toString()) : null), (this._token = null), (this._tokenData = n), (this._lt = []), (this._ltIndex = 0), - (this._ltIndexCache = []); + (this._ltIndexCache = [])); } - (e.prototype = { + ((e.prototype = { constructor: e, addListener: function (e, t) { - this._listeners[e] || (this._listeners[e] = []), this._listeners[e].push(t); + (this._listeners[e] || (this._listeners[e] = []), this._listeners[e].push(t)); }, fire: function (e) { - typeof e == "string" && (e = { type: e }), - typeof e.target != "undefined" && (e.target = this); + (typeof e == "string" && (e = { type: e }), + typeof e.target != "undefined" && (e.target = this)); if (typeof e.type == "undefined") throw new Error("Event object missing 'type' property."); if (this._listeners[e.type]) { @@ -1183,7 +1183,7 @@ readWhile: function (e) { var t = "", n = this.read(); - while (n !== null && e(n)) (t += n), (n = this.read()); + while (n !== null && e(n)) ((t += n), (n = this.read())); return t; }, readMatch: function (e) { @@ -1223,9 +1223,9 @@ r = e.concat([]), i = 0, s = r.length + 1; - (r.UNKNOWN = -1), r.unshift({ name: "EOF" }); + ((r.UNKNOWN = -1), r.unshift({ name: "EOF" })); for (; i < s; i++) - t.push(r[i].name), (r[r[i].name] = i), r[i].text && (n[r[i].text] = i); + (t.push(r[i].name), (r[r[i].name] = i), r[i].text && (n[r[i].text] = i)); return ( (r.name = function (e) { return t[e]; @@ -1244,14 +1244,14 @@ r = 0, i = e.length; while (r < i) if (n == e[r++]) return !0; - return this.unget(), !1; + return (this.unget(), !1); }, mustMatch: function (e, t) { var r; e instanceof Array || (e = [e]); if (!this.match.apply(this, arguments)) throw ( - ((r = this.LT(1)), + (r = this.LT(1)), new n( "Expected " + this._tokenData[e[0]].name + @@ -1262,7 +1262,7 @@ ".", r.startLine, r.startCol, - )) + ) ); }, advance: function (e, t) { @@ -1283,22 +1283,22 @@ this._ltIndex >= 0 && this._ltIndex < this._lt.length ) { - i++, + (i++, (this._token = this._lt[this._ltIndex++]), - (a = t[this._token.type]); + (a = t[this._token.type])); while ( a.channel !== undefined && e !== a.channel && this._ltIndex < this._lt.length ) - (this._token = this._lt[this._ltIndex++]), + ((this._token = this._lt[this._ltIndex++]), (a = t[this._token.type]), - i++; + i++); if ( (a.channel === undefined || e === a.channel) && this._ltIndex <= this._lt.length ) - return this._ltIndexCache.push(i), this._token.type; + return (this._ltIndexCache.push(i), this._token.type); } return ( (u = this._getToken()), @@ -1322,8 +1322,8 @@ n; if (e > 0) { if (e > 5) throw new Error("Too much lookahead."); - while (t) (n = this.get()), t--; - while (t < e) this.unget(), t++; + while (t) ((n = this.get()), t--); + while (t < e) (this.unget(), t++); } else if (e < 0) { if (!this._lt[this._ltIndex + e]) throw new Error("Too much lookbehind."); @@ -1332,7 +1332,7 @@ return n; }, LT: function (e) { - return this.LA(e), this._lt[this._ltIndex + e - 1]; + return (this.LA(e), this._lt[this._ltIndex + e - 1]); }, peek: function () { return this.LA(1); @@ -1350,8 +1350,8 @@ }, unget: function () { if (!this._ltIndexCache.length) throw new Error("Too much lookahead."); - (this._ltIndex -= this._ltIndexCache.pop()), - (this._token = this._lt[this._ltIndex - 1]); + ((this._ltIndex -= this._ltIndexCache.pop()), + (this._token = this._lt[this._ltIndex - 1])); }, }), (parserlib.util = { @@ -1360,11 +1360,11 @@ SyntaxUnit: r, EventTarget: e, TokenStreamBase: i, - }); + })); })(), (function () { function Combinator(e, t, n) { - SyntaxUnit.call(this, e, t, n, Parser.COMBINATOR_TYPE), + (SyntaxUnit.call(this, e, t, n, Parser.COMBINATOR_TYPE), (this.type = "unknown"), /^\s+$/.test(e) ? (this.type = "descendant") @@ -1372,10 +1372,10 @@ ? (this.type = "child") : e == "+" ? (this.type = "adjacent-sibling") - : e == "~" && (this.type = "sibling"); + : e == "~" && (this.type = "sibling")); } function MediaFeature(e, t) { - SyntaxUnit.call( + (SyntaxUnit.call( this, "(" + e + (t !== null ? ":" + t : "") + ")", e.startLine, @@ -1383,10 +1383,10 @@ Parser.MEDIA_FEATURE_TYPE, ), (this.name = e), - (this.value = t); + (this.value = t)); } function MediaQuery(e, t, n, r, i) { - SyntaxUnit.call( + (SyntaxUnit.call( this, (e ? e + " " : "") + (t ? t : "") + @@ -1398,29 +1398,29 @@ ), (this.modifier = e), (this.mediaType = t), - (this.features = n); + (this.features = n)); } function Parser(e) { - EventTarget.call(this), (this.options = e || {}), (this._tokenStream = null); + (EventTarget.call(this), (this.options = e || {}), (this._tokenStream = null)); } function PropertyName(e, t, n, r) { - SyntaxUnit.call(this, e, n, r, Parser.PROPERTY_NAME_TYPE), (this.hack = t); + (SyntaxUnit.call(this, e, n, r, Parser.PROPERTY_NAME_TYPE), (this.hack = t)); } function PropertyValue(e, t, n) { - SyntaxUnit.call(this, e.join(" "), t, n, Parser.PROPERTY_VALUE_TYPE), - (this.parts = e); + (SyntaxUnit.call(this, e.join(" "), t, n, Parser.PROPERTY_VALUE_TYPE), + (this.parts = e)); } function PropertyValueIterator(e) { - (this._i = 0), (this._parts = e.parts), (this._marks = []), (this.value = e); + ((this._i = 0), (this._parts = e.parts), (this._marks = []), (this.value = e)); } function PropertyValuePart(text, line, col) { - SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_VALUE_PART_TYPE), - (this.type = "unknown"); + (SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_VALUE_PART_TYPE), + (this.type = "unknown")); var temp; if (/^([+\-]?[\d\.]+)([a-z]+)$/i.test(text)) { - (this.type = "dimension"), + ((this.type = "dimension"), (this.value = +RegExp.$1), - (this.units = RegExp.$2); + (this.units = RegExp.$2)); switch (this.units.toLowerCase()) { case "em": case "rem": @@ -1559,22 +1559,22 @@ (this.value = text)); } function Selector(e, t, n) { - SyntaxUnit.call(this, e.join(" "), t, n, Parser.SELECTOR_TYPE), + (SyntaxUnit.call(this, e.join(" "), t, n, Parser.SELECTOR_TYPE), (this.parts = e), - (this.specificity = Specificity.calculate(this)); + (this.specificity = Specificity.calculate(this))); } function SelectorPart(e, t, n, r, i) { - SyntaxUnit.call(this, n, r, i, Parser.SELECTOR_PART_TYPE), + (SyntaxUnit.call(this, n, r, i, Parser.SELECTOR_PART_TYPE), (this.elementName = e), - (this.modifiers = t); + (this.modifiers = t)); } function SelectorSubPart(e, t, n, r) { - SyntaxUnit.call(this, e, n, r, Parser.SELECTOR_SUB_PART_TYPE), + (SyntaxUnit.call(this, e, n, r, Parser.SELECTOR_SUB_PART_TYPE), (this.type = t), - (this.args = []); + (this.args = [])); } function Specificity(e, t, n, r) { - (this.a = e), (this.b = t), (this.c = n), (this.d = r); + ((this.a = e), (this.b = t), (this.c = n), (this.d = r)); } function isHexDigit(e) { return e !== null && h.test(e); @@ -1605,7 +1605,7 @@ TokenStreamBase.call(this, e, Tokens); } function ValidationError(e, t, n) { - (this.col = n), (this.line = t), (this.message = e); + ((this.col = n), (this.line = t), (this.message = e)); } var EventTarget = parserlib.util.EventTarget, TokenStreamBase = parserlib.util.TokenStreamBase, @@ -1800,7 +1800,7 @@ windowframe: "Window frame.", windowtext: "Text in windows.", }; - (Combinator.prototype = new SyntaxUnit()), + ((Combinator.prototype = new SyntaxUnit()), (Combinator.prototype.constructor = Combinator), (MediaFeature.prototype = new SyntaxUnit()), (MediaFeature.prototype.constructor = MediaFeature), @@ -1837,31 +1837,31 @@ n, r, i; - this.fire("startstylesheet"), + (this.fire("startstylesheet"), this._charset(), - this._skipCruft(); + this._skipCruft()); while (e.peek() == Tokens.IMPORT_SYM) - this._import(), this._skipCruft(); + (this._import(), this._skipCruft()); while (e.peek() == Tokens.NAMESPACE_SYM) - this._namespace(), this._skipCruft(); + (this._namespace(), this._skipCruft()); i = e.peek(); while (i > Tokens.EOF) { try { switch (i) { case Tokens.MEDIA_SYM: - this._media(), this._skipCruft(); + (this._media(), this._skipCruft()); break; case Tokens.PAGE_SYM: - this._page(), this._skipCruft(); + (this._page(), this._skipCruft()); break; case Tokens.FONT_FACE_SYM: - this._font_face(), this._skipCruft(); + (this._font_face(), this._skipCruft()); break; case Tokens.KEYFRAMES_SYM: - this._keyframes(), this._skipCruft(); + (this._keyframes(), this._skipCruft()); break; case Tokens.VIEWPORT_SYM: - this._viewport(), this._skipCruft(); + (this._viewport(), this._skipCruft()); break; case Tokens.UNKNOWN_SYM: e.get(); @@ -1871,7 +1871,7 @@ e.LT(0).startLine, e.LT(0).startCol, ); - this.fire({ + (this.fire({ type: "error", error: null, message: @@ -1881,13 +1881,13 @@ line: e.LT(0).startLine, col: e.LT(0).startCol, }), - (n = 0); + (n = 0)); while ( e.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE ) n++; - while (n) e.advance([Tokens.RBRACE]), n--; + while (n) (e.advance([Tokens.RBRACE]), n--); break; case Tokens.S: this._readWhitespace(); @@ -1897,39 +1897,39 @@ switch (i) { case Tokens.CHARSET_SYM: throw ( - ((r = e.LT(1)), + (r = e.LT(1)), this._charset(!1), new SyntaxError( "@charset not allowed here.", r.startLine, r.startCol, - )) + ) ); case Tokens.IMPORT_SYM: throw ( - ((r = e.LT(1)), + (r = e.LT(1)), this._import(!1), new SyntaxError( "@import not allowed here.", r.startLine, r.startCol, - )) + ) ); case Tokens.NAMESPACE_SYM: throw ( - ((r = e.LT(1)), + (r = e.LT(1)), this._namespace(!1), new SyntaxError( "@namespace not allowed here.", r.startLine, r.startCol, - )) + ) ); default: - e.get(), + (e.get(), this._unexpectedToken( e.token(), - ); + )); } } } catch (s) { @@ -1945,8 +1945,8 @@ } i = e.peek(); } - i != Tokens.EOF && this._unexpectedToken(e.token()), - this.fire("endstylesheet"); + (i != Tokens.EOF && this._unexpectedToken(e.token()), + this.fire("endstylesheet")); }, _charset: function (e) { var t = this._tokenStream, @@ -1977,7 +1977,7 @@ r, i, s = []; - t.mustMatch(Tokens.IMPORT_SYM), + (t.mustMatch(Tokens.IMPORT_SYM), (i = t.token()), this._readWhitespace(), t.mustMatch([Tokens.STRING, Tokens.URI]), @@ -1998,7 +1998,7 @@ media: s, line: i.startLine, col: i.startCol, - }); + })); }, _namespace: function (e) { var t = this._tokenStream, @@ -2006,7 +2006,7 @@ r, i, s; - t.mustMatch(Tokens.NAMESPACE_SYM), + (t.mustMatch(Tokens.NAMESPACE_SYM), (n = t.token().startLine), (r = t.token().startCol), this._readWhitespace(), @@ -2026,14 +2026,14 @@ uri: s, line: n, col: r, - }); + })); }, _media: function () { var e = this._tokenStream, t, n, r; - e.mustMatch(Tokens.MEDIA_SYM), + (e.mustMatch(Tokens.MEDIA_SYM), (t = e.token().startLine), (n = e.token().startCol), this._readWhitespace(), @@ -2045,25 +2045,25 @@ media: r, line: t, col: n, - }); + })); for (;;) if (e.peek() == Tokens.PAGE_SYM) this._page(); else if (e.peek() == Tokens.FONT_FACE_SYM) this._font_face(); else if (e.peek() == Tokens.VIEWPORT_SYM) this._viewport(); else if (!this._ruleset()) break; - e.mustMatch(Tokens.RBRACE), + (e.mustMatch(Tokens.RBRACE), this._readWhitespace(), - this.fire({ type: "endmedia", media: r, line: t, col: n }); + this.fire({ type: "endmedia", media: r, line: t, col: n })); }, _media_query_list: function () { var e = this._tokenStream, t = []; - this._readWhitespace(), + (this._readWhitespace(), (e.peek() == Tokens.IDENT || e.peek() == Tokens.LPAREN) && - t.push(this._media_query()); + t.push(this._media_query())); while (e.match(Tokens.COMMA)) - this._readWhitespace(), t.push(this._media_query()); + (this._readWhitespace(), t.push(this._media_query())); return t; }, _media_query: function () { @@ -2072,7 +2072,7 @@ n = null, r = null, i = []; - e.match(Tokens.IDENT) && + (e.match(Tokens.IDENT) && ((n = e.token().value.toLowerCase()), n != "only" && n != "not" ? (e.unget(), (n = null)) @@ -2083,14 +2083,14 @@ r === null && (r = e.token())) : e.peek() == Tokens.LPAREN && (r === null && (r = e.LT(1)), - i.push(this._media_expression())); + i.push(this._media_expression()))); if (t === null && i.length === 0) return null; this._readWhitespace(); while (e.match(Tokens.IDENT)) - e.token().value.toLowerCase() != "and" && + (e.token().value.toLowerCase() != "and" && this._unexpectedToken(e.token()), this._readWhitespace(), - i.push(this._media_expression()); + i.push(this._media_expression())); return new MediaQuery(n, t, i, r.startLine, r.startCol); }, _media_type: function () { @@ -2121,7 +2121,8 @@ _media_feature: function () { var e = this._tokenStream; return ( - e.mustMatch(Tokens.IDENT), SyntaxUnit.fromToken(e.token()) + e.mustMatch(Tokens.IDENT), + SyntaxUnit.fromToken(e.token()) ); }, _page: function () { @@ -2130,7 +2131,7 @@ n, r = null, i = null; - e.mustMatch(Tokens.PAGE_SYM), + (e.mustMatch(Tokens.PAGE_SYM), (t = e.token().startLine), (n = e.token().startCol), this._readWhitespace(), @@ -2154,7 +2155,7 @@ pseudo: i, line: t, col: n, - }); + })); }, _margin: function () { var e = this._tokenStream, @@ -2215,25 +2216,25 @@ var e = this._tokenStream, t, n; - e.mustMatch(Tokens.FONT_FACE_SYM), + (e.mustMatch(Tokens.FONT_FACE_SYM), (t = e.token().startLine), (n = e.token().startCol), this._readWhitespace(), this.fire({ type: "startfontface", line: t, col: n }), this._readDeclarations(!0), - this.fire({ type: "endfontface", line: t, col: n }); + this.fire({ type: "endfontface", line: t, col: n })); }, _viewport: function () { var e = this._tokenStream, t, n; - e.mustMatch(Tokens.VIEWPORT_SYM), + (e.mustMatch(Tokens.VIEWPORT_SYM), (t = e.token().startLine), (n = e.token().startCol), this._readWhitespace(), this.fire({ type: "startviewport", line: t, col: n }), this._readDeclarations(!0), - this.fire({ type: "endviewport", line: t, col: n }); + this.fire({ type: "endviewport", line: t, col: n })); }, _operator: function (e) { var t = this._tokenStream, @@ -2242,7 +2243,7 @@ t.match([Tokens.SLASH, Tokens.COMMA]) || (e && t.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS])) ) - (n = t.token()), this._readWhitespace(); + ((n = t.token()), this._readWhitespace()); return n ? PropertyValuePart.fromToken(n) : null; }, _combinator: function () { @@ -2303,14 +2304,14 @@ n = this._selectors_group(); } catch (r) { if (r instanceof SyntaxError && !this.options.strict) { - this.fire({ + (this.fire({ type: "error", error: r, message: r.message, line: r.line, col: r.col, }), - (t = e.advance([Tokens.RBRACE])); + (t = e.advance([Tokens.RBRACE]))); if (t != Tokens.RBRACE) throw r; return !0; } @@ -2342,11 +2343,11 @@ if (n !== null) { t.push(n); while (e.match(Tokens.COMMA)) - this._readWhitespace(), + (this._readWhitespace(), (n = this._selector()), n !== null ? t.push(n) - : this._unexpectedToken(e.LT(1)); + : this._unexpectedToken(e.LT(1))); } return t.length ? t : null; }, @@ -2362,14 +2363,14 @@ do { r = this._combinator(); if (r !== null) - t.push(r), + (t.push(r), (n = this._simple_selector_sequence()), n === null ? this._unexpectedToken(e.LT(1)) - : t.push(n); + : t.push(n)); else { if (!this._readWhitespace()) break; - (i = new Combinator( + ((i = new Combinator( e.token().value, e.token().startLine, e.token().startCol, @@ -2379,7 +2380,7 @@ n === null ? r !== null && this._unexpectedToken(e.LT(1)) : (r !== null ? t.push(r) : t.push(i), - t.push(n)); + t.push(n))); } } while (!0); return new Selector(t, t[0].line, t[0].col); @@ -2411,11 +2412,11 @@ a = !1, f, l; - (f = e.LT(1).startLine), + ((f = e.LT(1).startLine), (l = e.LT(1).startCol), (t = this._type_selector()), t || (t = this._universal()), - t !== null && (r += t); + t !== null && (r += t)); for (;;) { if (e.peek() === Tokens.S) break; while (s < o && u === null) u = i[s++].call(this); @@ -2423,7 +2424,7 @@ if (r === "") return null; break; } - (s = 0), n.push(u), (r += u.toString()), (u = null); + ((s = 0), n.push(u), (r += u.toString()), (u = null)); } return r !== "" ? new SelectorPart(t, n, r, f, l) : null; }, @@ -2466,10 +2467,10 @@ var e = this._tokenStream, t = ""; if (e.LA(1) === Tokens.PIPE || e.LA(2) === Tokens.PIPE) - e.match([Tokens.IDENT, Tokens.STAR]) && + (e.match([Tokens.IDENT, Tokens.STAR]) && (t += e.token().value), e.mustMatch(Tokens.PIPE), - (t += "|"); + (t += "|")); return t.length ? t : null; }, _universal: function () { @@ -2572,7 +2573,7 @@ Tokens.SLASH, ]) ) - (t += e.token().value), (t += this._readWhitespace()); + ((t += e.token().value), (t += this._readWhitespace())); return t.length ? t : null; }, _negation: function () { @@ -2624,8 +2625,8 @@ o, u, a; - (o = e.LT(1).startLine), (u = e.LT(1).startCol); - while (r < i && n === null) (n = t[r].call(this)), r++; + ((o = e.LT(1).startLine), (u = e.LT(1).startCol)); + while (r < i && n === null) ((n = t[r].call(this)), r++); return ( n === null && this._unexpectedToken(e.LT(1)), n.type == "elementName" @@ -2644,13 +2645,13 @@ o = ""; t = this._property(); if (t !== null) { - e.mustMatch(Tokens.COLON), + (e.mustMatch(Tokens.COLON), this._readWhitespace(), (n = this._expr()), (!n || n.length === 0) && this._unexpectedToken(e.LT(1)), (r = this._prio()), - (o = t.toString()); + (o = t.toString())); if ( (this.options.starHack && t.hack == "*") || (this.options.underscoreHack && t.hack == "_") @@ -2679,7 +2680,7 @@ _prio: function () { var e = this._tokenStream, t = e.match(Tokens.IMPORTANT_SYM); - return this._readWhitespace(), t; + return (this._readWhitespace(), t); }, _expr: function (e) { var t = this._tokenStream, @@ -2690,9 +2691,9 @@ if (r !== null) { n.push(r); do { - (i = this._operator(e)), + ((i = this._operator(e)), i && n.push(i), - (r = this._term(e)); + (r = this._term(e))); if (r === null) break; n.push(r); } while (!0); @@ -2774,28 +2775,32 @@ n = null, r; if (e.match(Tokens.FUNCTION)) { - (t = e.token().value), + ((t = e.token().value), this._readWhitespace(), (n = this._expr(!0)), - (t += n); + (t += n)); if (this.options.ieFilters && e.peek() == Tokens.EQUALS) do { - this._readWhitespace() && (t += e.token().value), + (this._readWhitespace() && (t += e.token().value), e.LA(0) == Tokens.COMMA && (t += e.token().value), e.match(Tokens.IDENT), (t += e.token().value), e.match(Tokens.EQUALS), (t += e.token().value), - (r = e.peek()); + (r = e.peek())); while ( r != Tokens.COMMA && r != Tokens.S && r != Tokens.RPAREN ) - e.get(), (t += e.token().value), (r = e.peek()); + (e.get(), + (t += e.token().value), + (r = e.peek())); } while (e.match([Tokens.COMMA, Tokens.S])); - e.match(Tokens.RPAREN), (t += ")"), this._readWhitespace(); + (e.match(Tokens.RPAREN), + (t += ")"), + this._readWhitespace()); } return t; }, @@ -2807,21 +2812,23 @@ if (e.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])) { t = e.token().value; do { - this._readWhitespace() && (t += e.token().value), + (this._readWhitespace() && (t += e.token().value), e.LA(0) == Tokens.COMMA && (t += e.token().value), e.match(Tokens.IDENT), (t += e.token().value), e.match(Tokens.EQUALS), (t += e.token().value), - (r = e.peek()); + (r = e.peek())); while ( r != Tokens.COMMA && r != Tokens.S && r != Tokens.RPAREN ) - e.get(), (t += e.token().value), (r = e.peek()); + (e.get(), (t += e.token().value), (r = e.peek())); } while (e.match([Tokens.COMMA, Tokens.S])); - e.match(Tokens.RPAREN), (t += ")"), this._readWhitespace(); + (e.match(Tokens.RPAREN), + (t += ")"), + this._readWhitespace()); } return t; }, @@ -2830,7 +2837,7 @@ t = null, n; if (e.match(Tokens.HASH)) { - (t = e.token()), (n = t.value); + ((t = e.token()), (n = t.value)); if (!/#[a-f0-9]{3,6}/i.test(n)) throw new SyntaxError( "Expected a hex color but found '" + @@ -2853,7 +2860,7 @@ n, r, i = ""; - e.mustMatch(Tokens.KEYFRAMES_SYM), + (e.mustMatch(Tokens.KEYFRAMES_SYM), (t = e.token()), /^@\-([^\-]+)\-/.test(t.value) && (i = RegExp.$1), this._readWhitespace(), @@ -2868,12 +2875,12 @@ col: t.startCol, }), this._readWhitespace(), - (n = e.peek()); + (n = e.peek())); while (n == Tokens.IDENT || n == Tokens.PERCENTAGE) - this._keyframe_rule(), + (this._keyframe_rule(), this._readWhitespace(), - (n = e.peek()); - this.fire({ + (n = e.peek())); + (this.fire({ type: "endkeyframes", name: r, prefix: i, @@ -2881,7 +2888,7 @@ col: t.startCol, }), this._readWhitespace(), - e.mustMatch(Tokens.RBRACE); + e.mustMatch(Tokens.RBRACE)); }, _keyframe_name: function () { var e = this._tokenStream, @@ -2895,7 +2902,7 @@ var e = this._tokenStream, t, n = this._key_list(); - this.fire({ + (this.fire({ type: "startkeyframerule", keys: n, line: n[0].line, @@ -2907,18 +2914,18 @@ keys: n, line: n[0].line, col: n[0].col, - }); + })); }, _key_list: function () { var e = this._tokenStream, t, n, r = []; - r.push(this._key()), this._readWhitespace(); + (r.push(this._key()), this._readWhitespace()); while (e.match(Tokens.COMMA)) - this._readWhitespace(), + (this._readWhitespace(), r.push(this._key()), - this._readWhitespace(); + this._readWhitespace()); return r; }, _key: function () { @@ -2942,9 +2949,9 @@ _readDeclarations: function (e, t) { var n = this._tokenStream, r; - this._readWhitespace(), + (this._readWhitespace(), e && n.mustMatch(Tokens.LBRACE), - this._readWhitespace(); + this._readWhitespace()); try { for (;;) { if ( @@ -2958,18 +2965,18 @@ } this._readWhitespace(); } - n.mustMatch(Tokens.RBRACE), this._readWhitespace(); + (n.mustMatch(Tokens.RBRACE), this._readWhitespace()); } catch (i) { if (!(i instanceof SyntaxError && !this.options.strict)) throw i; - this.fire({ + (this.fire({ type: "error", error: i, message: i.message, line: i.line, col: i.col, }), - (r = n.advance([Tokens.SEMICOLON, Tokens.RBRACE])); + (r = n.advance([Tokens.SEMICOLON, Tokens.RBRACE]))); if (r == Tokens.SEMICOLON) this._readDeclarations(!1, t); else if (r != Tokens.RBRACE) throw i; } @@ -3001,8 +3008,8 @@ Validation.validate(e, t); }, parse: function (e) { - (this._tokenStream = new TokenStream(e, Tokens)), - this._stylesheet(); + ((this._tokenStream = new TokenStream(e, Tokens)), + this._stylesheet()); }, parseStyleSheet: function (e) { return this.parse(e); @@ -3010,35 +3017,35 @@ parseMediaQuery: function (e) { this._tokenStream = new TokenStream(e, Tokens); var t = this._media_query(); - return this._verifyEnd(), t; + return (this._verifyEnd(), t); }, parsePropertyValue: function (e) { - (this._tokenStream = new TokenStream(e, Tokens)), - this._readWhitespace(); + ((this._tokenStream = new TokenStream(e, Tokens)), + this._readWhitespace()); var t = this._expr(); - return this._readWhitespace(), this._verifyEnd(), t; + return (this._readWhitespace(), this._verifyEnd(), t); }, parseRule: function (e) { - (this._tokenStream = new TokenStream(e, Tokens)), - this._readWhitespace(); + ((this._tokenStream = new TokenStream(e, Tokens)), + this._readWhitespace()); var t = this._ruleset(); - return this._readWhitespace(), this._verifyEnd(), t; + return (this._readWhitespace(), this._verifyEnd(), t); }, parseSelector: function (e) { - (this._tokenStream = new TokenStream(e, Tokens)), - this._readWhitespace(); + ((this._tokenStream = new TokenStream(e, Tokens)), + this._readWhitespace()); var t = this._selector(); - return this._readWhitespace(), this._verifyEnd(), t; + return (this._readWhitespace(), this._verifyEnd(), t); }, parseStyleAttribute: function (e) { - (e += "}"), + ((e += "}"), (this._tokenStream = new TokenStream(e, Tokens)), - this._readDeclarations(); + this._readDeclarations()); }, }; for (t in n) n.hasOwnProperty(t) && (e[t] = n[t]); return e; - })()); + })())); var Properties = { "align-items": "flex-start | flex-end | center | baseline | stretch", "align-content": @@ -3126,7 +3133,7 @@ ((i = !0), r || ValidationTypes.isAny(e, "behind"))); if (e.hasNext()) throw ( - ((s = e.next()), + (s = e.next()), i ? new ValidationError( "Expected end of value but found '" + s + "'.", @@ -3137,7 +3144,7 @@ "Expected (<'azimuth'>) but found '" + s + "'.", s.line, s.col, - )) + ) ); }, "backface-visibility": "visible | hidden", @@ -3186,7 +3193,7 @@ r ? (t = !0) : ValidationTypes.isAny(e, "fill"); if (e.hasNext()) throw ( - ((o = e.next()), + (o = e.next()), t ? new ValidationError( "Expected end of value but found '" + o + "'.", @@ -3199,7 +3206,7 @@ "'.", o.line, o.col, - )) + ) ); }, "border-image-source": " | none", @@ -3223,13 +3230,13 @@ t = ValidationTypes.isAny(e, n); if (!t) { if (!(e.peek() == "/" && s > 0 && !r)) break; - (r = !0), (o = s + 5), e.next(); + ((r = !0), (o = s + 5), e.next()); } s++; } if (e.hasNext()) throw ( - ((u = e.next()), + (u = e.next()), t ? new ValidationError( "Expected end of value but found '" + u + "'.", @@ -3240,7 +3247,7 @@ "Expected (<'border-radius'>) but found '" + u + "'.", u.line, u.col, - )) + ) ); }, "border-right": " || || ", @@ -3283,12 +3290,12 @@ Validation.multiProperty("", e, !0, Infinity); else if (e.hasNext()) throw ( - ((n = e.next()), + (n = e.next()), new ValidationError( "Expected end of value but found '" + n + "'.", n.line, n.col, - )) + ) ); }, "box-sizing": "content-box | border-box | inherit", @@ -3566,7 +3573,7 @@ "z-index": " | auto | inherit", zoom: " | | normal", }; - (PropertyName.prototype = new SyntaxUnit()), + ((PropertyName.prototype = new SyntaxUnit()), (PropertyName.prototype.constructor = PropertyName), (PropertyName.prototype.toString = function () { return (this.hack ? this.hack : "") + this.text; @@ -3601,9 +3608,9 @@ (PropertyValuePart.prototype.constructor = PropertyValuePart), (PropertyValuePart.fromToken = function (e) { return new PropertyValuePart(e.value, e.startLine, e.startCol); - }); + })); var Pseudos = { ":first-letter": 1, ":first-line": 1, ":before": 1, ":after": 1 }; - (Pseudos.ELEMENT = 1), + ((Pseudos.ELEMENT = 1), (Pseudos.CLASS = 2), (Pseudos.isElement = function (e) { return e.indexOf("::") === 0 || Pseudos[e.toLowerCase()] == Pseudos.ELEMENT; @@ -3667,9 +3674,9 @@ s = 0, o = 0; for (t = 0, n = e.parts.length; t < n; t++) - (r = e.parts[t]), r instanceof SelectorPart && u(r); + ((r = e.parts[t]), r instanceof SelectorPart && u(r)); return new Specificity(0, i, s, o); - }); + })); var h = /^[0-9a-fA-F]$/, nonascii = /^[\u0080-\uFFFF]$/, nl = /\n|\r\n|\r|\f/; @@ -3748,7 +3755,8 @@ break; } return ( - !r && t === null && (r = this.createToken(Tokens.EOF, null, i, s)), r + !r && t === null && (r = this.createToken(Tokens.EOF, null, i, s)), + r ); }, createToken: function (e, t, n, r, i) { @@ -3775,10 +3783,10 @@ o = !1, u, a; - i.mark(), + (i.mark(), (u = this.readName()), (r = e + u), - (s = Tokens.type(r.toLowerCase())); + (s = Tokens.type(r.toLowerCase()))); if (s == Tokens.CHAR || s == Tokens.UNKNOWN) r.length > 1 ? (s = Tokens.UNKNOWN_SYM) @@ -3855,7 +3863,7 @@ s = Tokens.CHAR, o, u; - r.mark(), (u = r.read()); + (r.mark(), (u = r.read())); while (u) { if (u == "/") { if (r.peek() != "*") break; @@ -3864,9 +3872,9 @@ } else { if (!isWhitespace(u)) { if (/i/i.test(u)) { - (o = r.readCount(8)), + ((o = r.readCount(8)), /mportant/i.test(o) && - ((i += u + o), (s = Tokens.IMPORTANT_SYM)); + ((i += u + o), (s = Tokens.IMPORTANT_SYM))); break; } break; @@ -3931,9 +3939,9 @@ u = Tokens.INVALID; break; } - (o = a), (a = s.read()); + ((o = a), (a = s.read())); } - return a === null && (u = Tokens.INVALID), this.createToken(u, i, t, n); + return (a === null && (u = Tokens.INVALID), this.createToken(u, i, t, n)); }, unicodeRangeToken: function (e, t, n) { var r = this._reader, @@ -3966,15 +3974,16 @@ var t = this._reader, n = "", r = t.peek(); - while (isHexDigit(r) && n.length < 6) t.read(), (n += r), (r = t.peek()); - if (e) while (r == "?" && n.length < 6) t.read(), (n += r), (r = t.peek()); + while (isHexDigit(r) && n.length < 6) (t.read(), (n += r), (r = t.peek())); + if (e) + while (r == "?" && n.length < 6) (t.read(), (n += r), (r = t.peek())); return n; }, readWhitespace: function () { var e = this._reader, t = "", n = e.peek(); - while (isWhitespace(n)) e.read(), (t += n), (n = e.peek()); + while (isWhitespace(n)) (e.read(), (t += n), (n = e.peek())); return t; }, readNumber: function (e) { @@ -3987,7 +3996,7 @@ else { if (i != ".") break; if (r) break; - (r = !0), (n += t.read()); + ((r = !0), (n += t.read())); } i = t.peek(); } @@ -4000,15 +4009,15 @@ r = t, i = e.peek(); while (i) { - (i = e.read()), (n += i); + ((i = e.read()), (n += i)); if (i == t && r != "\\") break; if (isNewLine(e.peek()) && i != "\\") { n = ""; break; } - (r = i), (i = e.peek()); + ((r = i), (i = e.peek())); } - return i === null && (n = ""), n; + return (i === null && (n = ""), n); }, readURI: function (e) { var t = this._reader, @@ -4016,17 +4025,20 @@ r = "", i = t.peek(); t.mark(); - while (i && isWhitespace(i)) t.read(), (i = t.peek()); - i == "'" || i == '"' ? (r = this.readString()) : (r = this.readURL()), - (i = t.peek()); - while (i && isWhitespace(i)) t.read(), (i = t.peek()); - return r === "" || i != ")" ? ((n = e), t.reset()) : (n += r + t.read()), n; + while (i && isWhitespace(i)) (t.read(), (i = t.peek())); + (i == "'" || i == '"' ? (r = this.readString()) : (r = this.readURL()), + (i = t.peek())); + while (i && isWhitespace(i)) (t.read(), (i = t.peek())); + return ( + r === "" || i != ")" ? ((n = e), t.reset()) : (n += r + t.read()), + n + ); }, readURL: function () { var e = this._reader, t = "", n = e.peek(); - while (/^[!#$%&\\*-~]$/.test(n)) (t += e.read()), (n = e.peek()); + while (/^[!#$%&\\*-~]$/.test(n)) ((t += e.read()), (n = e.peek())); return t; }, readName: function (e) { @@ -4034,10 +4046,10 @@ n = e || "", r = t.peek(); for (;;) - if (r == "\\") (n += this.readEscape(t.read())), (r = t.peek()); + if (r == "\\") ((n += this.readEscape(t.read())), (r = t.peek())); else { if (!r || !isNameChar(r)) break; - (n += t.read()), (r = t.peek()); + ((n += t.read()), (r = t.peek())); } return n; }, @@ -4047,7 +4059,7 @@ r = 0, i = t.peek(); if (isHexDigit(i)) - do (n += t.read()), (i = t.peek()); + do ((n += t.read()), (i = t.peek())); while (i && isHexDigit(i) && ++r < 6); return ( (n.length == 3 && /\s/.test(i)) || n.length == 7 || n.length == 1 @@ -4158,21 +4170,21 @@ (function () { var e = [], t = {}; - (Tokens.UNKNOWN = -1), Tokens.unshift({ name: "EOF" }); + ((Tokens.UNKNOWN = -1), Tokens.unshift({ name: "EOF" })); for (var n = 0, r = Tokens.length; n < r; n++) { - e.push(Tokens[n].name), (Tokens[Tokens[n].name] = n); + (e.push(Tokens[n].name), (Tokens[Tokens[n].name] = n)); if (Tokens[n].text) if (Tokens[n].text instanceof Array) for (var i = 0; i < Tokens[n].text.length; i++) t[Tokens[n].text[i]] = n; else t[Tokens[n].text] = n; } - (Tokens.name = function (t) { + ((Tokens.name = function (t) { return e[t]; }), (Tokens.type = function (e) { return t[e] || -1; - }); + })); })(); var Validation = { validate: function (e, t) { @@ -4233,12 +4245,12 @@ ); if (t.hasNext()) throw ( - ((u = t.next()), + (u = t.next()), new ValidationError( "Expected end of value but found '" + u + "'.", u.line, u.col, - )) + ) ); }, multiProperty: function (e, t, n, r) { @@ -4278,12 +4290,12 @@ )); if (t.hasNext()) throw ( - ((a = t.next()), + (a = t.next()), new ValidationError( "Expected end of value but found '" + a + "'.", a.line, a.col, - )) + ) ); }, groupProperty: function (e, t, n) { @@ -4298,7 +4310,7 @@ a = ValidationTypes.isAnyOfGroup(t, e); if (!a) break; if (o[a]) break; - (o[a] = 1), o.count++, (u = !0); + ((o[a] = 1), o.count++, (u = !0)); if (o.count == s || !t.hasNext()) r = !0; } if (!r) @@ -4316,12 +4328,12 @@ ); if (t.hasNext()) throw ( - ((f = t.next()), + (f = t.next()), new ValidationError( "Expected end of value but found '" + f + "'.", f.line, f.col, - )) + ) ); }, }; @@ -4580,13 +4592,13 @@ i = !1, s; if (e.hasNext()) { - ValidationTypes.isAny(e, "inset") && (r = !0), - ValidationTypes.isAny(e, "") && (i = !0); + (ValidationTypes.isAny(e, "inset") && (r = !0), + ValidationTypes.isAny(e, "") && (i = !0)); while (ValidationTypes.isAny(e, "") && n < 4) n++; - e.hasNext() && + (e.hasNext() && (i || ValidationTypes.isAny(e, ""), r || ValidationTypes.isAny(e, "inset")), - (t = n >= 2 && n <= 4); + (t = n >= 2 && n <= 4)); } return t; }, @@ -4616,14 +4628,14 @@ : ValidationTypes.isType(e, "") && (n = !0); if (!n) throw ( - ((t = e.peek()), + (t = e.peek()), new ValidationError( "Expected (none | [ ? || ]) but found '" + e.value.text + "'.", t.line, t.col, - )) + ) ); return n; }, @@ -4649,7 +4661,7 @@ })(), (function () { for (var e in parserlib) exports[e] = parserlib[e]; - })(); + })()); var util = { isArray: function (e) { return ( @@ -4666,16 +4678,19 @@ getRegExpFlags: function (e) { var t = ""; return ( - e.global && (t += "g"), e.ignoreCase && (t += "i"), e.multiline && (t += "m"), t + e.global && (t += "g"), + e.ignoreCase && (t += "i"), + e.multiline && (t += "m"), + t ); }, }; - typeof module == "object" && (module.exports = clone), + (typeof module == "object" && (module.exports = clone), (clone.clonePrototype = function (e) { if (e === null) return null; var t = function () {}; - return (t.prototype = e), new t(); - }); + return ((t.prototype = e), new t()); + })); var CSSLint = (function () { function i(e, t) { var r, @@ -4703,7 +4718,7 @@ return ( (r.version = "@VERSION@"), (r.addRule = function (t) { - e.push(t), (e[t.id] = t); + (e.push(t), (e[t.id] = t)); }), (r.clearRules = function () { e = []; @@ -4751,11 +4766,11 @@ underscoreHack: !0, strict: !1, }); - (u = t.replace(/\n\r?/g, "$split$").split("$split$")), + ((u = t.replace(/\n\r?/g, "$split$").split("$split$")), r || (r = this.getRuleset()), n.test(t) && ((r = clone(r)), (r = i(t, r))), (o = new Reporter(u, r)), - (r.errors = 2); + (r.errors = 2)); for (s in r) r.hasOwnProperty(s) && r[s] && e[s] && e[s].init(f, o); try { f.parse(t); @@ -4777,7 +4792,7 @@ r ); })(); - (Reporter.prototype = { + ((Reporter.prototype = { constructor: Reporter, error: function (e, t, n, r) { this.messages.push({ @@ -4862,7 +4877,7 @@ if (o.type === e.SELECTOR_PART_TYPE) { a = 0; for (c = 0; c < o.modifiers.length; c++) - (u = o.modifiers[c]), + ((u = o.modifiers[c]), u.type === "class" && a++, a > 1 && t.report( @@ -4870,7 +4885,7 @@ o.line, o.col, n, - ); + )); } } } @@ -4884,7 +4899,7 @@ browsers: "All", init: function (e, t) { function u() { - (s = {}), (o = !1); + ((s = {}), (o = !1)); } function a() { var e, u; @@ -4942,7 +4957,7 @@ }, s, o = !1; - e.addListener("startrule", u), + (e.addListener("startrule", u), e.addListener("startfontface", u), e.addListener("startpage", u), e.addListener("startpagemargin", u), @@ -4966,7 +4981,7 @@ e.addListener("endfontface", a), e.addListener("endpage", a), e.addListener("endpagemargin", a), - e.addListener("endkeyframerule", a); + e.addListener("endkeyframerule", a)); }, }), CSSLint.addRule({ @@ -5001,14 +5016,14 @@ s = !1, o, u; - e.addListener("startfontface", function () { + (e.addListener("startfontface", function () { r = !0; }), e.addListener("property", function (e) { if (!r) return; var t = e.property.toString().toLowerCase(), n = e.value.toString(); - (o = e.line), (u = e.col); + ((o = e.line), (u = e.col)); if (t === "src") { var a = /^\s?url\(['"].+\.eot\?.*['"]\)\s*format\(['"]embedded-opentype['"]\).*$/i; @@ -5018,15 +5033,15 @@ } }), e.addListener("endfontface", function () { - (r = !1), + ((r = !1), s && t.report( "@font-face declaration doesn't follow the fontspring bulletproof syntax.", o, u, n, - ); - }); + )); + })); }, }), CSSLint.addRule({ @@ -5107,11 +5122,11 @@ }; for (s in r) if (r.hasOwnProperty(s)) { - (o = []), (u = r[s].split(" ")); + ((o = []), (u = r[s].split(" "))); for (a = 0, f = u.length; a < f; a++) o.push("-" + u[a] + "-" + s); - (r[s] = o), c.apply(h, o); + ((r[s] = o), c.apply(h, o)); } - e.addListener("startrule", function () { + (e.addListener("startrule", function () { i = []; }), e.addListener("startkeyframes", function (e) { @@ -5159,10 +5174,10 @@ } for (a in e) if (e.hasOwnProperty(a)) { - (l = e[a]), (c = l.full), (h = l.actual); + ((l = e[a]), (c = l.full), (h = l.actual)); if (c.length > h.length) for (s = 0, o = c.length; s < o; s++) - (p = c[s]), + ((p = c[s]), CSSLint.Util.indexOf(h, p) === -1 && ((d = h.length === 1 @@ -5179,9 +5194,9 @@ l.actualNodes[0].line, l.actualNodes[0].col, n, - )); + ))); } - }); + })); }, }), CSSLint.addRule({ @@ -5208,7 +5223,7 @@ if (e) switch (e) { case "inline": - s("height", e), + (s("height", e), s("width", e), s("margin", e), s("margin-top", e), @@ -5217,7 +5232,7 @@ "float", e, "display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug).", - ); + )); break; case "block": s("vertical-align", e); @@ -5254,7 +5269,7 @@ "vertical-align": 1, }, i; - e.addListener("startrule", o), + (e.addListener("startrule", o), e.addListener("startfontface", o), e.addListener("startkeyframerule", o), e.addListener("startpagemargin", o), @@ -5272,7 +5287,7 @@ e.addListener("endfontface", u), e.addListener("endkeyframerule", u), e.addListener("endpagemargin", u), - e.addListener("endpage", u); + e.addListener("endpage", u)); }, }), CSSLint.addRule({ @@ -5320,7 +5335,7 @@ var n = this, r, i; - e.addListener("startrule", s), + (e.addListener("startrule", s), e.addListener("startfontface", s), e.addListener("startpage", s), e.addListener("startpagemargin", s), @@ -5328,7 +5343,7 @@ e.addListener("property", function (e) { var s = e.property, o = s.text.toLowerCase(); - r[o] && + (r[o] && (i !== o || r[o] === e.value.text) && t.report( "Duplicate property '" + e.property + "' found.", @@ -5337,8 +5352,8 @@ n, ), (r[o] = e.value.text), - (i = o); - }); + (i = o)); + })); }, }), CSSLint.addRule({ @@ -5349,7 +5364,7 @@ init: function (e, t) { var n = this, r = 0; - e.addListener("startrule", function () { + (e.addListener("startrule", function () { r = 0; }), e.addListener("property", function () { @@ -5358,7 +5373,7 @@ e.addListener("endrule", function (e) { var i = e.selectors; r === 0 && t.report("Rule is empty.", i[0].line, i[0].col, n); - }); + })); }, }), CSSLint.addRule({ @@ -5380,7 +5395,7 @@ browsers: "IE6,IE7,IE8", init: function (e, t) { function o() { - (s = {}), (r = null); + ((s = {}), (r = null)); } var n = this, r, @@ -5400,7 +5415,7 @@ "background-color": 1, }, s; - e.addListener("startrule", o), + (e.addListener("startrule", o), e.addListener("startfontface", o), e.addListener("startpage", o), e.addListener("startpagemargin", o), @@ -5414,7 +5429,7 @@ l = u.length; if (i[o]) while (a < l) - u[a].type === "color" && + (u[a].type === "color" && ("alpha" in u[a] || "hue" in u[a] ? (/([^\)]+)\(/.test(u[a]) && (f = RegExp.$1.toUpperCase()), @@ -5434,9 +5449,9 @@ n, )) : (e.colorType = "compat")), - a++; + a++); r = e; - }); + })); }, }), CSSLint.addRule({ @@ -5447,21 +5462,21 @@ init: function (e, t) { var n = this, r = 0; - e.addListener("property", function (e) { + (e.addListener("property", function (e) { e.property.text.toLowerCase() === "float" && e.value.text.toLowerCase() !== "none" && r++; }), e.addListener("endstylesheet", function () { - t.stat("floats", r), + (t.stat("floats", r), r >= 10 && t.rollupWarn( "Too many floats (" + r + "), you're probably using them for layout. Consider using a grid system instead.", n, - ); - }); + )); + })); }, }), CSSLint.addRule({ @@ -5472,13 +5487,13 @@ init: function (e, t) { var n = this, r = 0; - e.addListener("startfontface", function () { + (e.addListener("startfontface", function () { r++; }), e.addListener("endstylesheet", function () { r > 5 && t.rollupWarn("Too many @font-face declarations (" + r + ").", n); - }); + })); }, }), CSSLint.addRule({ @@ -5489,19 +5504,19 @@ init: function (e, t) { var n = this, r = 0; - e.addListener("property", function (e) { + (e.addListener("property", function (e) { e.property.toString() === "font-size" && r++; }), e.addListener("endstylesheet", function () { - t.stat("font-sizes", r), + (t.stat("font-sizes", r), r >= 10 && t.rollupWarn( "Too many font-size declarations (" + r + "), abstraction needed.", n, - ); - }); + )); + })); }, }), CSSLint.addRule({ @@ -5512,7 +5527,7 @@ init: function (e, t) { var n = this, r; - e.addListener("startrule", function () { + (e.addListener("startrule", function () { r = { moz: 0, webkit: 0, oldWebkit: 0, o: 0 }; }), e.addListener("property", function (e) { @@ -5522,7 +5537,7 @@ }), e.addListener("endrule", function (e) { var i = []; - r.moz || i.push("Firefox 3.6+"), + (r.moz || i.push("Firefox 3.6+"), r.webkit || i.push("Webkit (Safari 5+, Chrome)"), r.oldWebkit || i.push("Old Webkit (Safari 4+, Chrome)"), r.o || i.push("Opera 11.1+"), @@ -5535,8 +5550,8 @@ e.selectors[0].line, e.selectors[0].col, n, - ); - }); + )); + })); }, }), CSSLint.addRule({ @@ -5556,12 +5571,12 @@ l, c; for (f = 0; f < i.length; f++) { - (s = i[f]), (a = 0); + ((s = i[f]), (a = 0)); for (l = 0; l < s.parts.length; l++) { o = s.parts[l]; if (o.type === e.SELECTOR_PART_TYPE) for (c = 0; c < o.modifiers.length; c++) - (u = o.modifiers[c]), u.type === "id" && a++; + ((u = o.modifiers[c]), u.type === "id" && a++); } a === 1 ? t.report("Don't use IDs in selectors.", s.line, s.col, n) @@ -5596,20 +5611,20 @@ init: function (e, t) { var n = this, r = 0; - e.addListener("property", function (e) { + (e.addListener("property", function (e) { e.important === !0 && (r++, t.report("Use of !important", e.line, e.col, n)); }), e.addListener("endstylesheet", function () { - t.stat("important", r), + (t.stat("important", r), r >= 10 && t.rollupWarn( "Too many !important declarations (" + r + "), try to use less than 10 to avoid specificity issues.", n, - ); - }); + )); + })); }, }), CSSLint.addRule({ @@ -5635,7 +5650,7 @@ i = function () { r = []; }; - e.addListener("startrule", i), + (e.addListener("startrule", i), e.addListener("startfontface", i), e.addListener("startpage", i), e.addListener("startpagemargin", i), @@ -5655,7 +5670,7 @@ e.col, n, ); - }); + })); }, }), CSSLint.addRule({ @@ -5696,7 +5711,7 @@ } var n = this, r; - e.addListener("startrule", i), + (e.addListener("startrule", i), e.addListener("startfontface", i), e.addListener("startpage", i), e.addListener("startpagemargin", i), @@ -5714,7 +5729,7 @@ e.addListener("endfontface", s), e.addListener("endpage", s), e.addListener("endpagemargin", s), - e.addListener("endkeyframerule", s); + e.addListener("endkeyframerule", s)); }, }), CSSLint.addRule({ @@ -5725,7 +5740,7 @@ init: function (e, t) { var n = this, r = {}; - e.addListener("startrule", function (i) { + (e.addListener("startrule", function (i) { var s = i.selectors, o, u, @@ -5739,7 +5754,7 @@ u = o.parts[l]; if (u.type === e.SELECTOR_PART_TYPE) for (c = 0; c < u.modifiers.length; c++) - (a = u.modifiers[c]), + ((a = u.modifiers[c]), u.elementName && a.type === "id" ? t.report( "Element (" + @@ -5753,7 +5768,7 @@ ) : a.type === "class" && (r[a] || (r[a] = []), - r[a].push({ modifier: a, part: u })); + r[a].push({ modifier: a, part: u }))); } } }), @@ -5773,7 +5788,7 @@ r[e][0].part.col, n, ); - }); + })); }, }), CSSLint.addRule({ @@ -5792,7 +5807,7 @@ for (u = 0; u < i.length; u++) { s = i[u]; for (a = 0; a < s.parts.length; a++) - (o = s.parts[a]), + ((o = s.parts[a]), o.type === e.SELECTOR_PART_TYPE && o.elementName && /h[1-6]/.test(o.elementName.toString()) && @@ -5804,7 +5819,7 @@ o.line, o.col, n, - ); + )); } }); }, @@ -5830,7 +5845,7 @@ o = s.parts[f]; if (o.type === e.SELECTOR_PART_TYPE) for (l = 0; l < o.modifiers.length; l++) - (u = o.modifiers[l]), + ((u = o.modifiers[l]), u.type === "attribute" && /([\~\|\^\$\*]=)/.test(u) && t.report( @@ -5840,7 +5855,7 @@ u.line, u.col, n, - ); + )); } } }); @@ -5853,12 +5868,12 @@ browsers: "All", init: function (e, t) { var n = 0; - e.addListener("startrule", function () { + (e.addListener("startrule", function () { n++; }), e.addListener("endstylesheet", function () { t.stat("rule-count", n); - }); + })); }, }), CSSLint.addRule({ @@ -5869,7 +5884,7 @@ init: function (e, t) { var n = this, r = 0; - e.addListener("startrule", function (e) { + (e.addListener("startrule", function (e) { r += e.selectors.length; }), e.addListener("endstylesheet", function () { @@ -5882,7 +5897,7 @@ 0, n, ); - }); + })); }, }), CSSLint.addRule({ @@ -5893,7 +5908,7 @@ init: function (e, t) { var n = this, r = 0; - e.addListener("startrule", function (e) { + (e.addListener("startrule", function (e) { r += e.selectors.length; }), e.addListener("endstylesheet", function () { @@ -5906,7 +5921,7 @@ 0, n, ); - }); + })); }, }), CSSLint.addRule({ @@ -5932,7 +5947,7 @@ s = d[r]; for (o = 0, a = s.parts.length; o < a; o++) for (u = o + 1; u < a; u++) - (f = s.parts[o]), + ((f = s.parts[o]), (l = s.parts[u]), (c = f.type), (h = f.line), @@ -5944,7 +5959,7 @@ h, d[r].parts[0].col, n, - ); + )); } } var n = this; @@ -5997,14 +6012,14 @@ for (r in a) if (a.hasOwnProperty(r)) for (i = 0, s = a[r].length; i < s; i++) o[a[r][i]] = r; - e.addListener("startrule", f), + (e.addListener("startrule", f), e.addListener("startfontface", f), e.addListener("property", function (e) { var t = e.property.toString().toLowerCase(); o[t] && (u[t] = 1); }), e.addListener("endrule", l), - e.addListener("endfontface", l); + e.addListener("endfontface", l)); }, }), CSSLint.addRule({ @@ -6033,7 +6048,7 @@ browsers: "All", init: function (e, t) { function s() { - (r = !1), (i = "inherit"); + ((r = !1), (i = "inherit")); } function o() { r && @@ -6048,7 +6063,7 @@ var n = this, r, i; - e.addListener("startrule", s), + (e.addListener("startrule", s), e.addListener("startfontface", s), e.addListener("property", function (e) { var t = e.property.toString().toLowerCase(), @@ -6058,7 +6073,7 @@ : t === "direction" && n.toString() === "ltr" && (i = "ltr"); }), e.addListener("endrule", o), - e.addListener("endfontface", o); + e.addListener("endfontface", o)); }, }), CSSLint.addRule({ @@ -6088,7 +6103,7 @@ init: function (e, t) { var n = this, r = { h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0 }; - e.addListener("startrule", function (e) { + (e.addListener("startrule", function (e) { var i = e.selectors, s, o, @@ -6096,7 +6111,7 @@ a, f; for (a = 0; a < i.length; a++) { - (s = i[a]), (o = s.parts[s.parts.length - 1]); + ((s = i[a]), (o = s.parts[s.parts.length - 1])); if (o.elementName && /(h[1-6])/i.test(o.elementName.toString())) { for (f = 0; f < o.modifiers.length; f++) if (o.modifiers[f].type === "pseudo") { @@ -6127,7 +6142,7 @@ "You have " + i.join(", ") + " defined in this stylesheet.", n, ); - }); + })); }, }), CSSLint.addRule({ @@ -6143,9 +6158,9 @@ s, o; for (o = 0; o < r.length; o++) - (i = r[o]), + ((i = r[o]), (s = i.parts[i.parts.length - 1]), - s.elementName === "*" && t.report(n.desc, s.line, s.col, n); + s.elementName === "*" && t.report(n.desc, s.line, s.col, n)); }); }, }), @@ -6164,13 +6179,13 @@ a, f; for (a = 0; a < i.length; a++) { - (s = i[a]), (o = s.parts[s.parts.length - 1]); + ((s = i[a]), (o = s.parts[s.parts.length - 1])); if (o.type === e.SELECTOR_PART_TYPE) for (f = 0; f < o.modifiers.length; f++) - (u = o.modifiers[f]), + ((u = o.modifiers[f]), u.type === "attribute" && (!o.elementName || o.elementName === "*") && - t.report(n.desc, o.line, o.col, n); + t.report(n.desc, o.line, o.col, n)); } }); }, @@ -6182,7 +6197,7 @@ browsers: "All", init: function (e, t) { function o() { - (r = {}), (i = 1); + ((r = {}), (i = 1)); } function u() { var e, @@ -6193,7 +6208,7 @@ f = []; for (e in r) s[e] && f.push({ actual: e, needed: s[e] }); for (i = 0, o = f.length; i < o; i++) - (u = f[i].needed), + ((u = f[i].needed), (a = f[i].actual), r[u] ? r[u][0].pos < r[a][0].pos && @@ -6216,7 +6231,7 @@ r[a][0].name.line, r[a][0].name.col, n, - ); + )); } var n = this, r, @@ -6266,21 +6281,21 @@ "-moz-box-sizing": "box-sizing", "-webkit-box-sizing": "box-sizing", }; - e.addListener("startrule", o), + (e.addListener("startrule", o), e.addListener("startfontface", o), e.addListener("startpage", o), e.addListener("startpagemargin", o), e.addListener("startkeyframerule", o), e.addListener("property", function (e) { var t = e.property.text.toLowerCase(); - r[t] || (r[t] = []), - r[t].push({ name: e.property, value: e.value, pos: i++ }); + (r[t] || (r[t] = []), + r[t].push({ name: e.property, value: e.value, pos: i++ })); }), e.addListener("endrule", u), e.addListener("endfontface", u), e.addListener("endpage", u), e.addListener("endpagemargin", u), - e.addListener("endkeyframerule", u); + e.addListener("endkeyframerule", u)); }, }), CSSLint.addRule({ @@ -6295,7 +6310,7 @@ i = 0, s = r.length; while (i < s) - (r[i].units || r[i].type === "percentage") && + ((r[i].units || r[i].type === "percentage") && r[i].value === 0 && r[i].type !== "time" && t.report( @@ -6304,7 +6319,7 @@ r[i].col, n, ), - i++; + i++); }); }, }), @@ -6606,18 +6621,18 @@ n = n || {}; if (r.length === 0) return n.quiet ? "" : "\n\ncsslint: No errors in " + t + "."; - (i = "\n\ncsslint: There "), + ((i = "\n\ncsslint: There "), r.length === 1 ? (i += "is 1 problem") : (i += "are " + r.length + " problems"), - (i += " in " + t + "."); + (i += " in " + t + ".")); var s = t.lastIndexOf("/"), o = t; return ( s === -1 && (s = t.lastIndexOf("\\")), s > -1 && (o = t.substring(s + 1)), CSSLint.Util.forEach(r, function (e, t) { - (i = i + "\n\n" + o), + ((i = i + "\n\n" + o), e.rollup ? ((i += "\n" + (t + 1) + ": " + e.type), (i += "\n" + e.message)) @@ -6631,13 +6646,13 @@ ", col " + e.col), (i += "\n" + e.message), - (i += "\n" + e.evidence)); + (i += "\n" + e.evidence))); }), i ); }, }), - (module.exports.CSSLint = CSSLint); + (module.exports.CSSLint = CSSLint)); }), define("ace/mode/css_worker", [], function (e, t, n) { "use strict"; @@ -6646,33 +6661,33 @@ s = e("../worker/mirror").Mirror, o = e("./css/csslint").CSSLint, u = (t.Worker = function (e) { - s.call(this, e), + (s.call(this, e), this.setTimeout(400), (this.ruleset = null), this.setDisabledRules("ids|order-alphabetical"), this.setInfoRules( "adjoining-classes|qualified-headings|zero-units|gradients|import|outline-none|vendor-prefix", - ); + )); }); - r.inherits(u, s), + (r.inherits(u, s), function () { - (this.setInfoRules = function (e) { - typeof e == "string" && (e = e.split("|")), + ((this.setInfoRules = function (e) { + (typeof e == "string" && (e = e.split("|")), (this.infoRules = i.arrayToMap(e)), - this.doc.getValue() && this.deferredUpdate.schedule(100); + this.doc.getValue() && this.deferredUpdate.schedule(100)); }), (this.setDisabledRules = function (e) { if (!e) this.ruleset = null; else { typeof e == "string" && (e = e.split("|")); var t = {}; - o.getRules().forEach(function (e) { + (o.getRules().forEach(function (e) { t[e.id] = !0; }), e.forEach(function (e) { delete t[e]; }), - (this.ruleset = t); + (this.ruleset = t)); } this.doc.getValue() && this.deferredUpdate.schedule(100); }), @@ -6693,14 +6708,14 @@ }; }), ); - }); - }.call(u.prototype); + })); + }.call(u.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -6773,35 +6788,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -6814,7 +6829,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -6841,7 +6856,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -6943,15 +6958,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -6961,8 +6976,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -6984,9 +6999,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -6995,7 +7010,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -7022,10 +7037,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -7048,16 +7063,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -7069,7 +7084,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -7079,7 +7094,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -7098,8 +7113,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -7144,4 +7159,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/ace/worker-html.js b/web/static/ace/worker-html.js index a20acd65d..ecb79caa6 100644 --- a/web/static/ace/worker-html.js +++ b/web/static/ace/worker-html.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,11 +160,11 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -177,10 +177,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -247,18 +247,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -269,28 +269,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -298,10 +298,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -446,11 +446,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -459,7 +459,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -470,11 +470,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -496,9 +496,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -519,18 +519,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -547,7 +547,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -556,7 +556,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -595,18 +595,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -625,7 +625,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -644,16 +644,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -671,7 +671,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -682,19 +682,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -711,7 +711,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -727,7 +727,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -755,8 +755,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -837,10 +837,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -883,8 +883,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -919,7 +919,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -943,7 +943,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -952,12 +952,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -983,9 +983,9 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,7 +1025,7 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/html/saxparser", [], function (e, t, n) { @@ -1142,12 +1142,12 @@ ); } function l() { - (this.elements = []), + ((this.elements = []), (this.rootNode = null), (this.headElement = null), - (this.bodyElement = null); + (this.bodyElement = null)); } - (l.prototype._inScope = function (e, t) { + ((l.prototype._inScope = function (e, t) { for (var n = this.elements.length - 1; n >= 0; n--) { var r = this.elements[n]; if (r.localName === e) return !0; @@ -1158,13 +1158,13 @@ this.elements.push(e); }), (l.prototype.pushHtmlElement = function (e) { - (this.rootNode = e.node), this.push(e); + ((this.rootNode = e.node), this.push(e)); }), (l.prototype.pushHeadElement = function (e) { - (this.headElement = e.node), this.push(e); + ((this.headElement = e.node), this.push(e)); }), (l.prototype.pushBodyElement = function (e) { - (this.bodyElement = e.node), this.push(e); + ((this.bodyElement = e.node), this.push(e)); }), (l.prototype.pop = function () { return this.elements.pop(); @@ -1231,7 +1231,7 @@ (l.prototype.remove_openElements_until = function (e) { var t = !1, n; - while (!t) (n = this.elements.pop()), (t = e(n)); + while (!t) ((n = this.elements.pop()), (t = e(n))); return n; }), Object.defineProperty(l.prototype, "top", { @@ -1244,7 +1244,7 @@ return this.elements.length; }, }), - (n.ElementStack = l); + (n.ElementStack = l)); }, {}, ], @@ -1274,7 +1274,7 @@ for (var t = 0; t < e.length; t++) s[e.substring(0, t + 1)] = !0; }); var f = {}; - (f.consumeEntity = function (e, t, n) { + ((f.consumeEntity = function (e, t, n) { var f = "", l = "", c = e.char(); @@ -1288,8 +1288,8 @@ c == "<" || c == "&" ) - return e.unget(l), !1; - if (n === c) return e.unget(l), !1; + return (e.unget(l), !1); + if (n === c) return (e.unget(l), !1); if (c == "#") { c = e.shift(1); if (c === i.EOF) @@ -1302,7 +1302,7 @@ var h = 10, p = a; if (c == "x" || c == "X") { - (h = 16), (p = u), (c = e.shift(1)); + ((h = 16), (p = u), (c = e.shift(1))); if (c === i.EOF) return ( t._parseError("expected-numeric-entity-but-got-eof"), @@ -1313,7 +1313,7 @@ } if (p(c)) { var d = ""; - while (c !== i.EOF && p(c)) (d += c), (c = e.char()); + while (c !== i.EOF && p(c)) ((d += c), (c = e.char())); d = parseInt(d, h); var v = this.replaceEntityNumbers(d); v && @@ -1331,7 +1331,7 @@ f ); } - return e.unget(l), t._parseError("expected-numeric-entity"), !1; + return (e.unget(l), t._parseError("expected-numeric-entity"), !1); } if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) { var y = ""; @@ -1467,20 +1467,20 @@ return e; } }), - (n.EntityParser = f); + (n.EntityParser = f)); }, { "./InputStream": 3, "html5-entities": 12 }, ], 3: [ function (e, t, n) { function r() { - (this.data = ""), + ((this.data = ""), (this.start = 0), (this.committed = 0), (this.eof = !1), - (this.lastLocation = { line: 0, column: 0 }); + (this.lastLocation = { line: 0, column: 0 })); } - (r.EOF = -1), + ((r.EOF = -1), (r.DRAIN = -2), (r.prototype = { slice: function () { @@ -1495,7 +1495,7 @@ throw r.DRAIN; if (this.start >= this.data.length) return r.EOF; var e = this.data[this.start++]; - return e === "\r" && (e = "\n"), e; + return (e === "\r" && (e = "\n"), e); }, advance: function (e) { this.start += e; @@ -1519,7 +1519,7 @@ n[0].length == this.data.length - this.start ) throw r.DRAIN; - return this.advance(n[0].length), n[0]; + return (this.advance(n[0].length), n[0]); } return ""; }, @@ -1545,7 +1545,8 @@ if (this.eof && this.start >= this.data.length) return r.EOF; var t = this.data.slice(this.start, this.start + e).toString(); return ( - this.advance(Math.min(e, this.data.length - this.start)), t + this.advance(Math.min(e, this.data.length - this.start)), + t ); }, peek: function (e) { @@ -1583,17 +1584,17 @@ return { line: i, column: s }; }, }), - (n.InputStream = r); + (n.InputStream = r)); }, {}, ], 4: [ function (e, t, n) { function i(e, t, n, r) { - (this.localName = t), + ((this.localName = t), (this.namespaceURI = e), (this.attributes = n), - (this.node = r); + (this.node = r)); } function s(e, t) { for (var n = 0; n < e.attributes.length; n++) @@ -1695,7 +1696,7 @@ ], "http://www.w3.org/2000/svg": ["foreignObject", "desc", "title"], }; - (i.prototype.isSpecial = function () { + ((i.prototype.isSpecial = function () { return ( this.namespaceURI in r && r[this.namespaceURI].indexOf(this.localName) > -1 @@ -1747,7 +1748,7 @@ this.localName === "mtext" : !1; }), - (n.StackItem = i); + (n.StackItem = i)); }, {}, ], @@ -1760,16 +1761,16 @@ return (e >= "A" && e <= "Z") || (e >= "a" && e <= "z"); } function u(e) { - (this._tokenHandler = e), + ((this._tokenHandler = e), (this._state = u.DATA), (this._inputStream = new r()), (this._currentToken = null), (this._temporaryBuffer = ""), - (this._additionalAllowedCharacter = ""); + (this._additionalAllowedCharacter = "")); } var r = e("./InputStream").InputStream, i = e("./EntityParser").EntityParser; - (u.prototype._parseError = function (e, t) { + ((u.prototype._parseError = function (e, t) { this._tokenHandler.parseError(e, t); }), (u.prototype._emitToken = function (e) { @@ -1782,16 +1783,16 @@ this._parseError("self-closing-flag-on-end-tag"), e.data.length !== 0 && this._parseError("attributes-in-end-tag")); - this._tokenHandler.processToken(e), + (this._tokenHandler.processToken(e), e.type === "StartTag" && e.selfClosing && !this._tokenHandler.isSelfClosingFlagAcknowledged() && this._parseError("non-void-element-with-trailing-solidus", { name: e.name, - }); + })); }), (u.prototype._emitCurrentToken = function () { - (this._state = u.DATA), this._emitToken(this._currentToken); + ((this._state = u.DATA), this._emitToken(this._currentToken)); }), (u.prototype._currentAttribute = function () { return this._currentToken.data[this._currentToken.data.length - 1]; @@ -1803,15 +1804,15 @@ function n(e) { var n = e.char(); if (n === r.EOF) - return t._emitToken({ type: "EOF", data: null }), !1; + return (t._emitToken({ type: "EOF", data: null }), !1); if (n === "&") t.setState(a); else if (n === "<") t.setState(j); else if (n === "\0") - t._emitToken({ type: "Characters", data: n }), e.commit(); + (t._emitToken({ type: "Characters", data: n }), e.commit()); else { var i = e.matchUntil("&|<|\0"); - t._emitToken({ type: "Characters", data: n + i }), - e.commit(); + (t._emitToken({ type: "Characters", data: n + i }), + e.commit()); } return !0; } @@ -1826,17 +1827,17 @@ function f(e) { var n = e.char(); if (n === r.EOF) - return t._emitToken({ type: "EOF", data: null }), !1; + return (t._emitToken({ type: "EOF", data: null }), !1); if (n === "&") t.setState(l); else if (n === "<") t.setState(d); else if (n === "\0") - t._parseError("invalid-codepoint"), + (t._parseError("invalid-codepoint"), t._emitToken({ type: "Characters", data: "\ufffd" }), - e.commit(); + e.commit()); else { var i = e.matchUntil("&|<|\0"); - t._emitToken({ type: "Characters", data: n + i }), - e.commit(); + (t._emitToken({ type: "Characters", data: n + i }), + e.commit()); } return !0; } @@ -1851,12 +1852,12 @@ function c(e) { var n = e.char(); if (n === r.EOF) - return t._emitToken({ type: "EOF", data: null }), !1; + return (t._emitToken({ type: "EOF", data: null }), !1); if (n === "<") t.setState(g); else if (n === "\0") - t._parseError("invalid-codepoint"), + (t._parseError("invalid-codepoint"), t._emitToken({ type: "Characters", data: "\ufffd" }), - e.commit(); + e.commit()); else { var i = e.matchUntil("<|\0"); t._emitToken({ type: "Characters", data: n + i }); @@ -1866,11 +1867,11 @@ function h(e) { var n = e.char(); if (n === r.EOF) - return t._emitToken({ type: "EOF", data: null }), !1; + return (t._emitToken({ type: "EOF", data: null }), !1); if (n === "\0") - t._parseError("invalid-codepoint"), + (t._parseError("invalid-codepoint"), t._emitToken({ type: "Characters", data: "\ufffd" }), - e.commit(); + e.commit()); else { var i = e.matchUntil("\0"); t._emitToken({ type: "Characters", data: n + i }); @@ -1880,12 +1881,12 @@ function p(e) { var n = e.char(); if (n === r.EOF) - return t._emitToken({ type: "EOF", data: null }), !1; + return (t._emitToken({ type: "EOF", data: null }), !1); if (n === "<") t.setState(w); else if (n === "\0") - t._parseError("invalid-codepoint"), + (t._parseError("invalid-codepoint"), t._emitToken({ type: "Characters", data: "\ufffd" }), - e.commit(); + e.commit()); else { var i = e.matchUntil("<|\0"); t._emitToken({ type: "Characters", data: n + i }); @@ -2111,15 +2112,15 @@ } function N(e) { var i = e.char(); - if (i === r.EOF) e.unget(i), t.setState(n); + if (i === r.EOF) (e.unget(i), t.setState(n)); else if (i === "-") - t._emitToken({ type: "Characters", data: "-" }), - t.setState(C); + (t._emitToken({ type: "Characters", data: "-" }), + t.setState(C)); else if (i === "<") t.setState(L); else if (i === "\0") - t._parseError("invalid-codepoint"), + (t._parseError("invalid-codepoint"), t._emitToken({ type: "Characters", data: "\ufffd" }), - e.commit(); + e.commit()); else { var s = e.matchUntil("<|-|\0"); t._emitToken({ type: "Characters", data: i + s }); @@ -2470,9 +2471,9 @@ function q(e) { var i = e.char(); if (i === r.EOF) - t._parseError("expected-attribute-name-but-got-eof"), + (t._parseError("expected-attribute-name-but-got-eof"), e.unget(i), - t.setState(n); + t.setState(n)); else { if (s(i)) return !0; o(i) @@ -2545,10 +2546,10 @@ l = f[f.length - 1]; for (var c = f.length - 2; c >= 0; c--) if (l.nodeName === f[c].nodeName) { - t._parseError("duplicate-attribute", { + (t._parseError("duplicate-attribute", { name: l.nodeName, }), - (l.nodeName = null); + (l.nodeName = null)); break; } a && t._emitCurrentToken(); @@ -2558,9 +2559,9 @@ function U(e) { var i = e.char(); if (i === r.EOF) - t._parseError("expected-end-of-tag-but-got-eof"), + (t._parseError("expected-end-of-tag-but-got-eof"), e.unget(i), - t.setState(n); + t.setState(n)); else { if (s(i)) return !0; i === "=" @@ -2601,9 +2602,9 @@ function z(e) { var i = e.char(); if (i === r.EOF) - t._parseError("expected-attribute-value-but-got-eof"), + (t._parseError("expected-attribute-value-but-got-eof"), e.unget(i), - t.setState(n); + t.setState(n)); else { if (s(i)) return !0; i === '"' @@ -2635,18 +2636,18 @@ function W(e) { var i = e.char(); if (i === r.EOF) - t._parseError("eof-in-attribute-value-double-quote"), + (t._parseError("eof-in-attribute-value-double-quote"), e.unget(i), - t.setState(n); + t.setState(n)); else if (i === '"') t.setState(J); else if (i === "&") - (this._additionalAllowedCharacter = '"'), t.setState($); + ((this._additionalAllowedCharacter = '"'), t.setState($)); else if (i === "\0") - t._parseError("invalid-codepoint"), - (t._currentAttribute().nodeValue += "\ufffd"); + (t._parseError("invalid-codepoint"), + (t._currentAttribute().nodeValue += "\ufffd")); else { var s = e.matchUntil('[\0"&]'); - (i += s), (t._currentAttribute().nodeValue += i); + ((i += s), (t._currentAttribute().nodeValue += i)); } return !0; } @@ -2673,12 +2674,12 @@ function V(e) { var i = e.char(); if (i === r.EOF) - t._parseError("eof-after-attribute-value"), + (t._parseError("eof-after-attribute-value"), e.unget(i), - t.setState(n); + t.setState(n)); else if (s(i)) t.setState(q); else if (i === "&") - (this._additionalAllowedCharacter = ">"), t.setState($); + ((this._additionalAllowedCharacter = ">"), t.setState($)); else if (i === ">") t._emitCurrentToken(); else if ( i === '"' || @@ -2687,21 +2688,21 @@ i === "`" || i === "<" ) - t._parseError( + (t._parseError( "unexpected-character-in-unquoted-attribute-value", ), (t._currentAttribute().nodeValue += i), - e.commit(); + e.commit()); else if (i === "\0") - t._parseError("invalid-codepoint"), - (t._currentAttribute().nodeValue += "\ufffd"); + (t._parseError("invalid-codepoint"), + (t._currentAttribute().nodeValue += "\ufffd")); else { var o = e.matchUntil("\0|[ \n\x0b\f \r&<>\"'=`]"); - o === r.EOF && + (o === r.EOF && (t._parseError("eof-in-attribute-value-no-quotes"), t._emitCurrentToken()), e.commit(), - (t._currentAttribute().nodeValue += i + o); + (t._currentAttribute().nodeValue += i + o)); } return !0; } @@ -2771,8 +2772,8 @@ function G(e) { var n = e.shift(2); if (n === "--") - (t._currentToken = { type: "Comment", data: "" }), - t.setState(Z); + ((t._currentToken = { type: "Comment", data: "" }), + t.setState(Z)); else { var i = e.shift(5); if (i === r.EOF || n === r.EOF) @@ -2782,7 +2783,7 @@ e.unget(n), !0 ); - (n += i), + ((n += i), n.toUpperCase() === "DOCTYPE" ? ((t._currentToken = { type: "Doctype", @@ -2797,7 +2798,7 @@ ? t.setState(Y) : (t._parseError("expected-dashes-or-doctype"), e.unget(n), - t.setState(Q)); + t.setState(Q))); } return !0; } @@ -2999,13 +3000,13 @@ function at(e) { var i = e.char(); if (i === r.EOF) - (t._currentToken.forceQuirks = !0), + ((t._currentToken.forceQuirks = !0), e.unget(i), t._parseError("eof-in-doctype"), t.setState(n), - t._emitCurrentToken(); + t._emitCurrentToken()); else if (!s(i)) - if (i === ">") t.setState(n), t._emitCurrentToken(); + if (i === ">") (t.setState(n), t._emitCurrentToken()); else { if (["p", "P"].indexOf(i) > -1) { var o = [ @@ -3016,9 +3017,9 @@ ["c", "C"], ], u = o.every(function (t) { - return (i = e.char()), t.indexOf(i) > -1; + return ((i = e.char()), t.indexOf(i) > -1); }); - if (u) return t.setState(ft), !0; + if (u) return (t.setState(ft), !0); } else if (["s", "S"].indexOf(i) > -1) { var o = [ ["y", "Y"], @@ -3028,11 +3029,11 @@ ["m", "M"], ], u = o.every(function (t) { - return (i = e.char()), t.indexOf(i) > -1; + return ((i = e.char()), t.indexOf(i) > -1); }); - if (u) return t.setState(vt), !0; + if (u) return (t.setState(vt), !0); } - e.unget(i), + (e.unget(i), (t._currentToken.forceQuirks = !0), i === r.EOF ? (t._parseError("eof-in-doctype"), @@ -3043,7 +3044,7 @@ "expected-space-or-right-bracket-in-doctype", { data: i }, ), - t.setState(wt)); + t.setState(wt))); } return !0; } @@ -3302,7 +3303,7 @@ !0 ); } - (u.DATA = n), + ((u.DATA = n), (u.RCDATA = f), (u.RAWTEXT = c), (u.SCRIPT_DATA = p), @@ -3310,7 +3311,7 @@ (this._state = u.DATA), this._inputStream.append(e), this._tokenHandler.startTokenization(this), - (this._inputStream.eof = !0); + (this._inputStream.eof = !0)); var t = this; while (this._state.call(this, this._inputStream)); }), @@ -3324,7 +3325,7 @@ return this._inputStream.location().column; }, }), - (n.Tokenizer = u); + (n.Tokenizer = u)); }, { "./EntityParser": 2, "./InputStream": 3 }, ], @@ -3358,12 +3359,12 @@ return null; } function m(e) { - (this.characters = e), + ((this.characters = e), (this.current = 0), - (this.end = this.characters.length); + (this.end = this.characters.length)); } function g() { - (this.tokenizer = null), + ((this.tokenizer = null), (this.errorHandler = null), (this.scriptingEnabled = !1), (this.document = null), @@ -3381,20 +3382,20 @@ (this.selfClosingFlagAcknowledged = !1), (this.context = ""), (this.pendingTableCharacters = []), - (this.shouldSkipLeadingNewline = !1); + (this.shouldSkipLeadingNewline = !1)); var e = this, t = (this.insertionModes = {}); - (t.base = { + ((t.base = { end_tag_handlers: { "-default": "endTagOther" }, start_tag_handlers: { "-default": "startTagOther" }, processEOF: function () { - e.generateImpliedEndTags(), + (e.generateImpliedEndTags(), e.openElements.length > 2 ? e.parseError("expected-closing-tag-but-got-eof") : e.openElements.length == 2 && e.openElements.item(1).localName != "body" ? e.parseError("expected-closing-tag-but-got-eof") - : e.context && e.openElements.length > 1; + : e.context && e.openElements.length > 1); }, processComment: function (t) { e.insertComment(t, e.currentStackItem().node); @@ -3426,9 +3427,9 @@ }), (t.initial = Object.create(t.base)), (t.initial.processEOF = function () { - e.parseError("expected-doctype-but-got-eof"), + (e.parseError("expected-doctype-but-got-eof"), this.anythingElse(), - e.insertionMode.processEOF(); + e.insertionMode.processEOF()); }), (t.initial.processComment = function (t) { e.insertComment(t, e.document); @@ -3437,7 +3438,7 @@ function s(e) { return n.toLowerCase().indexOf(e) === 0; } - e.insertDoctype(t || "", n || "", r || ""), + (e.insertDoctype(t || "", n || "", r || ""), i || t != "html" || (n != null && @@ -3553,27 +3554,29 @@ (((r != null && r != "about:legacy-compat") || n != null) && e.parseError("unknown-doctype")), - e.setInsertionMode("beforeHTML"); + e.setInsertionMode("beforeHTML")); }), (t.initial.processCharacters = function (t) { t.skipLeadingWhitespace(); if (!t.length) return; - e.parseError("expected-doctype-but-got-chars"), + (e.parseError("expected-doctype-but-got-chars"), this.anythingElse(), - e.insertionMode.processCharacters(t); + e.insertionMode.processCharacters(t)); }), (t.initial.processStartTag = function (t, n, r) { - e.parseError("expected-doctype-but-got-start-tag", { name: t }), + (e.parseError("expected-doctype-but-got-start-tag", { + name: t, + }), this.anythingElse(), - e.insertionMode.processStartTag(t, n, r); + e.insertionMode.processStartTag(t, n, r)); }), (t.initial.processEndTag = function (t) { - e.parseError("expected-doctype-but-got-end-tag", { name: t }), + (e.parseError("expected-doctype-but-got-end-tag", { name: t }), this.anythingElse(), - e.insertionMode.processEndTag(t); + e.insertionMode.processEndTag(t)); }), (t.initial.anythingElse = function () { - (e.compatMode = "quirks"), e.setInsertionMode("beforeHTML"); + ((e.compatMode = "quirks"), e.setInsertionMode("beforeHTML")); }), (t.beforeHTML = Object.create(t.base)), (t.beforeHTML.start_tag_handlers = { @@ -3581,7 +3584,7 @@ "-default": "startTagOther", }), (t.beforeHTML.processEOF = function () { - this.anythingElse(), e.insertionMode.processEOF(); + (this.anythingElse(), e.insertionMode.processEOF()); }), (t.beforeHTML.processComment = function (t) { e.insertComment(t, e.document); @@ -3589,19 +3592,19 @@ (t.beforeHTML.processCharacters = function (t) { t.skipLeadingWhitespace(); if (!t.length) return; - this.anythingElse(), e.insertionMode.processCharacters(t); + (this.anythingElse(), e.insertionMode.processCharacters(t)); }), (t.beforeHTML.startTagHtml = function (t, n, r) { - e.insertHtmlElement(n), e.setInsertionMode("beforeHead"); + (e.insertHtmlElement(n), e.setInsertionMode("beforeHead")); }), (t.beforeHTML.startTagOther = function (t, n, r) { - this.anythingElse(), e.insertionMode.processStartTag(t, n, r); + (this.anythingElse(), e.insertionMode.processStartTag(t, n, r)); }), (t.beforeHTML.processEndTag = function (t) { - this.anythingElse(), e.insertionMode.processEndTag(t); + (this.anythingElse(), e.insertionMode.processEndTag(t)); }), (t.beforeHTML.anythingElse = function () { - e.insertHtmlElement(), e.setInsertionMode("beforeHead"); + (e.insertHtmlElement(), e.setInsertionMode("beforeHead")); }), (t.afterAfterBody = Object.create(t.base)), (t.afterAfterBody.start_tag_handlers = { @@ -3618,14 +3621,14 @@ t.inBody.startTagHtml(e, n); }), (t.afterAfterBody.startTagOther = function (t, n, r) { - e.parseError("unexpected-start-tag", { name: t }), + (e.parseError("unexpected-start-tag", { name: t }), e.setInsertionMode("inBody"), - e.insertionMode.processStartTag(t, n, r); + e.insertionMode.processStartTag(t, n, r)); }), (t.afterAfterBody.endTagOther = function (t) { - e.parseError("unexpected-end-tag", { name: t }), + (e.parseError("unexpected-end-tag", { name: t }), e.setInsertionMode("inBody"), - e.insertionMode.processEndTag(t); + e.insertionMode.processEndTag(t)); }), (t.afterAfterBody.processCharacters = function (n) { if (!p(n.characters)) @@ -3654,9 +3657,9 @@ t.inBody.processCharacters(n); }), (t.afterBody.processStartTag = function (t, n, r) { - e.parseError("unexpected-start-tag-after-body", { name: t }), + (e.parseError("unexpected-start-tag-after-body", { name: t }), e.setInsertionMode("inBody"), - e.insertionMode.processStartTag(t, n, r); + e.insertionMode.processStartTag(t, n, r)); }), (t.afterBody.endTagHtml = function (t) { e.context @@ -3664,9 +3667,9 @@ : e.setInsertionMode("afterAfterBody"); }), (t.afterBody.endTagOther = function (t) { - e.parseError("unexpected-end-tag-after-body", { name: t }), + (e.parseError("unexpected-end-tag-after-body", { name: t }), e.setInsertionMode("inBody"), - e.insertionMode.processEndTag(t); + e.insertionMode.processEndTag(t)); }), (t.afterFrameset = Object.create(t.base)), (t.afterFrameset.start_tag_handlers = { @@ -3685,9 +3688,9 @@ var s = n[i]; c(s) && (r += s); } - r && e.insertText(r), + (r && e.insertText(r), r.length < n.length && - e.parseError("expected-eof-but-got-char"); + e.parseError("expected-eof-but-got-char")); }), (t.afterFrameset.startTagNoframes = function (e, n) { t.inHead.processStartTag(e, n); @@ -3717,23 +3720,24 @@ "-default": "endTagOther", }), (t.beforeHead.processEOF = function () { - this.startTagHead("head", []), e.insertionMode.processEOF(); + (this.startTagHead("head", []), e.insertionMode.processEOF()); }), (t.beforeHead.processCharacters = function (t) { t.skipLeadingWhitespace(); if (!t.length) return; - this.startTagHead("head", []), - e.insertionMode.processCharacters(t); + (this.startTagHead("head", []), + e.insertionMode.processCharacters(t)); }), (t.beforeHead.startTagHead = function (t, n) { - e.insertHeadElement(n), e.setInsertionMode("inHead"); + (e.insertHeadElement(n), e.setInsertionMode("inHead")); }), (t.beforeHead.startTagOther = function (t, n, r) { - this.startTagHead("head", []), - e.insertionMode.processStartTag(t, n, r); + (this.startTagHead("head", []), + e.insertionMode.processStartTag(t, n, r)); }), (t.beforeHead.endTagImplyHead = function (t) { - this.startTagHead("head", []), e.insertionMode.processEndTag(t); + (this.startTagHead("head", []), + e.insertionMode.processEndTag(t)); }), (t.beforeHead.endTagOther = function (t) { e.parseError("end-tag-after-implied-root", { name: t }); @@ -3763,19 +3767,19 @@ }), (t.inHead.processEOF = function () { var t = e.currentStackItem().localName; - ["title", "style", "script"].indexOf(t) != -1 && + (["title", "style", "script"].indexOf(t) != -1 && (e.parseError("expected-named-closing-tag-but-got-eof", { name: t, }), e.popElement()), this.anythingElse(), - e.insertionMode.processEOF(); + e.insertionMode.processEOF()); }), (t.inHead.processCharacters = function (t) { var n = t.takeLeadingWhitespace(); n && e.insertText(n); if (!t.length) return; - this.anythingElse(), e.insertionMode.processCharacters(t); + (this.anythingElse(), e.insertionMode.processCharacters(t)); }), (t.inHead.startTagHtml = function (e, n) { t.inBody.processStartTag(e, n); @@ -3789,16 +3793,16 @@ (t.inHead.startTagNoScript = function (t, n) { if (e.scriptingEnabled) return e.processGenericRawTextStartTag(t, n); - e.insertElement(t, n), e.setInsertionMode("inHeadNoscript"); + (e.insertElement(t, n), e.setInsertionMode("inHeadNoscript")); }), (t.inHead.startTagNoFramesStyle = function (t, n) { e.processGenericRawTextStartTag(t, n); }), (t.inHead.startTagScript = function (t, n) { - e.insertElement(t, n), + (e.insertElement(t, n), e.tokenizer.setState(u.SCRIPT_DATA), (e.originalInsertionMode = e.insertionModeName), - e.setInsertionMode("text"); + e.setInsertionMode("text")); }), (t.inHead.startTagBaseBasefontBgsoundLink = function (t, n) { e.insertSelfClosingElement(t, n); @@ -3807,17 +3811,17 @@ e.insertSelfClosingElement(t, n); }), (t.inHead.startTagOther = function (t, n, r) { - this.anythingElse(), e.insertionMode.processStartTag(t, n, r); + (this.anythingElse(), e.insertionMode.processStartTag(t, n, r)); }), (t.inHead.endTagHead = function (t) { - e.openElements.item(e.openElements.length - 1).localName == + (e.openElements.item(e.openElements.length - 1).localName == "head" ? e.openElements.pop() : e.parseError("unexpected-end-tag", { name: "head" }), - e.setInsertionMode("afterHead"); + e.setInsertionMode("afterHead")); }), (t.inHead.endTagHtmlBodyBr = function (t) { - this.anythingElse(), e.insertionMode.processEndTag(t); + (this.anythingElse(), e.insertionMode.processEndTag(t)); }), (t.inHead.endTagOther = function (t) { e.parseError("unexpected-end-tag", { name: t }); @@ -3846,49 +3850,49 @@ "-default": "endTagOther", }), (t.afterHead.processEOF = function () { - this.anythingElse(), e.insertionMode.processEOF(); + (this.anythingElse(), e.insertionMode.processEOF()); }), (t.afterHead.processCharacters = function (t) { var n = t.takeLeadingWhitespace(); n && e.insertText(n); if (!t.length) return; - this.anythingElse(), e.insertionMode.processCharacters(t); + (this.anythingElse(), e.insertionMode.processCharacters(t)); }), (t.afterHead.startTagHtml = function (e, n) { t.inBody.processStartTag(e, n); }), (t.afterHead.startTagBody = function (t, n) { - (e.framesetOk = !1), + ((e.framesetOk = !1), e.insertBodyElement(n), - e.setInsertionMode("inBody"); + e.setInsertionMode("inBody")); }), (t.afterHead.startTagFrameset = function (t, n) { - e.insertElement(t, n), e.setInsertionMode("inFrameset"); + (e.insertElement(t, n), e.setInsertionMode("inFrameset")); }), (t.afterHead.startTagFromHead = function (n, r, i) { - e.parseError("unexpected-start-tag-out-of-my-head", { + (e.parseError("unexpected-start-tag-out-of-my-head", { name: n, }), e.openElements.push(e.head), t.inHead.processStartTag(n, r, i), - e.openElements.remove(e.head); + e.openElements.remove(e.head)); }), (t.afterHead.startTagHead = function (t, n, r) { e.parseError("unexpected-start-tag", { name: t }); }), (t.afterHead.startTagOther = function (t, n, r) { - this.anythingElse(), e.insertionMode.processStartTag(t, n, r); + (this.anythingElse(), e.insertionMode.processStartTag(t, n, r)); }), (t.afterHead.endTagBodyHtmlBr = function (t) { - this.anythingElse(), e.insertionMode.processEndTag(t); + (this.anythingElse(), e.insertionMode.processEndTag(t)); }), (t.afterHead.endTagOther = function (t) { e.parseError("unexpected-end-tag", { name: t }); }), (t.afterHead.anythingElse = function () { - e.insertBodyElement([]), + (e.insertBodyElement([]), e.setInsertionMode("inBody"), - (e.framesetOk = !0); + (e.framesetOk = !0)); }), (t.inBody = Object.create(t.base)), (t.inBody.start_tag_handlers = { @@ -4057,26 +4061,26 @@ "-default": "endTagOther", }), (t.inBody.processCharacters = function (t) { - e.shouldSkipLeadingNewline && + (e.shouldSkipLeadingNewline && ((e.shouldSkipLeadingNewline = !1), t.skipAtMostOneLeadingNewline()), - e.reconstructActiveFormattingElements(); + e.reconstructActiveFormattingElements()); var n = t.takeRemaining(); n = n.replace(/\u0000/g, function (t, n) { - return e.parseError("invalid-codepoint"), ""; + return (e.parseError("invalid-codepoint"), ""); }); if (!n) return; - e.insertText(n), e.framesetOk && !d(n) && (e.framesetOk = !1); + (e.insertText(n), e.framesetOk && !d(n) && (e.framesetOk = !1)); }), (t.inBody.startTagHtml = function (t, n) { - e.parseError("non-html-root"), - e.addAttributesToElement(e.openElements.rootNode, n); + (e.parseError("non-html-root"), + e.addAttributesToElement(e.openElements.rootNode, n)); }), (t.inBody.startTagProcessInHead = function (e, n) { t.inHead.processStartTag(e, n); }), (t.inBody.startTagBody = function (t, n) { - e.parseError("unexpected-start-tag", { name: "body" }), + (e.parseError("unexpected-start-tag", { name: "body" }), e.openElements.length == 1 || e.openElements.item(1).localName != "body" ? r.ok(e.context) @@ -4084,7 +4088,7 @@ e.addAttributesToElement( e.openElements.bodyElement, n, - )); + ))); }), (t.inBody.startTagFrameset = function (t, n) { e.parseError("unexpected-start-tag", { name: "frameset" }); @@ -4096,18 +4100,18 @@ else if (e.framesetOk) { e.detachFromParent(e.openElements.bodyElement); while (e.openElements.length > 1) e.openElements.pop(); - e.insertElement(t, n), e.setInsertionMode("inFrameset"); + (e.insertElement(t, n), e.setInsertionMode("inFrameset")); } }), (t.inBody.startTagCloseP = function (t, n) { - e.openElements.inButtonScope("p") && this.endTagP("p"), - e.insertElement(t, n); + (e.openElements.inButtonScope("p") && this.endTagP("p"), + e.insertElement(t, n)); }), (t.inBody.startTagPreListing = function (t, n) { - e.openElements.inButtonScope("p") && this.endTagP("p"), + (e.openElements.inButtonScope("p") && this.endTagP("p"), e.insertElement(t, n), (e.framesetOk = !1), - (e.shouldSkipLeadingNewline = !0); + (e.shouldSkipLeadingNewline = !0)); }), (t.inBody.startTagForm = function (t, n) { e.form @@ -4117,11 +4121,11 @@ (e.form = e.currentStackItem())); }), (t.inBody.startTagRpRt = function (t, n) { - e.openElements.inScope("ruby") && + (e.openElements.inScope("ruby") && (e.generateImpliedEndTags(), e.currentStackItem().localName != "ruby" && e.parseError("unexpected-start-tag", { name: t })), - e.insertElement(t, n); + e.insertElement(t, n)); }), (t.inBody.startTagListItem = function (t, n) { var r = { li: ["li"], dd: ["dd", "dt"], dt: ["dd", "dt"] }, @@ -4141,25 +4145,25 @@ ) break; } - e.openElements.inButtonScope("p") && this.endTagP("p"), + (e.openElements.inButtonScope("p") && this.endTagP("p"), e.insertElement(t, n), - (e.framesetOk = !1); + (e.framesetOk = !1)); }), (t.inBody.startTagPlaintext = function (t, n) { - e.openElements.inButtonScope("p") && this.endTagP("p"), + (e.openElements.inButtonScope("p") && this.endTagP("p"), e.insertElement(t, n), - e.tokenizer.setState(u.PLAINTEXT); + e.tokenizer.setState(u.PLAINTEXT)); }), (t.inBody.startTagHeading = function (t, n) { - e.openElements.inButtonScope("p") && this.endTagP("p"), + (e.openElements.inButtonScope("p") && this.endTagP("p"), e.currentStackItem().isNumberedHeader() && (e.parseError("unexpected-start-tag", { name: t }), e.popElement()), - e.insertElement(t, n); + e.insertElement(t, n)); }), (t.inBody.startTagA = function (t, n) { var r = e.elementInActiveFormattingElements("a"); - r && + (r && (e.parseError("unexpected-start-tag-implies-end-tag", { startName: "a", endName: "a", @@ -4168,14 +4172,14 @@ e.openElements.contains(r) && e.openElements.remove(r), e.removeElementFromActiveFormattingElements(r)), e.reconstructActiveFormattingElements(), - e.insertFormattingElement(t, n); + e.insertFormattingElement(t, n)); }), (t.inBody.startTagFormatting = function (t, n) { - e.reconstructActiveFormattingElements(), - e.insertFormattingElement(t, n); + (e.reconstructActiveFormattingElements(), + e.insertFormattingElement(t, n)); }), (t.inBody.startTagNobr = function (t, n) { - e.reconstructActiveFormattingElements(), + (e.reconstructActiveFormattingElements(), e.openElements.inScope("nobr") && (e.parseError("unexpected-start-tag-implies-end-tag", { startName: "nobr", @@ -4183,7 +4187,7 @@ }), this.processEndTag("nobr"), e.reconstructActiveFormattingElements()), - e.insertFormattingElement(t, n); + e.insertFormattingElement(t, n)); }), (t.inBody.startTagButton = function (t, n) { e.openElements.inScope("button") @@ -4198,10 +4202,10 @@ e.insertElement(t, n)); }), (t.inBody.startTagAppletMarqueeObject = function (t, n) { - e.reconstructActiveFormattingElements(), + (e.reconstructActiveFormattingElements(), e.insertElement(t, n), e.activeFormattingElements.push(l), - (e.framesetOk = !1); + (e.framesetOk = !1)); }), (t.inBody.endTagAppletMarqueeObject = function (t) { e.openElements.inScope(t) @@ -4213,38 +4217,38 @@ : e.parseError("unexpected-end-tag", { name: t }); }), (t.inBody.startTagXmp = function (t, n) { - e.openElements.inButtonScope("p") && this.processEndTag("p"), + (e.openElements.inButtonScope("p") && this.processEndTag("p"), e.reconstructActiveFormattingElements(), e.processGenericRawTextStartTag(t, n), - (e.framesetOk = !1); + (e.framesetOk = !1)); }), (t.inBody.startTagTable = function (t, n) { - e.compatMode !== "quirks" && + (e.compatMode !== "quirks" && e.openElements.inButtonScope("p") && this.processEndTag("p"), e.insertElement(t, n), e.setInsertionMode("inTable"), - (e.framesetOk = !1); + (e.framesetOk = !1)); }), (t.inBody.startTagVoidFormatting = function (t, n) { - e.reconstructActiveFormattingElements(), + (e.reconstructActiveFormattingElements(), e.insertSelfClosingElement(t, n), - (e.framesetOk = !1); + (e.framesetOk = !1)); }), (t.inBody.startTagParamSourceTrack = function (t, n) { e.insertSelfClosingElement(t, n); }), (t.inBody.startTagHr = function (t, n) { - e.openElements.inButtonScope("p") && this.endTagP("p"), + (e.openElements.inButtonScope("p") && this.endTagP("p"), e.insertSelfClosingElement(t, n), - (e.framesetOk = !1); + (e.framesetOk = !1)); }), (t.inBody.startTagImage = function (t, n) { - e.parseError("unexpected-start-tag-treated-as", { + (e.parseError("unexpected-start-tag-treated-as", { originalName: "image", newName: "img", }), - this.processStartTag("img", n); + this.processStartTag("img", n)); }), (t.inBody.startTagInput = function (t, n) { var r = e.framesetOk; @@ -4257,8 +4261,8 @@ } }), (t.inBody.startTagIsindex = function (t, n) { - e.parseError("deprecated-tag", { name: "isindex" }), - (e.selfClosingFlagAcknowledged = !0); + (e.parseError("deprecated-tag", { name: "isindex" }), + (e.selfClosingFlagAcknowledged = !0)); if (e.form) return; var r = [], i = [], @@ -4282,7 +4286,7 @@ nodeValue: n[o].nodeValue, }); } - i.push({ nodeName: "name", nodeValue: "isindex" }), + (i.push({ nodeName: "name", nodeValue: "isindex" }), this.processStartTag("form", r), this.processStartTag("hr"), this.processStartTag("label"), @@ -4290,26 +4294,26 @@ this.processStartTag("input", i), this.processEndTag("label"), this.processStartTag("hr"), - this.processEndTag("form"); + this.processEndTag("form")); }), (t.inBody.startTagTextarea = function (t, n) { - e.insertElement(t, n), + (e.insertElement(t, n), e.tokenizer.setState(u.RCDATA), (e.originalInsertionMode = e.insertionModeName), (e.shouldSkipLeadingNewline = !0), (e.framesetOk = !1), - e.setInsertionMode("text"); + e.setInsertionMode("text")); }), (t.inBody.startTagIFrame = function (t, n) { - (e.framesetOk = !1), this.startTagRawText(t, n); + ((e.framesetOk = !1), this.startTagRawText(t, n)); }), (t.inBody.startTagRawText = function (t, n) { e.processGenericRawTextStartTag(t, n); }), (t.inBody.startTagSelect = function (t, n) { - e.reconstructActiveFormattingElements(), + (e.reconstructActiveFormattingElements(), e.insertElement(t, n), - (e.framesetOk = !1); + (e.framesetOk = !1)); var r = e.insertionModeName; r == "inTable" || r == "inCaption" || @@ -4327,35 +4331,36 @@ e.parseError("unexpected-end-tag", { name: t }); }), (t.inBody.endTagBr = function (t) { - e.parseError("unexpected-end-tag-treated-as", { + (e.parseError("unexpected-end-tag-treated-as", { originalName: "br", newName: "br element", }), e.reconstructActiveFormattingElements(), e.insertElement(t, []), - e.popElement(); + e.popElement()); }), (t.inBody.startTagOptionOptgroup = function (t, n) { - e.currentStackItem().localName == "option" && e.popElement(), + (e.currentStackItem().localName == "option" && e.popElement(), e.reconstructActiveFormattingElements(), - e.insertElement(t, n); + e.insertElement(t, n)); }), (t.inBody.startTagOther = function (t, n) { - e.reconstructActiveFormattingElements(), e.insertElement(t, n); + (e.reconstructActiveFormattingElements(), + e.insertElement(t, n)); }), (t.inBody.endTagOther = function (t) { var n; for (var r = e.openElements.length - 1; r > 0; r--) { n = e.openElements.item(r); if (n.localName == t) { - e.generateImpliedEndTags(t), + (e.generateImpliedEndTags(t), e.currentStackItem().localName != t && e.parseError("unexpected-end-tag", { name: t }), e.openElements.remove_openElements_until( function (e) { return e === n; }, - ); + )); break; } if (n.isSpecial()) { @@ -4365,7 +4370,7 @@ } }), (t.inBody.startTagMath = function (t, n, r) { - e.reconstructActiveFormattingElements(), + (e.reconstructActiveFormattingElements(), (n = e.adjustMathMLAttributes(n)), (n = e.adjustForeignAttributes(n)), e.insertForeignElement( @@ -4373,10 +4378,10 @@ n, "http://www.w3.org/1998/Math/MathML", r, - ); + )); }), (t.inBody.startTagSVG = function (t, n, r) { - e.reconstructActiveFormattingElements(), + (e.reconstructActiveFormattingElements(), (n = e.adjustSVGAttributes(n)), (n = e.adjustForeignAttributes(n)), e.insertForeignElement( @@ -4384,7 +4389,7 @@ n, "http://www.w3.org/2000/svg", r, - ); + )); }), (t.inBody.endTagP = function (t) { e.openElements.inButtonScope("p") @@ -4403,25 +4408,25 @@ e.parseError("unexpected-end-tag", { name: t }); return; } - e.currentStackItem().localName != "body" && + (e.currentStackItem().localName != "body" && e.parseError("expected-one-end-tag-but-got-another", { expectedName: e.currentStackItem().localName, gotName: t, }), - e.setInsertionMode("afterBody"); + e.setInsertionMode("afterBody")); }), (t.inBody.endTagHtml = function (t) { if (!e.openElements.inScope("body")) { e.parseError("unexpected-end-tag", { name: t }); return; } - e.currentStackItem().localName != "body" && + (e.currentStackItem().localName != "body" && e.parseError("expected-one-end-tag-but-got-another", { expectedName: e.currentStackItem().localName, gotName: t, }), e.setInsertionMode("afterBody"), - e.insertionMode.processEndTag(t); + e.insertionMode.processEndTag(t)); }), (t.inBody.endTagBlock = function (t) { e.openElements.inScope(t) @@ -4433,7 +4438,7 @@ }), (t.inBody.endTagForm = function (t) { var n = e.form; - (e.form = null), + ((e.form = null), !n || !e.openElements.inScope(t) ? e.parseError("unexpected-end-tag", { name: t }) : (e.generateImpliedEndTags(), @@ -4441,7 +4446,7 @@ e.parseError("end-tag-too-early-ignored", { name: "form", }), - e.openElements.remove(n)); + e.openElements.remove(n))); }), (t.inBody.endTagListItem = function (t) { e.openElements.inListItemScope(t) @@ -4456,12 +4461,12 @@ e.parseError("unexpected-end-tag", { name: t }); return; } - e.generateImpliedEndTags(), + (e.generateImpliedEndTags(), e.currentStackItem().localName != t && e.parseError("end-tag-too-early", { name: t }), e.openElements.remove_openElements_until(function (e) { return e.isNumberedHeader(); - }); + })); }), (t.inBody.endTagFormatting = function (t, n) { e.adoptionAgencyEndTag(t) || this.endTagOther(t, n); @@ -4499,8 +4504,8 @@ (t.inCaption.startTagTableElement = function (t, n) { e.parseError("unexpected-end-tag", { name: t }); var r = !e.openElements.inTableScope("caption"); - e.insertionMode.processEndTag("caption"), - r || e.insertionMode.processStartTag(t, n); + (e.insertionMode.processEndTag("caption"), + r || e.insertionMode.processStartTag(t, n)); }), (t.inCaption.startTagOther = function (e, n, r) { t.inBody.processStartTag(e, n, r); @@ -4522,8 +4527,8 @@ (t.inCaption.endTagTable = function (t) { e.parseError("unexpected-end-table-in-caption"); var n = !e.openElements.inTableScope("caption"); - e.insertionMode.processEndTag("caption"), - n || e.insertionMode.processEndTag(t); + (e.insertionMode.processEndTag("caption"), + n || e.insertionMode.processEndTag(t)); }), (t.inCaption.endTagIgnore = function (t) { e.parseError("unexpected-end-tag", { name: t }); @@ -4622,16 +4627,16 @@ n && e.insertText(n); if (!t.length) return; var r = this.ignoreEndTagColgroup(); - this.endTagColgroup("colgroup"), - r || e.insertionMode.processCharacters(t); + (this.endTagColgroup("colgroup"), + r || e.insertionMode.processCharacters(t)); }), (t.inColumnGroup.startTagCol = function (t, n) { e.insertSelfClosingElement(t, n); }), (t.inColumnGroup.startTagOther = function (t, n, r) { var i = this.ignoreEndTagColgroup(); - this.endTagColgroup("colgroup"), - i || e.insertionMode.processStartTag(t, n, r); + (this.endTagColgroup("colgroup"), + i || e.insertionMode.processStartTag(t, n, r)); }), (t.inColumnGroup.endTagColgroup = function (t) { this.ignoreEndTagColgroup() @@ -4644,8 +4649,8 @@ }), (t.inColumnGroup.endTagOther = function (t) { var n = this.ignoreEndTagColgroup(); - this.endTagColgroup("colgroup"), - n || e.insertionMode.processEndTag(t); + (this.endTagColgroup("colgroup"), + n || e.insertionMode.processEndTag(t)); }), (t.inForeignContent = Object.create(t.base)), (t.inForeignContent.processStartTag = function (t, n, r) { @@ -4716,7 +4721,7 @@ e.insertionMode.processStartTag(t, n, r); return; } - e.currentStackItem().namespaceURI == + (e.currentStackItem().namespaceURI == "http://www.w3.org/1998/Math/MathML" && (n = e.adjustMathMLAttributes(n)), e.currentStackItem().namespaceURI == @@ -4729,7 +4734,7 @@ n, e.currentStackItem().namespaceURI, r, - ); + )); }), (t.inForeignContent.processEndTag = function (t) { var n = e.currentStackItem(), @@ -4742,7 +4747,7 @@ while (e.openElements.pop() != n); break; } - (r -= 1), (n = e.openElements.item(r)); + ((r -= 1), (n = e.openElements.item(r))); if (n.isForeign()) continue; e.insertionMode.processEndTag(t); break; @@ -4750,11 +4755,11 @@ }), (t.inForeignContent.processCharacters = function (t) { var n = t.takeRemaining(); - (n = n.replace(/\u0000/g, function (t, n) { - return e.parseError("invalid-codepoint"), "\ufffd"; + ((n = n.replace(/\u0000/g, function (t, n) { + return (e.parseError("invalid-codepoint"), "\ufffd"); })), e.framesetOk && !d(n) && (e.framesetOk = !1), - e.insertText(n); + e.insertText(n)); }), (t.inHeadNoscript = Object.create(t.base)), (t.inHeadNoscript.start_tag_handlers = { @@ -4778,9 +4783,9 @@ var n = t.takeLeadingWhitespace(); n && e.insertText(n); if (!t.length) return; - e.parseError("unexpected-char-in-frameset"), + (e.parseError("unexpected-char-in-frameset"), this.anythingElse(), - e.insertionMode.processCharacters(t); + e.insertionMode.processCharacters(t)); }), (t.inHeadNoscript.processComment = function (e) { t.inHead.processComment(e); @@ -4793,23 +4798,23 @@ e.parseError("unexpected-start-tag-in-frameset", { name: t }); }), (t.inHeadNoscript.startTagOther = function (t, n) { - e.parseError("unexpected-start-tag-in-frameset", { name: t }), + (e.parseError("unexpected-start-tag-in-frameset", { name: t }), this.anythingElse(), - e.insertionMode.processStartTag(t, n); + e.insertionMode.processStartTag(t, n)); }), (t.inHeadNoscript.endTagBr = function (t, n) { - e.parseError("unexpected-end-tag-in-frameset", { name: t }), + (e.parseError("unexpected-end-tag-in-frameset", { name: t }), this.anythingElse(), - e.insertionMode.processEndTag(t, n); + e.insertionMode.processEndTag(t, n)); }), (t.inHeadNoscript.endTagNoscript = function (t, n) { - e.popElement(), e.setInsertionMode("inHead"); + (e.popElement(), e.setInsertionMode("inHead")); }), (t.inHeadNoscript.endTagOther = function (t, n) { e.parseError("unexpected-end-tag-in-frameset", { name: t }); }), (t.inHeadNoscript.anythingElse = function () { - e.popElement(), e.setInsertionMode("inHead"); + (e.popElement(), e.setInsertionMode("inHead")); }), (t.inFrameset = Object.create(t.base)), (t.inFrameset.start_tag_handlers = { @@ -4840,12 +4845,12 @@ e.parseError("unexpected-start-tag-in-frameset", { name: t }); }), (t.inFrameset.endTagFrameset = function (t, n) { - e.currentStackItem().localName == "html" + (e.currentStackItem().localName == "html" ? e.parseError("unexpected-frameset-in-frameset-innerhtml") : e.popElement(), !e.context && e.currentStackItem().localName != "frameset" && - e.setInsertionMode("afterFrameset"); + e.setInsertionMode("afterFrameset")); }), (t.inFrameset.endTagNoframes = function (e) { t.inBody.processEndTag(e); @@ -4890,45 +4895,45 @@ (t.inTable.processCharacters = function (n) { if (e.currentStackItem().isFosterParenting()) { var r = e.insertionModeName; - e.setInsertionMode("inTableText"), + (e.setInsertionMode("inTableText"), (e.originalInsertionMode = r), - e.insertionMode.processCharacters(n); + e.insertionMode.processCharacters(n)); } else - (e.redirectAttachToFosterParent = !0), + ((e.redirectAttachToFosterParent = !0), t.inBody.processCharacters(n), - (e.redirectAttachToFosterParent = !1); + (e.redirectAttachToFosterParent = !1)); }), (t.inTable.startTagCaption = function (t, n) { - e.openElements.popUntilTableScopeMarker(), + (e.openElements.popUntilTableScopeMarker(), e.activeFormattingElements.push(l), e.insertElement(t, n), - e.setInsertionMode("inCaption"); + e.setInsertionMode("inCaption")); }), (t.inTable.startTagColgroup = function (t, n) { - e.openElements.popUntilTableScopeMarker(), + (e.openElements.popUntilTableScopeMarker(), e.insertElement(t, n), - e.setInsertionMode("inColumnGroup"); + e.setInsertionMode("inColumnGroup")); }), (t.inTable.startTagCol = function (t, n) { - this.startTagColgroup("colgroup", []), - e.insertionMode.processStartTag(t, n); + (this.startTagColgroup("colgroup", []), + e.insertionMode.processStartTag(t, n)); }), (t.inTable.startTagRowGroup = function (t, n) { - e.openElements.popUntilTableScopeMarker(), + (e.openElements.popUntilTableScopeMarker(), e.insertElement(t, n), - e.setInsertionMode("inTableBody"); + e.setInsertionMode("inTableBody")); }), (t.inTable.startTagImplyTbody = function (t, n) { - this.startTagRowGroup("tbody", []), - e.insertionMode.processStartTag(t, n); + (this.startTagRowGroup("tbody", []), + e.insertionMode.processStartTag(t, n)); }), (t.inTable.startTagTable = function (t, n) { - e.parseError("unexpected-start-tag-implies-end-tag", { + (e.parseError("unexpected-start-tag-implies-end-tag", { startName: "table", endName: "table", }), e.insertionMode.processEndTag("table"), - e.context || e.insertionMode.processStartTag(t, n); + e.context || e.insertionMode.processStartTag(t, n)); }), (t.inTable.startTagStyleScript = function (e, n) { t.inHead.processStartTag(e, n); @@ -4937,9 +4942,9 @@ for (var r in n) if (n[r].nodeName.toLowerCase() == "type") { if (n[r].nodeValue.toLowerCase() == "hidden") { - e.parseError("unexpected-hidden-input-in-table"), + (e.parseError("unexpected-hidden-input-in-table"), e.insertElement(t, n), - e.openElements.pop(); + e.openElements.pop()); return; } break; @@ -4947,19 +4952,19 @@ this.startTagOther(t, n); }), (t.inTable.startTagForm = function (t, n) { - e.parseError("unexpected-form-in-table"), + (e.parseError("unexpected-form-in-table"), e.form || (e.insertElement(t, n), (e.form = e.currentStackItem()), - e.openElements.pop()); + e.openElements.pop())); }), (t.inTable.startTagOther = function (n, r, i) { - e.parseError("unexpected-start-tag-implies-table-voodoo", { + (e.parseError("unexpected-start-tag-implies-table-voodoo", { name: n, }), (e.redirectAttachToFosterParent = !0), t.inBody.processStartTag(n, r, i), - (e.redirectAttachToFosterParent = !1); + (e.redirectAttachToFosterParent = !1)); }), (t.inTable.endTagTable = function (t) { e.openElements.inTableScope(t) @@ -4978,52 +4983,52 @@ e.parseError("unexpected-end-tag", { name: t }); }), (t.inTable.endTagOther = function (n) { - e.parseError("unexpected-end-tag-implies-table-voodoo", { + (e.parseError("unexpected-end-tag-implies-table-voodoo", { name: n, }), (e.redirectAttachToFosterParent = !0), t.inBody.processEndTag(n), - (e.redirectAttachToFosterParent = !1); + (e.redirectAttachToFosterParent = !1)); }), (t.inTableText = Object.create(t.base)), (t.inTableText.flushCharacters = function () { var t = e.pendingTableCharacters.join(""); - p(t) + (p(t) ? e.insertText(t) : ((e.redirectAttachToFosterParent = !0), e.reconstructActiveFormattingElements(), e.insertText(t), (e.framesetOk = !1), (e.redirectAttachToFosterParent = !1)), - (e.pendingTableCharacters = []); + (e.pendingTableCharacters = [])); }), (t.inTableText.processComment = function (t) { - this.flushCharacters(), + (this.flushCharacters(), e.setInsertionMode(e.originalInsertionMode), - e.insertionMode.processComment(t); + e.insertionMode.processComment(t)); }), (t.inTableText.processEOF = function (t) { - this.flushCharacters(), + (this.flushCharacters(), e.setInsertionMode(e.originalInsertionMode), - e.insertionMode.processEOF(); + e.insertionMode.processEOF()); }), (t.inTableText.processCharacters = function (t) { var n = t.takeRemaining(); n = n.replace(/\u0000/g, function (t, n) { - return e.parseError("invalid-codepoint"), ""; + return (e.parseError("invalid-codepoint"), ""); }); if (!n) return; e.pendingTableCharacters.push(n); }), (t.inTableText.processStartTag = function (t, n, r) { - this.flushCharacters(), + (this.flushCharacters(), e.setInsertionMode(e.originalInsertionMode), - e.insertionMode.processStartTag(t, n, r); + e.insertionMode.processStartTag(t, n, r)); }), (t.inTableText.processEndTag = function (t, n) { - this.flushCharacters(), + (this.flushCharacters(), e.setInsertionMode(e.originalInsertionMode), - e.insertionMode.processEndTag(t, n); + e.insertionMode.processEndTag(t, n)); }), (t.inTableBody = Object.create(t.base)), (t.inTableBody.start_tag_handlers = { @@ -5058,14 +5063,14 @@ t.inTable.processCharacters(e); }), (t.inTableBody.startTagTr = function (t, n) { - e.openElements.popUntilTableBodyScopeMarker(), + (e.openElements.popUntilTableBodyScopeMarker(), e.insertElement(t, n), - e.setInsertionMode("inRow"); + e.setInsertionMode("inRow")); }), (t.inTableBody.startTagTableCell = function (t, n) { - e.parseError("unexpected-cell-in-table-body", { name: t }), + (e.parseError("unexpected-cell-in-table-body", { name: t }), this.startTagTr("tr", []), - e.insertionMode.processStartTag(t, n); + e.insertionMode.processStartTag(t, n)); }), (t.inTableBody.startTagTableOther = function (t, n) { e.openElements.inTableScope("tbody") || @@ -5132,20 +5137,20 @@ (t.inSelect.processCharacters = function (t) { var n = t.takeRemaining(); n = n.replace(/\u0000/g, function (t, n) { - return e.parseError("invalid-codepoint"), ""; + return (e.parseError("invalid-codepoint"), ""); }); if (!n) return; e.insertText(n); }), (t.inSelect.startTagOption = function (t, n) { - e.currentStackItem().localName == "option" && e.popElement(), - e.insertElement(t, n); + (e.currentStackItem().localName == "option" && e.popElement(), + e.insertElement(t, n)); }), (t.inSelect.startTagOptgroup = function (t, n) { - e.currentStackItem().localName == "option" && e.popElement(), + (e.currentStackItem().localName == "option" && e.popElement(), e.currentStackItem().localName == "optgroup" && e.popElement(), - e.insertElement(t, n); + e.insertElement(t, n)); }), (t.inSelect.endTagOption = function (t) { if (e.currentStackItem().localName !== "option") { @@ -5155,7 +5160,7 @@ e.popElement(); }), (t.inSelect.endTagOptgroup = function (t) { - e.currentStackItem().localName == "option" && + (e.currentStackItem().localName == "option" && e.openElements.item(e.openElements.length - 2).localName == "optgroup" && e.popElement(), @@ -5163,11 +5168,11 @@ ? e.popElement() : e.parseError("unexpected-end-tag-in-select", { name: "optgroup", - }); + })); }), (t.inSelect.startTagSelect = function (t) { - e.parseError("unexpected-select-in-select"), - this.endTagSelect("select"); + (e.parseError("unexpected-select-in-select"), + this.endTagSelect("select")); }), (t.inSelect.endTagSelect = function (t) { e.openElements.inTableScope("select") @@ -5176,19 +5181,19 @@ : e.parseError("unexpected-end-tag", { name: t }); }), (t.inSelect.startTagInput = function (t, n) { - e.parseError("unexpected-input-in-select"), + (e.parseError("unexpected-input-in-select"), e.openElements.inSelectScope("select") && (this.endTagSelect("select"), - e.insertionMode.processStartTag(t, n)); + e.insertionMode.processStartTag(t, n))); }), (t.inSelect.startTagScript = function (e, n) { t.inHead.processStartTag(e, n); }), (t.inSelect.endTagTableElements = function (t) { - e.parseError("unexpected-end-tag-in-select", { name: t }), + (e.parseError("unexpected-end-tag-in-select", { name: t }), e.openElements.inTableScope(t) && (this.endTagSelect("select"), - e.insertionMode.processEndTag(t)); + e.insertionMode.processEndTag(t))); }), (t.inSelect.startTagOther = function (t, n) { e.parseError("unexpected-start-tag-in-select", { name: t }); @@ -5223,24 +5228,24 @@ t.inSelect.processCharacters(e); }), (t.inSelectInTable.startTagTable = function (t, n) { - e.parseError( + (e.parseError( "unexpected-table-element-start-tag-in-select-in-table", { name: t }, ), this.endTagOther("select"), - e.insertionMode.processStartTag(t, n); + e.insertionMode.processStartTag(t, n)); }), (t.inSelectInTable.startTagOther = function (e, n, r) { t.inSelect.processStartTag(e, n, r); }), (t.inSelectInTable.endTagTable = function (t) { - e.parseError( + (e.parseError( "unexpected-table-element-end-tag-in-select-in-table", { name: t }, ), e.openElements.inTableScope(t) && (this.endTagOther("select"), - e.insertionMode.processEndTag(t)); + e.insertionMode.processEndTag(t))); }), (t.inSelectInTable.endTagOther = function (e) { t.inSelect.processEndTag(e); @@ -5278,14 +5283,15 @@ t.inTable.processCharacters(e); }), (t.inRow.startTagTableCell = function (t, n) { - e.openElements.popUntilTableRowScopeMarker(), + (e.openElements.popUntilTableRowScopeMarker(), e.insertElement(t, n), e.setInsertionMode("inCell"), - e.activeFormattingElements.push(l); + e.activeFormattingElements.push(l)); }), (t.inRow.startTagTableOther = function (t, n) { var r = this.ignoreEndTagTr(); - this.endTagTr("tr"), r || e.insertionMode.processStartTag(t, n); + (this.endTagTr("tr"), + r || e.insertionMode.processStartTag(t, n)); }), (t.inRow.startTagOther = function (e, n, r) { t.inTable.processStartTag(e, n, r); @@ -5300,7 +5306,7 @@ }), (t.inRow.endTagTable = function (t) { var n = this.ignoreEndTagTr(); - this.endTagTr("tr"), n || e.insertionMode.processEndTag(t); + (this.endTagTr("tr"), n || e.insertionMode.processEndTag(t)); }), (t.inRow.endTagTableRowGroup = function (t) { e.openElements.inTableScope(t) @@ -5333,9 +5339,10 @@ var s = n[i]; c(s) && (r += s); } - r && (e.reconstructActiveFormattingElements(), e.insertText(r)), + (r && + (e.reconstructActiveFormattingElements(), e.insertText(r)), r.length < n.length && - e.parseError("expected-eof-but-got-char"); + e.parseError("expected-eof-but-got-char")); }), (t.afterAfterFrameset.startTagNoFrames = function (e, n) { t.inHead.processStartTag(e, n); @@ -5361,12 +5368,12 @@ e.insertText(n); }), (t.text.processEOF = function () { - e.parseError("expected-named-closing-tag-but-got-eof", { + (e.parseError("expected-named-closing-tag-but-got-eof", { name: e.currentStackItem().localName, }), e.openElements.pop(), e.setInsertionMode(e.originalInsertionMode), - e.insertionMode.processEOF(); + e.insertionMode.processEOF()); }), (t.text.startTagOther = function (e) { throw ( @@ -5377,13 +5384,13 @@ }), (t.text.endTagScript = function (t) { var n = e.openElements.pop(); - r.ok(n.localName == "script"), - e.setInsertionMode(e.originalInsertionMode); + (r.ok(n.localName == "script"), + e.setInsertionMode(e.originalInsertionMode)); }), (t.text.endTagOther = function (t) { - e.openElements.pop(), - e.setInsertionMode(e.originalInsertionMode); - }); + (e.openElements.pop(), + e.setInsertionMode(e.originalInsertionMode)); + })); } function y(e, t) { return e.replace(new RegExp("{[0-9a-z-]+}", "gi"), function (e) { @@ -5398,7 +5405,7 @@ a = e("./ElementStack").ElementStack, f = e("./StackItem").StackItem, l = {}; - (m.prototype.skipAtMostOneLeadingNewline = function () { + ((m.prototype.skipAtMostOneLeadingNewline = function () { this.characters[this.current] === "\n" && this.current++; }), (m.prototype.skipLeadingWhitespace = function () { @@ -5427,8 +5434,8 @@ }, }), (g.prototype.setInsertionMode = function (e) { - (this.insertionMode = this.insertionModes[e]), - (this.insertionModeName = e); + ((this.insertionMode = this.insertionModes[e]), + (this.insertionModeName = e)); }), (g.prototype.adoptionAgencyEndTag = function (e) { function i(e) { @@ -5446,7 +5453,8 @@ !this.openElements.inScope(r.localName)) ) return ( - this.parseError("adoption-agency-1.1", { name: e }), !1 + this.parseError("adoption-agency-1.1", { name: e }), + !1 ); if (!this.openElements.contains(r)) return ( @@ -5454,10 +5462,10 @@ this.removeElementFromActiveFormattingElements(r), !0 ); - this.openElements.inScope(r.localName) || + (this.openElements.inScope(r.localName) || this.parseError("adoption-agency-4.4", { name: e }), r != this.currentStackItem() && - this.parseError("adoption-agency-1.3", { name: e }); + this.parseError("adoption-agency-1.3", { name: e })); var o = this.openElements.furthestBlockForFormattingElement( r.node, ); @@ -5475,7 +5483,7 @@ p = this.openElements.elements.indexOf(c), d = 0; while (d++ < n) { - (p -= 1), (c = this.openElements.item(p)); + ((p -= 1), (c = this.openElements.item(p))); if (this.activeFormattingElements.indexOf(c) < 0) { this.openElements.elements.splice(p, 1); continue; @@ -5489,7 +5497,7 @@ c.attributes, ), m = new f(c.namespaceURI, c.localName, c.attributes, v); - (this.activeFormattingElements[ + ((this.activeFormattingElements[ this.activeFormattingElements.indexOf(c) ] = m), (this.openElements.elements[ @@ -5498,19 +5506,19 @@ (c = m), this.detachFromParent(h.node), this.attachNode(h.node, c.node), - (h = c); + (h = c)); } - this.detachFromParent(h.node), + (this.detachFromParent(h.node), a.isFosterParenting() ? this.insertIntoFosterParent(h.node) - : this.attachNode(h.node, a.node); + : this.attachNode(h.node, a.node)); var v = this.createElement( "http://www.w3.org/1999/xhtml", r.localName, r.attributes, ), g = new f(r.namespaceURI, r.localName, r.attributes, v); - this.reparentChildren(o.node, v), + (this.reparentChildren(o.node, v), this.attachNode(v, o.node), this.removeElementFromActiveFormattingElements(r), this.activeFormattingElements.splice( @@ -5523,7 +5531,7 @@ this.openElements.elements.indexOf(o) + 1, 0, g, - ); + )); } return !0; }), @@ -5531,13 +5539,13 @@ throw "Not mplemented"; }), (g.prototype.startTokenization = function (e) { - (this.tokenizer = e), + ((this.tokenizer = e), (this.compatMode = "no quirks"), (this.originalInsertionMode = "initial"), (this.framesetOk = !0), (this.openElements = new a()), (this.activeFormattingElements = []), - this.start(); + this.start()); if (this.context) { switch (this.context) { case "title": @@ -5561,7 +5569,7 @@ case "plaintext": this.tokenizer.setState(u.PLAINTEXT); } - this.insertHtmlElement(), this.resetInsertionMode(); + (this.insertHtmlElement(), this.resetInsertionMode()); } else this.setInsertionMode("initial"); }), (g.prototype.processToken = function (e) { @@ -5692,24 +5700,24 @@ (g.prototype.insertElement = function (e, t, n, r) { n || (n = "http://www.w3.org/1999/xhtml"); var i = this.createElement(n, e, t); - this.shouldFosterParent() + (this.shouldFosterParent() ? this.insertIntoFosterParent(i) : this.attachNode(i, this.openElements.top.node), - r || this.openElements.push(new f(n, e, t, i)); + r || this.openElements.push(new f(n, e, t, i))); }), (g.prototype.insertFormattingElement = function (e, t) { - this.insertElement(e, t, "http://www.w3.org/1999/xhtml"), + (this.insertElement(e, t, "http://www.w3.org/1999/xhtml"), this.appendElementToActiveFormattingElements( this.currentStackItem(), - ); + )); }), (g.prototype.insertSelfClosingElement = function (e, t) { - (this.selfClosingFlagAcknowledged = !0), - this.insertElement(e, t, "http://www.w3.org/1999/xhtml", !0); + ((this.selfClosingFlagAcknowledged = !0), + this.insertElement(e, t, "http://www.w3.org/1999/xhtml", !0)); }), (g.prototype.insertForeignElement = function (e, t, n, r) { - r && (this.selfClosingFlagAcknowledged = !0), - this.insertElement(e, t, n, r); + (r && (this.selfClosingFlagAcknowledged = !0), + this.insertElement(e, t, n, r)); }), (g.prototype.insertComment = function (e, t) { throw new Error("Not implemented"); @@ -5746,13 +5754,13 @@ t = this.activeFormattingElements[e]; if (t == l || this.openElements.contains(t)) return; while (t != l && !this.openElements.contains(t)) { - (e -= 1), (t = this.activeFormattingElements[e]); + ((e -= 1), (t = this.activeFormattingElements[e])); if (!t) break; } for (;;) { - (e += 1), + ((e += 1), (t = this.activeFormattingElements[e]), - this.insertElement(t.localName, t.attributes); + this.insertElement(t.localName, t.attributes)); var n = this.currentStackItem(); this.activeFormattingElements[e] = n; if ( @@ -5795,14 +5803,14 @@ c && c.nodeValue === a.nodeValue && o.push(s); } if (o.length < t) return; - (n = o), (o = []); + ((n = o), (o = [])); } for (var i = t - 1; i < n.length; i++) this.removeElementFromActiveFormattingElements(n[i]); }), (g.prototype.appendElementToActiveFormattingElements = function (e) { - this.ensureNoahsArkCondition(e), - this.activeFormattingElements.push(e); + (this.ensureNoahsArkCondition(e), + this.activeFormattingElements.push(e)); }), (g.prototype.removeElementFromActiveFormattingElements = function (e) { var t = this.activeFormattingElements.indexOf(e); @@ -5841,7 +5849,7 @@ var e = !1, t = null; for (var n = this.openElements.length - 1; n >= 0; n--) { - (t = this.openElements.item(n)), + ((t = this.openElements.item(n)), n === 0 && (r.ok(this.context), (e = !0), @@ -5850,7 +5858,7 @@ this.context, [], null, - ))); + )))); if (t.namespaceURI === "http://www.w3.org/1999/xhtml") { if (t.localName === "select") return this.setInsertionMode("inSelect"); @@ -5885,23 +5893,23 @@ } }), (g.prototype.processGenericRCDATAStartTag = function (e, t) { - this.insertElement(e, t), + (this.insertElement(e, t), this.tokenizer.setState(u.RCDATA), (this.originalInsertionMode = this.insertionModeName), - this.setInsertionMode("text"); + this.setInsertionMode("text")); }), (g.prototype.processGenericRawTextStartTag = function (e, t) { - this.insertElement(e, t), + (this.insertElement(e, t), this.tokenizer.setState(u.RAWTEXT), (this.originalInsertionMode = this.insertionModeName), - this.setInsertionMode("text"); + this.setInsertionMode("text")); }), (g.prototype.adjustMathMLAttributes = function (e) { return ( e.forEach(function (e) { - (e.namespaceURI = "http://www.w3.org/1998/Math/MathML"), + ((e.namespaceURI = "http://www.w3.org/1998/Math/MathML"), s.MATHMLAttributeMap[e.nodeName] && - (e.nodeName = s.MATHMLAttributeMap[e.nodeName]); + (e.nodeName = s.MATHMLAttributeMap[e.nodeName])); }), e ); @@ -5912,9 +5920,9 @@ (g.prototype.adjustSVGAttributes = function (e) { return ( e.forEach(function (e) { - (e.namespaceURI = "http://www.w3.org/2000/svg"), + ((e.namespaceURI = "http://www.w3.org/2000/svg"), s.SVGAttributeMap[e.nodeName] && - (e.nodeName = s.SVGAttributeMap[e.nodeName]); + (e.nodeName = s.SVGAttributeMap[e.nodeName])); }), e ); @@ -5930,7 +5938,7 @@ } return e; }), - (n.TreeBuilder = g); + (n.TreeBuilder = g)); }, { "./ElementStack": 1, @@ -5944,7 +5952,7 @@ ], 7: [ function (e, t, n) { - (n.SVGTagMap = { + ((n.SVGTagMap = { altglyph: "altGlyph", altglyphdef: "altGlyphDef", altglyphitem: "altGlyphItem", @@ -6108,7 +6116,7 @@ localName: "xlink", namespaceURI: "http://www.w3.org/2000/xmlns/", }, - }); + })); }, {}, ], @@ -6337,23 +6345,23 @@ 9: [ function (e, t, n) { function o() { - (this.contentHandler = null), + ((this.contentHandler = null), (this._errorHandler = null), (this._treeBuilder = new r()), (this._tokenizer = new i(this._treeBuilder)), - (this._scriptingEnabled = !1); + (this._scriptingEnabled = !1)); } var r = e("./SAXTreeBuilder").SAXTreeBuilder, i = e("../Tokenizer").Tokenizer, s = e("./TreeParser").TreeParser; - (o.prototype.parse = function (e) { + ((o.prototype.parse = function (e) { this._tokenizer.tokenize(e); var t = this._treeBuilder.document; t && new s(this.contentHandler).parse(t); }), (o.prototype.parseFragment = function (e, t) { - this._treeBuilder.setFragmentContext(t), - this._tokenizer.tokenize(e); + (this._treeBuilder.setFragmentContext(t), + this._tokenizer.tokenize(e)); var n = this._treeBuilder.getFragment(); n && new s(this.contentHandler).parse(n); }), @@ -6362,8 +6370,8 @@ return this._scriptingEnabled; }, set: function (e) { - (this._scriptingEnabled = e), - (this._treeBuilder.scriptingEnabled = e); + ((this._scriptingEnabled = e), + (this._treeBuilder.scriptingEnabled = e)); }, }), Object.defineProperty(o.prototype, "errorHandler", { @@ -6371,10 +6379,11 @@ return this._errorHandler; }, set: function (e) { - (this._errorHandler = e), (this._treeBuilder.errorHandler = e); + ((this._errorHandler = e), + (this._treeBuilder.errorHandler = e)); }, }), - (n.SAXParser = o); + (n.SAXParser = o)); }, { "../Tokenizer": 5, "./SAXTreeBuilder": 10, "./TreeParser": 11 }, ], @@ -6390,65 +6399,65 @@ } } function a(e) { - e + (e ? ((this.columnNumber = e.columnNumber), (this.lineNumber = e.lineNumber)) : ((this.columnNumber = -1), (this.lineNumber = -1)), (this.parentNode = null), (this.nextSibling = null), - (this.firstChild = null); + (this.firstChild = null)); } function f(e) { - a.call(this, e), (this.lastChild = null), (this._endLocator = null); + (a.call(this, e), (this.lastChild = null), (this._endLocator = null)); } function l(e) { - f.call(this, e), (this.nodeType = u.DOCUMENT); + (f.call(this, e), (this.nodeType = u.DOCUMENT)); } function c() { - f.call(this, new Locator()), (this.nodeType = u.DOCUMENT_FRAGMENT); + (f.call(this, new Locator()), (this.nodeType = u.DOCUMENT_FRAGMENT)); } function h(e, t, n, r, i, s) { - f.call(this, e), + (f.call(this, e), (this.uri = t), (this.localName = n), (this.qName = r), (this.attributes = i), (this.prefixMappings = s), - (this.nodeType = u.ELEMENT); + (this.nodeType = u.ELEMENT)); } function p(e, t) { - a.call(this, e), (this.data = t), (this.nodeType = u.CHARACTERS); + (a.call(this, e), (this.data = t), (this.nodeType = u.CHARACTERS)); } function d(e, t) { - a.call(this, e), + (a.call(this, e), (this.data = t), - (this.nodeType = u.IGNORABLE_WHITESPACE); + (this.nodeType = u.IGNORABLE_WHITESPACE)); } function v(e, t) { - a.call(this, e), (this.data = t), (this.nodeType = u.COMMENT); + (a.call(this, e), (this.data = t), (this.nodeType = u.COMMENT)); } function m(e) { - f.call(this, e), (this.nodeType = u.CDATA); + (f.call(this, e), (this.nodeType = u.CDATA)); } function g(e) { - f.call(this), (this.name = e), (this.nodeType = u.ENTITY); + (f.call(this), (this.name = e), (this.nodeType = u.ENTITY)); } function y(e) { - a.call(this), (this.name = e), (this.nodeType = u.SKIPPED_ENTITY); + (a.call(this), (this.name = e), (this.nodeType = u.SKIPPED_ENTITY)); } function b(e, t) { - a.call(this), (this.target = e), (this.data = t); + (a.call(this), (this.target = e), (this.data = t)); } function w(e, t, n) { - f.call(this), + (f.call(this), (this.name = e), (this.publicIdentifier = t), (this.systemIdentifier = n), - (this.nodeType = u.DTD); + (this.nodeType = u.DTD)); } var r = e("util"), i = e("../TreeBuilder").TreeBuilder; - r.inherits(s, i), + (r.inherits(s, i), (s.prototype.start = function (e) { this.document = new l(this.tokenizer); }), @@ -6457,7 +6466,7 @@ }), (s.prototype.insertDoctype = function (e, t, n) { var r = new w(this.tokenizer, e, t, n); - (r.endLocator = this.tokenizer), this.document.appendChild(r); + ((r.endLocator = this.tokenizer), this.document.appendChild(r)); }), (s.prototype.createElement = function (e, t, n) { var r = new h(this.tokenizer, e, t, t, n || []); @@ -6508,14 +6517,14 @@ }), (s.prototype.getFragment = function () { var e = new c(); - return this.reparentChildren(this.openElements.rootNode, e), e; + return (this.reparentChildren(this.openElements.rootNode, e), e); }), (s.prototype.addAttributesToElement = function (e, t) { for (var n = 0; n < t.length; n++) { var r = t[n]; o(e, r.nodeName) || e.attributes.push(r); } - }); + })); var u = { CDATA: 1, CHARACTERS: 2, @@ -6529,7 +6538,7 @@ PROCESSING_INSTRUCTION: 10, SKIPPED_ENTITY: 11, }; - (a.prototype.visit = function (e) { + ((a.prototype.visit = function (e) { throw new Error("Not Implemented"); }), (a.prototype.revisit = function (e) { @@ -6545,21 +6554,21 @@ t = this.parentNode.firstChild; for (;;) { if (this == t) return e; - (e = t), (t = t.nextSibling); + ((e = t), (t = t.nextSibling)); } }, }), (f.prototype = Object.create(a.prototype)), (f.prototype.insertBefore = function (e, t) { if (!t) return this.appendChild(e); - e.detach(), (e.parentNode = this); + (e.detach(), (e.parentNode = this)); if (this.firstChild == t) - (e.nextSibling = t), (this.firstChild = e); + ((e.nextSibling = t), (this.firstChild = e)); else { var n = this.firstChild, r = this.firstChild.nextSibling; - while (r != t) (n = r), (r = r.nextSibling); - (n.nextSibling = e), (e.nextSibling = r); + while (r != t) ((n = r), (r = r.nextSibling)); + ((n.nextSibling = e), (e.nextSibling = r)); } return e; }), @@ -6587,26 +6596,26 @@ var t = e.firstChild; if (!t) return; var n = e; - this.firstChild + (this.firstChild ? (this.lastChild.nextSibling = t) : (this.firstChild = t), - (this.lastChild = n.lastChild); + (this.lastChild = n.lastChild)); do t.parentNode = this; while ((t = t.nextSibling)); - (n.firstChild = null), (n.lastChild = null); + ((n.firstChild = null), (n.lastChild = null)); }), (f.prototype.removeChild = function (e) { if (this.firstChild == e) - (this.firstChild = e.nextSibling), - this.lastChild == e && (this.lastChild = null); + ((this.firstChild = e.nextSibling), + this.lastChild == e && (this.lastChild = null)); else { var t = this.firstChild, n = this.firstChild.nextSibling; - while (n != e) (t = n), (n = n.nextSibling); - (t.nextSibling = e.nextSibling), - this.lastChild == e && (this.lastChild = t); + while (n != e) ((t = n), (n = n.nextSibling)); + ((t.nextSibling = e.nextSibling), + this.lastChild == e && (this.lastChild = t)); } - return (e.parentNode = null), e; + return ((e.parentNode = null), e); }), Object.defineProperty(f.prototype, "endLocator", { get: function () { @@ -6700,20 +6709,20 @@ (w.prototype.revisit = function (e) { e.endDTD(); }), - (n.SAXTreeBuilder = s); + (n.SAXTreeBuilder = s)); }, { "../TreeBuilder": 6, util: 20 }, ], 11: [ function (e, t, n) { function r(e, t) { - this.contentHandler, this.lexicalHandler, this.locatorDelegate; + (this.contentHandler, this.lexicalHandler, this.locatorDelegate); if (!e) throw new IllegalArgumentException("contentHandler was null."); - (this.contentHandler = e), - t ? (this.lexicalHandler = t) : (this.lexicalHandler = new i()); + ((this.contentHandler = e), + t ? (this.lexicalHandler = t) : (this.lexicalHandler = new i())); } function i() {} - (r.prototype.parse = function (e) { + ((r.prototype.parse = function (e) { this.contentHandler.documentLocator = this; var t = e, n; @@ -6735,59 +6744,62 @@ } }), (r.prototype.characters = function (e, t, n, r) { - (this.locatorDelegate = r), this.contentHandler.characters(e, t, n); + ((this.locatorDelegate = r), + this.contentHandler.characters(e, t, n)); }), (r.prototype.endDocument = function (e) { - (this.locatorDelegate = e), this.contentHandler.endDocument(); + ((this.locatorDelegate = e), this.contentHandler.endDocument()); }), (r.prototype.endElement = function (e, t, n, r) { - (this.locatorDelegate = r), this.contentHandler.endElement(e, t, n); + ((this.locatorDelegate = r), + this.contentHandler.endElement(e, t, n)); }), (r.prototype.endPrefixMapping = function (e, t) { - (this.locatorDelegate = t), this.contentHandler.endPrefixMapping(e); + ((this.locatorDelegate = t), + this.contentHandler.endPrefixMapping(e)); }), (r.prototype.ignorableWhitespace = function (e, t, n, r) { - (this.locatorDelegate = r), - this.contentHandler.ignorableWhitespace(e, t, n); + ((this.locatorDelegate = r), + this.contentHandler.ignorableWhitespace(e, t, n)); }), (r.prototype.processingInstruction = function (e, t, n) { - (this.locatorDelegate = n), - this.contentHandler.processingInstruction(e, t); + ((this.locatorDelegate = n), + this.contentHandler.processingInstruction(e, t)); }), (r.prototype.skippedEntity = function (e, t) { - (this.locatorDelegate = t), this.contentHandler.skippedEntity(e); + ((this.locatorDelegate = t), this.contentHandler.skippedEntity(e)); }), (r.prototype.startDocument = function (e) { - (this.locatorDelegate = e), this.contentHandler.startDocument(); + ((this.locatorDelegate = e), this.contentHandler.startDocument()); }), (r.prototype.startElement = function (e, t, n, r, i) { - (this.locatorDelegate = i), - this.contentHandler.startElement(e, t, n, r); + ((this.locatorDelegate = i), + this.contentHandler.startElement(e, t, n, r)); }), (r.prototype.startPrefixMapping = function (e, t, n) { - (this.locatorDelegate = n), - this.contentHandler.startPrefixMapping(e, t); + ((this.locatorDelegate = n), + this.contentHandler.startPrefixMapping(e, t)); }), (r.prototype.comment = function (e, t, n, r) { - (this.locatorDelegate = r), this.lexicalHandler.comment(e, t, n); + ((this.locatorDelegate = r), this.lexicalHandler.comment(e, t, n)); }), (r.prototype.endCDATA = function (e) { - (this.locatorDelegate = e), this.lexicalHandler.endCDATA(); + ((this.locatorDelegate = e), this.lexicalHandler.endCDATA()); }), (r.prototype.endDTD = function (e) { - (this.locatorDelegate = e), this.lexicalHandler.endDTD(); + ((this.locatorDelegate = e), this.lexicalHandler.endDTD()); }), (r.prototype.endEntity = function (e, t) { - (this.locatorDelegate = t), this.lexicalHandler.endEntity(e); + ((this.locatorDelegate = t), this.lexicalHandler.endEntity(e)); }), (r.prototype.startCDATA = function (e) { - (this.locatorDelegate = e), this.lexicalHandler.startCDATA(); + ((this.locatorDelegate = e), this.lexicalHandler.startCDATA()); }), (r.prototype.startDTD = function (e, t, n, r) { - (this.locatorDelegate = r), this.lexicalHandler.startDTD(e, t, n); + ((this.locatorDelegate = r), this.lexicalHandler.startDTD(e, t, n)); }), (r.prototype.startEntity = function (e, t) { - (this.locatorDelegate = t), this.lexicalHandler.startEntity(e); + ((this.locatorDelegate = t), this.lexicalHandler.startEntity(e)); }), Object.defineProperty(r.prototype, "columnNumber", { get: function () { @@ -6810,7 +6822,7 @@ (i.prototype.startCDATA = function () {}), (i.prototype.startDTD = function () {}), (i.prototype.startEntity = function () {}), - (n.TreeParser = r); + (n.TreeParser = r)); }, {}, ], @@ -9123,7 +9135,7 @@ return !1; } if (n.length != s.length) return !1; - n.sort(), s.sort(); + (n.sort(), s.sort()); for (u = n.length - 1; u >= 0; u--) if (n[u] != s[u]) return !1; for (u = n.length - 1; u >= 0; u--) { o = n[u]; @@ -9150,23 +9162,23 @@ } catch (o) { s = o; } - (i = (n && n.name ? " (" + n.name + ")." : ".") + (i ? " " + i : ".")), + ((i = (n && n.name ? " (" + n.name + ")." : ".") + (i ? " " + i : ".")), e && !s && l(s, n, "Missing expected exception" + i), - !e && v(s, n) && l(s, n, "Got unwanted exception" + i); + !e && v(s, n) && l(s, n, "Got unwanted exception" + i)); if ((e && s && n && !v(s, n)) || (!e && s)) throw s; } var r = e("util/"), i = Array.prototype.slice, s = Object.prototype.hasOwnProperty, o = (t.exports = c); - (o.AssertionError = function (t) { - (this.name = "AssertionError"), + ((o.AssertionError = function (t) { + ((this.name = "AssertionError"), (this.actual = t.actual), (this.expected = t.expected), (this.operator = t.operator), t.message ? ((this.message = t.message), (this.generatedMessage = !1)) - : ((this.message = f(this)), (this.generatedMessage = !0)); + : ((this.message = f(this)), (this.generatedMessage = !0))); var n = t.stackStartFunction || l; if (Error.captureStackTrace) Error.captureStackTrace(this, n); else { @@ -9212,7 +9224,7 @@ }), (o.ifError = function (e) { if (e) throw e; - }); + })); var g = Object.keys || function (e) { @@ -9281,7 +9293,7 @@ (!t.constructor || t.constructor.prototype !== t) ) { var i = t.inspect(r, e); - return S(i) || (i = c(e, i, r)), i; + return (S(i) || (i = c(e, i, r)), i); } var s = h(e, t); if (s) return s; @@ -9315,9 +9327,9 @@ var w = t.name ? ": " + t.name : ""; f = " [Function" + w + "]"; } - N(t) && (f = " " + RegExp.prototype.toString.call(t)), + (N(t) && (f = " " + RegExp.prototype.toString.call(t)), k(t) && (f = " " + Date.prototype.toUTCString.call(t)), - L(t) && (f = " " + p(t)); + L(t) && (f = " " + p(t))); if (o.length !== 0 || (!!y && t.length != 0)) { if (r < 0) return N(t) @@ -9371,7 +9383,7 @@ } function v(e, t, n, r, i, s) { var o, u, a; - (a = Object.getOwnPropertyDescriptor(t, i) || { value: t[i] }), + ((a = Object.getOwnPropertyDescriptor(t, i) || { value: t[i] }), a.get ? a.set ? (u = e.stylize("[Getter/Setter]", "special")) @@ -9400,10 +9412,10 @@ return " " + e; }) .join("\n")))) - : (u = e.stylize("[Circular]", "special"))); + : (u = e.stylize("[Circular]", "special")))); if (T(o)) { if (s && i.match(/^\d+$/)) return u; - (o = JSON.stringify("" + i)), + ((o = JSON.stringify("" + i)), o.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) ? ((o = o.substr(1, o.length - 2)), (o = e.stylize(o, "name"))) @@ -9411,7 +9423,7 @@ .replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'")), - (o = e.stylize(o, "string"))); + (o = e.stylize(o, "string")))); } return o + ": " + u; } @@ -9501,7 +9513,7 @@ return Object.prototype.hasOwnProperty.call(e, t); } var i = /%[sdj%]/g; - (n.format = function (e) { + ((n.format = function (e) { if (!S(e)) { var t = []; for (var n = 0; n < arguments.length; n++) @@ -9537,10 +9549,10 @@ function o() { if (!s) { if (t.throwDeprecation) throw new Error(i); - t.traceDeprecation + (t.traceDeprecation ? console.trace(i) : console.error(i), - (s = !0); + (s = !0)); } return e.apply(this, arguments); } @@ -9551,11 +9563,11 @@ if (t.noDeprecation === !0) return e; var s = !1; return o; - }); + })); var s = {}, o; - (n.debuglog = function (e) { - T(o) && (o = t.env.NODE_DEBUG || ""), (e = e.toUpperCase()); + ((n.debuglog = function (e) { + (T(o) && (o = t.env.NODE_DEBUG || ""), (e = e.toUpperCase())); if (!s[e]) if (new RegExp("\\b" + e + "\\b", "i").test(o)) { var r = t.pid; @@ -9606,7 +9618,7 @@ (n.isError = L), (n.isFunction = A), (n.isPrimitive = O), - (n.isBuffer = e("./support/isBuffer")); + (n.isBuffer = e("./support/isBuffer"))); var D = [ "Jan", "Feb", @@ -9621,7 +9633,7 @@ "Nov", "Dec", ]; - (n.log = function () { + ((n.log = function () { console.log("%s - %s", P(), n.format.apply(n, arguments)); }), (n.inherits = e("inherits")), @@ -9631,7 +9643,7 @@ r = n.length; while (r--) e[n[r]] = t[n[r]]; return e; - }); + })); }).call( this, e( @@ -9653,8 +9665,8 @@ 16: [ function (e, t, n) { function r() { - (this._events = this._events || {}), - (this._maxListeners = this._maxListeners || undefined); + ((this._events = this._events || {}), + (this._maxListeners = this._maxListeners || undefined)); } function i(e) { return typeof e == "function"; @@ -9668,7 +9680,7 @@ function u(e) { return e === void 0; } - (t.exports = r), + ((t.exports = r), (r.EventEmitter = r), (r.prototype._events = undefined), (r.prototype._maxListeners = undefined), @@ -9676,7 +9688,7 @@ (r.prototype.setMaxListeners = function (e) { if (!s(e) || e < 0 || isNaN(e)) throw TypeError("n must be a positive number"); - return (this._maxListeners = e), this; + return ((this._maxListeners = e), this); }), (r.prototype.emit = function (e) { var t, n, r, s, a, f; @@ -9687,10 +9699,10 @@ (o(this._events.error) && !this._events.error.length) ) throw ( - ((t = arguments[1]), + (t = arguments[1]), t instanceof Error ? t - : TypeError('Uncaught, unspecified "error" event.')) + : TypeError('Uncaught, unspecified "error" event.') ); n = this._events[e]; if (u(n)) return !1; @@ -9706,14 +9718,14 @@ n.call(this, arguments[1], arguments[2]); break; default: - (r = arguments.length), (s = new Array(r - 1)); + ((r = arguments.length), (s = new Array(r - 1))); for (a = 1; a < r; a++) s[a - 1] = arguments[a]; n.apply(this, s); } else if (o(n)) { - (r = arguments.length), (s = new Array(r - 1)); + ((r = arguments.length), (s = new Array(r - 1))); for (a = 1; a < r; a++) s[a - 1] = arguments[a]; - (f = n.slice()), (r = f.length); + ((f = n.slice()), (r = f.length)); for (a = 0; a < r; a++) f[a].apply(this, s); } return !0; @@ -9721,17 +9733,17 @@ (r.prototype.addListener = function (e, t) { var n; if (!i(t)) throw TypeError("listener must be a function"); - this._events || (this._events = {}), + (this._events || (this._events = {}), this._events.newListener && this.emit("newListener", e, i(t.listener) ? t.listener : t), this._events[e] ? o(this._events[e]) ? this._events[e].push(t) : (this._events[e] = [this._events[e], t]) - : (this._events[e] = t); + : (this._events[e] = t)); if (o(this._events[e]) && !this._events[e].warned) { var n; - u(this._maxListeners) + (u(this._maxListeners) ? (n = r.defaultMaxListeners) : (n = this._maxListeners), n && @@ -9742,29 +9754,29 @@ "(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", this._events[e].length, ), - console.trace()); + console.trace())); } return this; }), (r.prototype.on = r.prototype.addListener), (r.prototype.once = function (e, t) { function r() { - this.removeListener(e, r), - n || ((n = !0), t.apply(this, arguments)); + (this.removeListener(e, r), + n || ((n = !0), t.apply(this, arguments))); } if (!i(t)) throw TypeError("listener must be a function"); var n = !1; - return (r.listener = t), this.on(e, r), this; + return ((r.listener = t), this.on(e, r), this); }), (r.prototype.removeListener = function (e, t) { var n, r, s, u; if (!i(t)) throw TypeError("listener must be a function"); if (!this._events || !this._events[e]) return this; - (n = this._events[e]), (s = n.length), (r = -1); + ((n = this._events[e]), (s = n.length), (r = -1)); if (n === t || (i(n.listener) && n.listener === t)) - delete this._events[e], + (delete this._events[e], this._events.removeListener && - this.emit("removeListener", e, t); + this.emit("removeListener", e, t)); else if (o(n)) { for (u = s; u-- > 0; ) if (n[u] === t || (n[u].listener && n[u].listener === t)) { @@ -9772,11 +9784,11 @@ break; } if (r < 0) return this; - n.length === 1 + (n.length === 1 ? ((n.length = 0), delete this._events[e]) : n.splice(r, 1), this._events.removeListener && - this.emit("removeListener", e, t); + this.emit("removeListener", e, t)); } return this; }), @@ -9804,7 +9816,7 @@ n = this._events[e]; if (i(n)) this.removeListener(e, n); else while (n.length) this.removeListener(e, n[n.length - 1]); - return delete this._events[e], this; + return (delete this._events[e], this); }), (r.prototype.listeners = function (e) { var t; @@ -9827,7 +9839,7 @@ : (n = e._events[t].length), n ); - }); + })); }, {}, ], @@ -9835,7 +9847,7 @@ function (e, t, n) { typeof Object.create == "function" ? (t.exports = function (t, n) { - (t.super_ = n), + ((t.super_ = n), (t.prototype = Object.create(n.prototype, { constructor: { value: t, @@ -9843,14 +9855,14 @@ writable: !0, configurable: !0, }, - })); + }))); }) : (t.exports = function (t, n) { t.super_ = n; var r = function () {}; - (r.prototype = n.prototype), + ((r.prototype = n.prototype), (t.prototype = new r()), - (t.prototype.constructor = t); + (t.prototype.constructor = t)); }); }, {}, @@ -9859,7 +9871,7 @@ function (e, t, n) { function i() {} var r = (t.exports = {}); - (r.nextTick = (function () { + ((r.nextTick = (function () { var e = typeof window != "undefined" && window.setImmediate, t = typeof window != "undefined" && @@ -9890,7 +9902,7 @@ !0, ), function (t) { - n.push(t), window.postMessage("process-tick", "*"); + (n.push(t), window.postMessage("process-tick", "*")); } ); } @@ -9914,7 +9926,7 @@ }), (r.chdir = function (e) { throw new Error("process.chdir is not supported"); - }); + })); }, {}, ], @@ -9951,11 +9963,11 @@ "non-html-root": "info", }, a = (t.Worker = function (e) { - s.call(this, e), this.setTimeout(400), (this.context = null); + (s.call(this, e), this.setTimeout(400), (this.context = null)); }); - r.inherits(a, s), + (r.inherits(a, s), function () { - (this.setOptions = function (e) { + ((this.setOptions = function (e) { this.context = e.context; }), (this.onUpdate = function () { @@ -9964,7 +9976,7 @@ var t = new o(), n = [], r = function () {}; - (t.contentHandler = { + ((t.contentHandler = { startDocument: r, endDocument: r, startElement: r, @@ -9982,15 +9994,15 @@ }, }), this.context ? t.parseFragment(e, this.context) : t.parse(e), - this.sender.emit("error", n); - }); - }.call(a.prototype); + this.sender.emit("error", n)); + })); + }.call(a.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -10063,35 +10075,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -10104,7 +10116,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -10131,7 +10143,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -10233,15 +10245,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -10251,8 +10263,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -10274,9 +10286,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -10285,7 +10297,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -10312,10 +10324,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -10338,16 +10350,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -10359,7 +10371,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -10369,7 +10381,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -10388,8 +10400,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -10434,4 +10446,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/ace/worker-javascript.js b/web/static/ace/worker-javascript.js index f84549384..042437a0c 100644 --- a/web/static/ace/worker-javascript.js +++ b/web/static/ace/worker-javascript.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,7 +160,7 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -168,10 +168,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -316,11 +316,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -329,7 +329,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -340,11 +340,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -366,9 +366,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -389,18 +389,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -417,7 +417,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -426,7 +426,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -465,18 +465,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -495,7 +495,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -514,16 +514,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -541,7 +541,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -552,19 +552,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -581,7 +581,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -597,7 +597,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -625,8 +625,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -707,10 +707,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -753,8 +753,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -789,7 +789,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -813,7 +813,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -822,12 +822,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -853,13 +853,13 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -872,10 +872,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -942,18 +942,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -964,28 +964,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,7 +1025,7 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/javascript/jshint", [], function (e, t, n) { @@ -1064,8 +1064,8 @@ "/node_modules/browserify/node_modules/events/events.js": [ function (e, t, n) { function r() { - (this._events = this._events || {}), - (this._maxListeners = this._maxListeners || undefined); + ((this._events = this._events || {}), + (this._maxListeners = this._maxListeners || undefined)); } function i(e) { return typeof e == "function"; @@ -1079,7 +1079,7 @@ function u(e) { return e === void 0; } - (t.exports = r), + ((t.exports = r), (r.EventEmitter = r), (r.prototype._events = undefined), (r.prototype._maxListeners = undefined), @@ -1087,7 +1087,7 @@ (r.prototype.setMaxListeners = function (e) { if (!s(e) || e < 0 || isNaN(e)) throw TypeError("n must be a positive number"); - return (this._maxListeners = e), this; + return ((this._maxListeners = e), this); }), (r.prototype.emit = function (e) { var t, n, r, s, a, f; @@ -1098,10 +1098,10 @@ (o(this._events.error) && !this._events.error.length) ) throw ( - ((t = arguments[1]), + (t = arguments[1]), t instanceof Error ? t - : TypeError('Uncaught, unspecified "error" event.')) + : TypeError('Uncaught, unspecified "error" event.') ); n = this._events[e]; if (u(n)) return !1; @@ -1117,14 +1117,14 @@ n.call(this, arguments[1], arguments[2]); break; default: - (r = arguments.length), (s = new Array(r - 1)); + ((r = arguments.length), (s = new Array(r - 1))); for (a = 1; a < r; a++) s[a - 1] = arguments[a]; n.apply(this, s); } else if (o(n)) { - (r = arguments.length), (s = new Array(r - 1)); + ((r = arguments.length), (s = new Array(r - 1))); for (a = 1; a < r; a++) s[a - 1] = arguments[a]; - (f = n.slice()), (r = f.length); + ((f = n.slice()), (r = f.length)); for (a = 0; a < r; a++) f[a].apply(this, s); } return !0; @@ -1132,17 +1132,17 @@ (r.prototype.addListener = function (e, t) { var n; if (!i(t)) throw TypeError("listener must be a function"); - this._events || (this._events = {}), + (this._events || (this._events = {}), this._events.newListener && this.emit("newListener", e, i(t.listener) ? t.listener : t), this._events[e] ? o(this._events[e]) ? this._events[e].push(t) : (this._events[e] = [this._events[e], t]) - : (this._events[e] = t); + : (this._events[e] = t)); if (o(this._events[e]) && !this._events[e].warned) { var n; - u(this._maxListeners) + (u(this._maxListeners) ? (n = r.defaultMaxListeners) : (n = this._maxListeners), n && @@ -1153,29 +1153,29 @@ "(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", this._events[e].length, ), - typeof console.trace == "function" && console.trace()); + typeof console.trace == "function" && console.trace())); } return this; }), (r.prototype.on = r.prototype.addListener), (r.prototype.once = function (e, t) { function r() { - this.removeListener(e, r), - n || ((n = !0), t.apply(this, arguments)); + (this.removeListener(e, r), + n || ((n = !0), t.apply(this, arguments))); } if (!i(t)) throw TypeError("listener must be a function"); var n = !1; - return (r.listener = t), this.on(e, r), this; + return ((r.listener = t), this.on(e, r), this); }), (r.prototype.removeListener = function (e, t) { var n, r, s, u; if (!i(t)) throw TypeError("listener must be a function"); if (!this._events || !this._events[e]) return this; - (n = this._events[e]), (s = n.length), (r = -1); + ((n = this._events[e]), (s = n.length), (r = -1)); if (n === t || (i(n.listener) && n.listener === t)) - delete this._events[e], + (delete this._events[e], this._events.removeListener && - this.emit("removeListener", e, t); + this.emit("removeListener", e, t)); else if (o(n)) { for (u = s; u-- > 0; ) if (n[u] === t || (n[u].listener && n[u].listener === t)) { @@ -1183,11 +1183,11 @@ break; } if (r < 0) return this; - n.length === 1 + (n.length === 1 ? ((n.length = 0), delete this._events[e]) : n.splice(r, 1), this._events.removeListener && - this.emit("removeListener", e, t); + this.emit("removeListener", e, t)); } return this; }), @@ -1215,7 +1215,7 @@ n = this._events[e]; if (i(n)) this.removeListener(e, n); else while (n.length) this.removeListener(e, n[n.length - 1]); - return delete this._events[e], this; + return (delete this._events[e], this); }), (r.prototype.listeners = function (e) { var t; @@ -1238,7 +1238,7 @@ : (n = e._events[t].length), n ); - }); + })); }, {}, ], @@ -1395,7 +1395,7 @@ f = En(p ? {} : e); if (!t) return Ht(f, e); } - u || (u = []), a || (a = []); + (u || (u = []), a || (a = [])); var v = u.length; while (v--) if (u[v] == e) return a[v]; return ( @@ -1448,12 +1448,12 @@ l = Xn(t), c = u, h = u; - f || + (f || ((c = rt.call(e)), c == o ? (c = d) : c != d && (f = Zn(e))), l || ((h = rt.call(t)), - h == o ? (h = d) : h != d && (l = Zn(t))); + h == o ? (h = d) : h != d && (l = Zn(t)))); var p = c == d, v = h == d, m = c == h; @@ -1472,12 +1472,12 @@ ); } if (!m) return !1; - s || (s = []), a || (a = []); + (s || (s = []), a || (a = [])); var b = s.length; while (b--) if (s[b] == e) return a[b] == t; - s.push(e), a.push(t); + (s.push(e), a.push(t)); var w = (f ? pn : vn)(e, t, n, r, i, s, a); - return s.pop(), a.pop(), w; + return (s.pop(), a.pop(), w); } function $t(e, t, n, i, s) { var o = -1, @@ -1492,8 +1492,8 @@ c = n[o]; if (a && i[o]) var h = l !== r || f in e; else - (h = s ? s(l, c, f) : r), - h === r && (h = Xt(c, l, s, !0)); + ((h = s ? s(l, c, f) : r), + h === r && (h = Xt(c, l, s, !0))); if (!h) return !1; } return !0; @@ -1514,7 +1514,7 @@ } var o = Array(n), u = Array(n); - while (n--) (s = e[t[n]]), (o[n] = s), (u[n] = kn(s)); + while (n--) ((s = e[t[n]]), (o[n] = s), (u[n] = kn(s))); return function (e) { return e != null && $t(On(e), t, o, u); }; @@ -1532,7 +1532,7 @@ if ((n || !i) && !(u in o)) { o = e.length == 1 ? o : Wt(o, en(e, 0, -1)); if (o == null) return !1; - (u = Pn(e)), (o = On(o)); + ((u = Pn(e)), (o = On(o))); } return o[u] === t ? t !== r || u in o @@ -1551,17 +1551,17 @@ At(u || t, function (a, f) { u && ((f = a), (a = t[f])); if (Y(a)) - i || (i = []), + (i || (i = []), s || (s = []), - Gt(e, t, f, Qt, n, i, s); + Gt(e, t, f, Qt, n, i, s)); else { var l = e[f], c = n ? n(l, a, f, e, t) : r, h = c === r; - h && (c = a), + (h && (c = a), (o || c !== r) && (h || (c === c ? c !== l : l === l)) && - (e[f] = c); + (e[f] = c)); } }), e @@ -1578,7 +1578,7 @@ var l = e[n], c = s ? s(l, f, n, e, t) : r, h = c === r; - h && + (h && ((c = f), Cn(f.length) && (Xn(f) || Zn(f)) ? (c = Xn(l) ? l : yn(l) ? Lt(l) : []) @@ -1586,7 +1586,7 @@ ? (c = Wn(l) ? er(l) : Gn(l) ? l : {}) : (h = !1)), o.push(f), - u.push(c); + u.push(c)); if (h) e[n] = i(c, f, s, o, u); else if (c === c ? c !== l : l === l) e[n] = c; } @@ -1607,12 +1607,12 @@ function en(e, t, n) { var i = -1, s = e.length; - (t = t == null ? 0 : +t || 0), + ((t = t == null ? 0 : +t || 0), t < 0 && (t = -t > s ? 0 : s + t), (n = n === r || n > s ? s : +n || 0), n < 0 && (n += s), (s = t > n ? 0 : (n - t) >>> 0), - (t >>>= 0); + (t >>>= 0)); var o = Array(s); while (++i < s) o[i] = e[i + t]; return o; @@ -1621,7 +1621,7 @@ var n; return ( It(e, function (e, r, i) { - return (n = t(e, r, i)), !n; + return ((n = t(e, r, i)), !n); }), !!n ); @@ -1700,13 +1700,13 @@ s = i > 2 && n[i - 2], o = i > 2 && n[2], u = i > 1 && n[i - 1]; - typeof s == "function" + (typeof s == "function" ? ((s = on(s, u, 5)), (i -= 2)) : ((s = typeof u == "function" ? u : null), (i -= s ? 1 : 0)), o && Tn(n[0], n[1], o) && - ((s = i < 3 ? null : s), (i = 1)); + ((s = i < 3 ? null : s), (i = 1))); while (++r < i) { var a = n[r]; a && e(t, a, s); @@ -1760,13 +1760,14 @@ while (c && ++a < f) { var h = e[a], p = t[a]; - (c = r), i && (c = s ? i(p, h, a) : i(h, p, a)); + ((c = r), i && (c = s ? i(p, h, a) : i(h, p, a))); if (c === r) if (s) { var d = l; while (d--) { - (p = t[d]), - (c = (h && h === p) || n(h, p, i, s, o, u)); + ((p = t[d]), + (c = + (h && h === p) || n(h, p, i, s, o, u))); if (c) break; } } else c = (h && h === p) || n(h, p, i, s, o, u); @@ -1806,10 +1807,10 @@ if (v) { var m = e[d], g = t[d]; - (v = r), + ((v = r), i && (v = s ? i(g, m, d) : i(m, g, d)), v === r && - (v = (m && m === g) || n(m, g, i, s, o, u)); + (v = (m && m === g) || n(m, g, i, s, o, u))); } if (!v) return !1; h || (h = d == "constructor"); @@ -1834,11 +1835,11 @@ } function mn(e, t, n) { var r = Ct.callback || ar; - return (r = r === ar ? jt : r), n ? r(e, t, n) : r; + return ((r = r === ar ? jt : r), n ? r(e, t, n) : r); } function gn(e, t, n) { var r = Ct.indexOf || Dn; - return (r = r === Dn ? J : r), e ? r(e, t, n) : r; + return ((r = r === Dn ? J : r), e ? r(e, t, n) : r); } function wn(e) { var t = e.length, @@ -2047,7 +2048,7 @@ var o = Array(t + 1); r = -1; while (++r < t) o[r] = n[r]; - return (o[t] = s), e.apply(this, o); + return ((o[t] = s), e.apply(this, o)); } ); } @@ -2132,10 +2133,10 @@ return nn(e, rr(e)); } function ur(e) { - return (e = Q(e)), e && D.test(e) ? e.replace(_, "\\$&") : e; + return ((e = Q(e)), e && D.test(e) ? e.replace(_, "\\$&") : e); } function ar(e, t, n) { - return n && Tn(e, t, n) && (t = null), jt(e, t); + return (n && Tn(e, t, n) && (t = null), jt(e, t)); } function fr(e) { return function () { @@ -2184,7 +2185,16 @@ H = /\w*$/, B = /^\[object .+?Constructor\]$/, j = {}; - (j[w] = j[E] = j[S] = j[x] = j[T] = j[N] = j[C] = j[k] = j[L] = !0), + ((j[w] = + j[E] = + j[S] = + j[x] = + j[T] = + j[N] = + j[C] = + j[k] = + j[L] = + !0), (j[o] = j[u] = j[b] = @@ -2199,9 +2209,9 @@ j[m] = j[g] = j[y] = - !1); + !1)); var F = {}; - (F[o] = + ((F[o] = F[u] = F[b] = F[a] = @@ -2220,7 +2230,7 @@ F[k] = F[L] = !0), - (F[l] = F[c] = F[h] = F[m] = F[y] = !1); + (F[l] = F[c] = F[h] = F[m] = F[y] = !1)); var I = { function: !0, object: !0 }, q = I[typeof n] && n && !n.nodeType && n, R = I[typeof t] && t && !t.nodeType && t, @@ -2287,10 +2297,10 @@ r = []; t.prototype = { valueOf: e, y: e }; for (var i in new t()) r.push(i); - (kt.funcDecomp = /\bthis\b/.test(function () { + ((kt.funcDecomp = /\bthis\b/.test(function () { return this; })), - (kt.funcNames = typeof Function.name == "string"); + (kt.funcNames = typeof Function.name == "string")); try { kt.nonEnumArgs = !ht.call(arguments, 1); } catch (s) { @@ -2369,7 +2379,7 @@ } : An, sr = an(Qt); - (Ct.assign = tr), + ((Ct.assign = tr), (Ct.callback = ar), (Ct.constant = fr), (Ct.forEach = Fn), @@ -2414,7 +2424,7 @@ ? X ? ((R.exports = Ct)._ = Ct) : (q._ = Ct) - : (V._ = Ct); + : (V._ = Ct)); }).call(this); }).call( this, @@ -2495,7 +2505,7 @@ } } function H() { - P(), + (P(), !f.option.esversion && !f.option.moz && (f.option.es3 @@ -2539,7 +2549,7 @@ f.option.strict !== !1 && (f.option.strict = "global"), f.option.yui && D(S, s.yui), - f.option.mocha && D(S, s.mocha); + f.option.mocha && D(S, s.mocha)); } function B(e, t, n) { var r = Math.floor((t / f.lines.length) * 100), @@ -2619,7 +2629,7 @@ ) || [], i = {}; if (e.type === "globals") { - t.forEach(function (n, r) { + (t.forEach(function (n, r) { n = n.split(":"); var s = (n[0] || "").trim(), o = (n[1] || "").trim(); @@ -2635,10 +2645,10 @@ delete S[s]) : (i[s] = o === "true"); }), - D(S, i); + D(S, i)); for (var s in i) r.has(i, s) && (n[s] = e); } - e.type === "exported" && + (e.type === "exported" && t.forEach(function (n, r) { if (!n.length) { if (r > 0 && r === t.length - 1) return; @@ -2652,13 +2662,13 @@ t.forEach(function (e) { var t = e.charAt(0), n = e.charAt(e.length - 1); - t === n && + (t === n && (t === '"' || t === "'") && (e = e .substr(1, e.length - 2) .replace('\\"', '"')), - (E[e] = !1); - })); + (E[e] = !1)); + }))); var o = [ "maxstatements", "maxparams", @@ -2669,7 +2679,7 @@ "indent", ]; if (e.type === "jshint" || e.type === "jslint") - t.forEach(function (t) { + (t.forEach(function (t) { t = t.split(":"); var n = (t[0] || "").trim(), i = (t[1] || "").trim(); @@ -2765,7 +2775,7 @@ if (n === "ignore") { switch (i) { case "line": - (f.ignoredLines[e.line] = !0), j(); + ((f.ignoredLines[e.line] = !0), j()); break; default: q("E002", e); @@ -2796,8 +2806,8 @@ if (r.has(s, n)) { switch (i) { case "true": - (f.option.moz = !1), - (f.option.esversion = s[n]); + ((f.option.moz = !1), + (f.option.esversion = s[n])); break; case "false": f.option.moz || (f.option.esversion = 5); @@ -2813,12 +2823,12 @@ f.inES5(!0) && F("I003"); case "3": case "6": - (f.option.moz = !1), - (f.option.esversion = +i); + ((f.option.moz = !1), + (f.option.esversion = +i)); break; case "2015": - (f.option.moz = !1), - (f.option.esversion = 6); + ((f.option.moz = !1), + (f.option.esversion = 6)); break; default: q("E002", e); @@ -2834,19 +2844,19 @@ } var a; if (i === "true" || i === "false") { - e.type === "jslint" + (e.type === "jslint" ? ((a = c.renamed[n] || n), (f.option[a] = i === "true"), c.inverted[a] !== undefined && (f.option[a] = !f.option[a])) : (f.option[n] = i === "true"), n === "newcap" && - (f.option["(explicitNewcap)"] = !0); + (f.option["(explicitNewcap)"] = !0)); return; } q("E002", e); }), - H(); + H()); } function W(e) { var t = e || 0, @@ -2854,7 +2864,7 @@ r; if (t < n) return y[t]; while (n <= t) - (r = y[n]), r || (r = y[n] = b.token()), (n += 1); + ((r = y[n]), r || (r = y[n] = b.token()), (n += 1)); return !r && f.tokens.next.id === "(end)" ? f.tokens.next : r; } function X() { @@ -2879,7 +2889,7 @@ f.tokens.next.id === "++") && F("W007"); } - e && + (e && f.tokens.next.id !== e && (t ? f.tokens.next.id === "(end)" @@ -2896,10 +2906,10 @@ f.tokens.next.value !== e) && F("W116", f.tokens.next, e, f.tokens.next.value)), (f.tokens.prev = f.tokens.curr), - (f.tokens.curr = f.tokens.next); + (f.tokens.curr = f.tokens.next)); for (;;) { - (f.tokens.next = y.shift() || b.token()), - f.tokens.next || B("E041", f.tokens.curr.line); + ((f.tokens.next = y.shift() || b.token()), + f.tokens.next || B("E041", f.tokens.curr.line)); if ( f.tokens.next.id === "(end)" || f.tokens.next.id === "(error)" @@ -2933,7 +2943,7 @@ i = !1, s = !1, o = !1; - f.nameStack.push(), + (f.nameStack.push(), !t && f.tokens.next.value === "let" && W(0).value === "(" && @@ -2945,17 +2955,17 @@ V("("), f.tokens.prev.fud(), V(")")), - f.tokens.next.id === "(end)" && q("E006", f.tokens.curr); + f.tokens.next.id === "(end)" && q("E006", f.tokens.curr)); var u = f.option.asi && f.tokens.prev.line !== G(f.tokens.curr) && r.contains(["]", ")"], f.tokens.prev.id) && r.contains(["[", "("], f.tokens.curr.id); - u && F("W014", f.tokens.curr, f.tokens.curr.id), + (u && F("W014", f.tokens.curr, f.tokens.curr.id), V(), t && ((f.funct["(verb)"] = f.tokens.curr.value), - (f.tokens.curr.beginsStmt = !0)); + (f.tokens.curr.beginsStmt = !0))); if (t === !0 && f.tokens.curr.fud) n = f.tokens.curr.fud(); else { f.tokens.curr.nud @@ -2966,7 +2976,7 @@ f.tokens.next.type === "(template)") && !J() ) - (i = f.tokens.curr.value === "Array"), + ((i = f.tokens.curr.value === "Array"), (s = f.tokens.curr.value === "Object"), n && (n.value || (n.first && n.first.value)) && @@ -2987,23 +2997,27 @@ F("W010", f.tokens.curr), n && f.tokens.curr.led ? (n = f.tokens.curr.led(n)) - : q("E033", f.tokens.curr, f.tokens.curr.id); + : q("E033", f.tokens.curr, f.tokens.curr.id)); } - return o && f.funct["(scope)"].unstack(), f.nameStack.pop(), n; + return ( + o && f.funct["(scope)"].unstack(), + f.nameStack.pop(), + n + ); } function G(e) { return e.startLine || e.line; } function Y(e, t) { - (e = e || f.tokens.curr), + ((e = e || f.tokens.curr), (t = t || f.tokens.next), !f.option.laxbreak && e.line !== G(t) && - F("W014", t, t.value); + F("W014", t, t.value)); } function Z(e) { - (e = e || f.tokens.curr), - e.line !== G(f.tokens.next) && F("E022", e, e.value); + ((e = e || f.tokens.curr), + e.line !== G(f.tokens.next) && F("E022", e, e.value)); } function et(e, t) { e.line !== G(t) && @@ -3012,10 +3026,10 @@ F("W014", e, t.value))); } function tt(e) { - (e = e || {}), + ((e = e || {}), e.peek ? et(f.tokens.prev, f.tokens.curr) - : (et(f.tokens.curr, f.tokens.next), V(",")); + : (et(f.tokens.curr, f.tokens.next), V(","))); if (f.tokens.next.identifier && (!e.property || !f.inES5())) switch (f.tokens.next.value) { case "break": @@ -3065,15 +3079,15 @@ } function rt(e) { var t = nt(e, 0); - return (t.delim = !0), t; + return ((t.delim = !0), t); } function it(e, t) { var n = rt(e); - return (n.identifier = n.reserved = !0), (n.fud = t), n; + return ((n.identifier = n.reserved = !0), (n.fud = t), n); } function st(e, t) { var n = it(e, t); - return (n.block = !0), n; + return ((n.block = !0), n); } function ot(e) { var t = e.id.charAt(0); @@ -3089,9 +3103,10 @@ typeof t == "function" ? t : function () { - (this.arity = "unary"), (this.right = Q(150)); + ((this.arity = "unary"), + (this.right = Q(150))); if (this.id === "++" || this.id === "--") - f.option.plusplus + (f.option.plusplus ? F("W016", this, this.id) : this.right && (!this.right.identifier || @@ -3107,7 +3122,7 @@ f.funct["(scope)"].block.modify( this.right.value, this, - ); + )); return this; }), n @@ -3115,11 +3130,11 @@ } function at(e, t) { var n = rt(e); - return (n.type = e), (n.nud = t), n; + return ((n.type = e), (n.nud = t), n); } function ft(e, t) { var n = at(e, t); - return (n.identifier = !0), (n.reserved = !0), n; + return ((n.identifier = !0), (n.reserved = !0), n); } function lt(e, t) { var n = at( @@ -3141,7 +3156,7 @@ } function ct(e, t) { return ft(e, function () { - return typeof t == "function" && t(this), this; + return (typeof t == "function" && t(this), this); }); } function ht(e, t, n, r) { @@ -3181,7 +3196,7 @@ var n = nt(e, 100); return ( (n.led = function (e) { - Y(f.tokens.prev, f.tokens.curr), (this.left = e); + (Y(f.tokens.prev, f.tokens.curr), (this.left = e)); var n = (this.right = Q(100)); return ( A(e, "NaN") || A(n, "NaN") @@ -3339,12 +3354,12 @@ : function (e, t) { t.left = e; if (e && wt(e, t, { allowDestructuring: !0 })) - return (t.right = Q(10)), t; + return ((t.right = Q(10)), t); q("E031", t); }, n, ); - return (r.exps = !0), (r.assign = !0), r; + return ((r.exps = !0), (r.assign = !0), r); } function St(e, t, n) { var r = nt(e, n); @@ -3370,7 +3385,7 @@ e, function (e, t) { f.option.bitwise && F("W016", t, t.id); - if (e && wt(e, t)) return (t.right = Q(10)), t; + if (e && wt(e, t)) return ((t.right = Q(10)), t); q("E031", t); }, 20, @@ -3416,9 +3431,9 @@ var n = Nt(e, t, !1); if (n) return n; if (f.tokens.next.value === "...") { - f.inES6(!0) || + (f.inES6(!0) || F("W119", f.tokens.next, "spread/rest operator", "6"), - V(); + V()); if (pn(f.tokens.next, "...")) { F("E024", f.tokens.next, "..."); while (pn(f.tokens.next, "...")) V(); @@ -3429,15 +3444,15 @@ } return Ct(e, t); } - q("E030", f.tokens.next, f.tokens.next.value), - f.tokens.next.id !== ";" && V(); + (q("E030", f.tokens.next, f.tokens.next.value), + f.tokens.next.id !== ";" && V()); } function kt(e) { var t = 0, n; if (f.tokens.next.id !== ";" || e.inBracelessBlock) return; for (;;) { - do (n = W(t)), (t += 1); + do ((n = W(t)), (t += 1)); while (n.id !== "(end)" && n.id === "(comment)"); if (n.reach) return; if (n.id !== "(endline)") { @@ -3478,7 +3493,7 @@ return; } var i = O(n); - i && + (i && n.meta && n.meta.isFutureReservedWord && W().id === ":" && @@ -3502,7 +3517,7 @@ f.tokens.next.value, ), (f.tokens.next.label = n.value), - (n = f.tokens.next)); + (n = f.tokens.next))); if (n.id === "{") { var s = f.funct["(verb)"] === "case" && @@ -3567,12 +3582,12 @@ } V(); var r = f.tokens.curr.value; - (f.directive[r] || + ((f.directive[r] || (r === "use strict" && f.option.strict === "implied")) && F("W034", f.tokens.curr, r), (f.directive[r] = !0), - t.id === ";" && V(";"); + t.id === ";" && V(";")); } f.isStrict() && (f.option["(explicitNewcap)"] || (f.option.newcap = !0), @@ -3586,14 +3601,14 @@ c, h, p; - (m = e), (c = f.tokens.next); + ((m = e), (c = f.tokens.next)); var d = f.funct["(metrics)"]; - (d.nestedBlockDepth += 1), - d.verifyMaxNestedBlockDepthPerFunction(); + ((d.nestedBlockDepth += 1), + d.verifyMaxNestedBlockDepthPerFunction()); if (f.tokens.next.id === "{") { - V("{"), + (V("{"), f.funct["(scope)"].stack(), - (h = f.tokens.curr.line); + (h = f.tokens.curr.line)); if (f.tokens.next.id !== "}") { g += f.option.indent; while (!e && f.tokens.next.from > g) @@ -3603,26 +3618,26 @@ for (p in f.directive) r.has(f.directive, p) && (l[p] = f.directive[p]); - Mt(), + (Mt(), f.option.strict && f.funct["(context)"]["(global)"] && !l["use strict"] && !f.isStrict() && - F("E007"); + F("E007")); } - (o = Ot()), + ((o = Ot()), (d.statementCount += o.length), - (g -= f.option.indent); + (g -= f.option.indent)); } - V("}", c), + (V("}", c), n && (f.funct["(scope)"].validateParams(), l && (f.directive = l)), f.funct["(scope)"].unstack(), - (g = a); + (g = a)); } else if (!e) if (n) { - f.funct["(scope)"].stack(), + (f.funct["(scope)"].stack(), (l = {}), t && !i && @@ -3631,21 +3646,21 @@ "W118", f.tokens.curr, "function closure expressions", - ); + )); if (!t) for (p in f.directive) r.has(f.directive, p) && (l[p] = f.directive[p]); - Q(10), + (Q(10), f.option.strict && f.funct["(context)"]["(global)"] && !l["use strict"] && !f.isStrict() && F("E007"), - f.funct["(scope)"].unstack(); + f.funct["(scope)"].unstack()); } else q("E021", f.tokens.next, "{", f.tokens.next.value); else - (f.funct["(noblockscopedvar)"] = + ((f.funct["(noblockscopedvar)"] = f.tokens.next.id !== "for"), f.funct["(scope)"].stack(), (!t || f.option.curly) && @@ -3655,7 +3670,7 @@ (o = [At()]), (g -= f.option.indent), f.funct["(scope)"].unstack(), - delete f.funct["(noblockscopedvar)"]; + delete f.funct["(noblockscopedvar)"]); switch (f.funct["(verb)"]) { case "break": case "continue": @@ -3676,12 +3691,12 @@ ); } function Dt(e) { - E && typeof E[e] != "boolean" && F("W036", f.tokens.curr, e), - typeof w[e] == "number" ? (w[e] += 1) : (w[e] = 1); + (E && typeof E[e] != "boolean" && F("W036", f.tokens.curr, e), + typeof w[e] == "number" ? (w[e] += 1) : (w[e] = 1)); } function Bt() { var e = {}; - (e.exps = !0), f.funct["(comparray)"].stack(); + ((e.exps = !0), f.funct["(comparray)"].stack()); var t = !1; return ( f.tokens.next.value !== "for" && @@ -3773,7 +3788,7 @@ f.funct["(scope)"].addParam(c.value, c), { arity: 1, params: [c.value] } ); - (t = f.tokens.next), (!e || !e.parsedOpening) && V("("); + ((t = f.tokens.next), (!e || !e.parsedOpening) && V("(")); if (f.tokens.next.id === ")") { V(")"); return; @@ -3784,14 +3799,15 @@ if (r.contains(["{", "["], f.tokens.next.id)) { s = Gt(); for (o in s) - (o = s[o]), - o.id && (n.push(o.id), p.push([o.id, o.token])); + ((o = s[o]), + o.id && + (n.push(o.id), p.push([o.id, o.token]))); } else { - pn(f.tokens.next, "...") && (a = !0), (i = Ct(!0)); - if (i) n.push(i), p.push([i, f.tokens.curr]); + (pn(f.tokens.next, "...") && (a = !0), (i = Ct(!0))); + if (i) (n.push(i), p.push([i, f.tokens.curr])); else while (!hn(f.tokens.next, [",", ")"])) V(); } - u && + (u && f.tokens.next.id !== "=" && q("W138", f.tokens.current), f.tokens.next.id === "=" && @@ -3805,10 +3821,10 @@ V("="), (u = !0), Q(10)), - p.forEach(h); + p.forEach(h)); if (f.tokens.next.id !== ",") - return V(")", t), { arity: l, params: n }; - a && F("W131", f.tokens.next), tt(); + return (V(")", t), { arity: l, params: n }); + (a && F("W131", f.tokens.next), tt()); } } function Rt(e, t, n) { @@ -3863,7 +3879,7 @@ f.tokens.next.template && f.tokens.next.tail && f.tokens.next.context === t; - return e && V(), e || f.tokens.next.isUnclosed; + return (e && V(), e || f.tokens.next.isUnclosed); } var t = this.context, n = this.noSubst, @@ -3886,7 +3902,7 @@ a, l = f.option, c = f.ignored; - e && + (e && ((r = e.name), (i = e.statement), (s = e.classExprBinding), @@ -3905,16 +3921,16 @@ (n = f.tokens.curr), (n.funct = f.funct), v.push(f.funct), - f.funct["(scope)"].stack("functionouter"); + f.funct["(scope)"].stack("functionouter")); var h = r || s; - h && + (h && f.funct["(scope)"].block.add( h, s ? "class" : "function", f.tokens.curr, !1, ), - f.funct["(scope)"].stack("functionparams"); + f.funct["(scope)"].stack("functionparams")); var p = qt(e); return ( p @@ -4054,8 +4070,8 @@ if (hn(f.tokens.next, ["[", "{"])) { t = Yt(s); for (var r in t) - (r = t[r]), - n.push({ id: r.id, token: r.token }); + ((r = t[r]), + n.push({ id: r.id, token: r.token })); } else if (pn(f.tokens.next, ",")) n.push({ id: null, token: f.tokens.curr }); else { @@ -4073,7 +4089,7 @@ o ); } - V("("), u(), V(")"); + (V("("), u(), V(")")); } return !1; }, @@ -4092,11 +4108,11 @@ n.push({ id: e, token: f.tokens.curr }))); }; if (pn(o, "[")) { - r || V("["), - pn(f.tokens.next, "]") && F("W137", f.tokens.curr); + (r || V("["), + pn(f.tokens.next, "]") && F("W137", f.tokens.curr)); var l = !1; while (!pn(f.tokens.next, "]")) - u() && + (u() && !l && pn(f.tokens.next, ",") && (F("W130", f.tokens.next), (l = !0)), @@ -4109,13 +4125,13 @@ f.tokens.prev.value, ), Q(10)), - pn(f.tokens.next, "]") || V(","); + pn(f.tokens.next, "]") || V(",")); V("]"); } else if (pn(o, "{")) { - r || V("{"), - pn(f.tokens.next, "}") && F("W137", f.tokens.curr); + (r || V("{"), + pn(f.tokens.next, "}") && F("W137", f.tokens.curr)); while (!pn(f.tokens.next, "}")) { - a(), + (a(), pn(f.tokens.next, "=") && (V("="), f.tokens.next.id === "undefined" && @@ -4124,7 +4140,7 @@ f.tokens.prev, f.tokens.prev.value, ), - Q(10)); + Q(10))); if (!pn(f.tokens.next, "}")) { V(","); if (pn(f.tokens.next, "}")) break; @@ -4157,7 +4173,7 @@ l, c, h; - f.inES6() || F("W104", f.tokens.curr, e, "6"), + (f.inES6() || F("W104", f.tokens.curr, e, "6"), o && f.tokens.next.value === "(" ? (f.inMoz() || F("W118", f.tokens.next, "let block"), V("("), @@ -4165,17 +4181,17 @@ (h = !0)) : f.funct["(noblockscopedvar)"] && q("E048", f.tokens.curr, u ? "Const" : "Let"), - (t.first = []); + (t.first = [])); for (;;) { var p = []; - r.contains(["{", "["], f.tokens.next.value) + (r.contains(["{", "["], f.tokens.next.value) ? ((a = Gt()), (l = !1)) : ((a = [{ id: Ct(), token: f.tokens.curr }]), (l = !0)), !i && u && f.tokens.next.id !== "=" && - F("E012", f.tokens.curr, f.tokens.curr.value); + F("E012", f.tokens.curr, f.tokens.curr.value)); for (var d in a) a.hasOwnProperty(d) && ((d = a[d]), @@ -4195,7 +4211,7 @@ d.token.value, d.token, ))); - f.tokens.next.id === "=" && + (f.tokens.next.id === "=" && (V("="), !i && f.tokens.next.id === "undefined" && @@ -4206,7 +4222,7 @@ F("W120", f.tokens.next, f.tokens.next.value), (c = Q(i ? 120 : 10)), l ? (a[0].first = c) : Zt(p, c)), - (t.first = t.first.concat(p)); + (t.first = t.first.concat(p))); if (f.tokens.next.id !== ",") break; tt(); } @@ -4238,13 +4254,13 @@ } function on(e) { var t = f.inClassBody; - f.tokens.next.value === "extends" && + (f.tokens.next.value === "extends" && (V("extends"), (e.heritage = Q(10))), (f.inClassBody = !0), V("{"), (e.body = un(e)), V("}"), - (f.inClassBody = t); + (f.inClassBody = t)); } function un(e) { var t, @@ -4255,31 +4271,33 @@ o = Object.create(null), u; for (var a = 0; f.tokens.next.id !== "}"; ++a) { - (t = f.tokens.next), (n = !1), (r = !1), (i = null); + ((t = f.tokens.next), (n = !1), (r = !1), (i = null)); if (t.id === ";") { - F("W032"), V(";"); + (F("W032"), V(";")); continue; } t.id === "*" && ((r = !0), V("*"), (t = f.tokens.next)); - if (t.id === "[") (t = cn()), (u = !0); + if (t.id === "[") ((t = cn()), (u = !0)); else { if (!Ft(t)) { - F( + (F( "W052", f.tokens.next, f.tokens.next.value || f.tokens.next.type, ), - V(); + V()); continue; } - V(), (u = !1); + (V(), (u = !1)); if (t.identifier && t.value === "static") { pn(f.tokens.next, "*") && ((r = !0), V("*")); if (Ft(f.tokens.next) || f.tokens.next.id === "[") - (u = f.tokens.next.id === "["), + ((u = f.tokens.next.id === "["), (n = !0), (t = f.tokens.next), - f.tokens.next.id === "[" ? (t = cn()) : V(); + f.tokens.next.id === "[" + ? (t = cn()) + : V()); } t.identifier && (t.value === "get" || t.value === "set") && @@ -4314,29 +4332,29 @@ } else t.value === "prototype" && q("E049", t, "class method", "prototype"); - It(t), + (It(t), Xt({ statement: e, type: r ? "generator" : null, classExprBinding: e.namedExpr ? e.name : null, - }); + })); } Kt(s); } function fn(e, t, n, r, i) { var s = ["key", "class method", "static class method"]; - (s = s[(r || !1) + (i || !1)]), + ((s = s[(r || !1) + (i || !1)]), n.identifier && (t = n.value), e[t] && t !== "__proto__" ? F("W075", f.tokens.next, s, t) : (e[t] = Object.create(null)), (e[t].basic = !0), - (e[t].basictkn = n); + (e[t].basictkn = n)); } function ln(e, t, n, r, i, s) { var o = e === "get" ? "getterToken" : "setterToken", u = ""; - i + (i ? (s && (u += "static "), (u += e + "ter method")) : (u = "key"), (f.tokens.curr.accessorType = e), @@ -4346,19 +4364,19 @@ n !== "__proto__" && F("W075", f.tokens.next, u, n) : (t[n] = Object.create(null)), - (t[n][o] = r); + (t[n][o] = r)); } function cn() { - V("["), + (V("["), f.inES6() || F( "W119", f.tokens.curr, "computed property names", "6", - ); + )); var e = Q(10); - return V("]"), e; + return (V("]"), e); } function hn(e, t) { return e.type === "(punctuator)" ? r.contains(t, e.value) : !1; @@ -4403,7 +4421,7 @@ f.tokens.next.value, ); } - e[f.tokens.next.value] === !0 + (e[f.tokens.next.value] === !0 ? F( "W075", f.tokens.next, @@ -4422,7 +4440,7 @@ : (e[f.tokens.next.value] = !0), V(), V(":"), - mn(); + mn()); if (f.tokens.next.id !== ",") break; V(","); } @@ -4464,7 +4482,7 @@ V(); break; case "-": - V("-"), V("(number)"); + (V("-"), V("(number)")); break; default: q("E003", f.tokens.next); @@ -4509,7 +4527,7 @@ N = [], C = new i.EventEmitter(), mt = {}; - (mt.legacy = ["xml", "unknown"]), + ((mt.legacy = ["xml", "unknown"]), (mt.es3 = [ "undefined", "boolean", @@ -4544,9 +4562,9 @@ led: function () { q("E033", f.tokens.next, f.tokens.next.value); }, - }); + })); var Pt = { lbp: 0, identifier: !1, template: !0 }; - (f.syntax["(template)"] = r.extend( + ((f.syntax["(template)"] = r.extend( { type: "(template)", nud: Wt, led: Wt, noSubst: !1 }, Pt, )), @@ -4624,7 +4642,7 @@ ",", function (e, t) { var n; - (t.exprs = [e]), f.option.nocomma && F("W127"); + ((t.exprs = [e]), f.option.nocomma && F("W127")); if (!tt({ peek: !0 })) return t; for (;;) { if (!(n = Q(10))) break; @@ -4649,12 +4667,12 @@ ); }, 30, - ); + )); var Ht = 40; - ht( + (ht( "||", function (e, t) { - return $t(), (t.left = e), (t.right = Q(Ht)), t; + return ($t(), (t.left = e), (t.right = Q(Ht)), t); }, Ht, ), @@ -4669,8 +4687,8 @@ (t && t.value) === "null"); switch (!0) { case !n && f.option.eqeqeq: - (this.from = this.character), - F("W116", this, "===", "=="); + ((this.from = this.character), + F("W116", this, "===", "==")); break; case vt(e): F("W041", this, "===", e.value); @@ -4970,7 +4988,7 @@ : f.option.newcap && F("W064", e)); if (f.tokens.next.id !== ")") for (;;) { - (r[r.length] = Q(10)), (n += 1); + ((r[r.length] = Q(10)), (n += 1)); if (f.tokens.next.id !== ",") break; tt(); } @@ -5031,12 +5049,12 @@ l = f.tokens.prev, c = !f.option.singleGroups; do - e.value === "(" + (e.value === "(" ? (u += 1) : e.value === ")" && (u -= 1), (n += 1), (t = e), - (e = W(n)); + (e = W(n))); while ( (u !== 0 || t.value !== ")") && e.value !== ";" && @@ -5051,16 +5069,16 @@ for (;;) { h.push(Q(10)); if (f.tokens.next.id !== ",") break; - f.option.nocomma && F("W127"), tt(); + (f.option.nocomma && F("W127"), tt()); } - V(")", this), + (V(")", this), f.option.immed && h[0] && h[0].id === "function" && f.tokens.next.id !== "(" && f.tokens.next.id !== "." && f.tokens.next.id !== "[" && - F("W068", this); + F("W068", this)); if (!h.length) return; return ( h.length > 1 @@ -5143,11 +5161,11 @@ this ); var t = f.tokens.curr.line !== G(f.tokens.next); - (this.first = []), + ((this.first = []), t && ((g += f.option.indent), f.tokens.next.from === g + f.option.indent && - (g += f.option.indent)); + (g += f.option.indent))); while (f.tokens.next.id !== "(end)") { while (f.tokens.next.id === ",") { if (!f.option.elision) { @@ -5170,10 +5188,10 @@ break; } } - return t && (g -= f.option.indent), V("]", this), this; + return (t && (g -= f.option.indent), V("]", this), this); }), (function (e) { - (e.nud = function () { + ((e.nud = function () { var e, t, n, @@ -5182,11 +5200,11 @@ s = !1, o, u = Object.create(null); - (e = f.tokens.curr.line !== G(f.tokens.next)), + ((e = f.tokens.curr.line !== G(f.tokens.next)), e && ((g += f.option.indent), f.tokens.next.from === g + f.option.indent && - (g += f.option.indent)); + (g += f.option.indent))); var a = an(); if (a.isDestAssign) return ( @@ -5220,11 +5238,11 @@ (s = !0)) : (s = !1); if (f.tokens.next.id === "[") - (n = cn()), f.nameStack.set(n); + ((n = cn()), f.nameStack.set(n)); else { - f.nameStack.set(f.tokens.next), + (f.nameStack.set(f.tokens.next), (n = It()), - fn(u, n, f.tokens.next); + fn(u, n, f.tokens.next)); if (typeof n != "string") break; } f.tokens.next.value === "(" @@ -5238,7 +5256,7 @@ Xt({ type: s ? "generator" : null })) : (V(":"), Q(10)); } else - V(o), + (V(o), f.inES5() || q("E034"), (n = It()), !n && !f.inES6() && q("E035"), @@ -5251,9 +5269,9 @@ : o === "set" && n && (!r || r.length !== 1) && - F("W077", i, n); + F("W077", i, n)); else - f.inES6() || + (f.inES6() || F( "W104", f.tokens.next, @@ -5262,15 +5280,15 @@ ), (n = It(!0)), fn(u, n, f.tokens.next), - Q(10); + Q(10)); Dt(n); if (f.tokens.next.id !== ",") break; - tt({ allowTrailing: !0, property: !0 }), + (tt({ allowTrailing: !0, property: !0 }), f.tokens.next.id === "," ? F("W070", f.tokens.curr) : f.tokens.next.id === "}" && !f.inES5() && - F("W070", f.tokens.curr); + F("W070", f.tokens.curr)); } return ( e && (g -= f.option.indent), @@ -5281,8 +5299,8 @@ }), (e.fud = function () { q("E036", f.tokens.curr); - }); - })(rt("{")); + })); + })(rt("{"))); var tn = it("const", function (e) { return en("const", this, e); }); @@ -5302,12 +5320,12 @@ this.first = []; for (;;) { var c = []; - r.contains(["{", "["], f.tokens.next.value) + (r.contains(["{", "["], f.tokens.next.value) ? ((i = Gt()), (o = !1)) : ((i = [{ id: Ct(), token: f.tokens.curr }]), (o = !0)), (!t || !a) && l && f.option.varstmt && F("W132", this), - (this.first = this.first.concat(c)); + (this.first = this.first.concat(c))); for (var h in i) i.hasOwnProperty(h) && ((h = i[h]), @@ -5363,19 +5381,19 @@ } return this; }); - (rn.exps = !0), + ((rn.exps = !0), st("class", function () { return sn.call(this, !0); }), st("function", function (e) { var t = e && e.inexport, n = !1; - f.tokens.next.value === "*" && + (f.tokens.next.value === "*" && (V("*"), f.inES6({ strict: !0 }) ? (n = !0) : F("W119", f.tokens.curr, "function*", "6")), - m && F("W082", f.tokens.curr); + m && F("W082", f.tokens.curr)); var r = Nt(); return ( f.funct["(scope)"].addlabel(r, { @@ -5406,15 +5424,18 @@ V("*"), (e = !0)); var t = Nt(); - return Xt({ name: t, type: e ? "generator" : null }), this; + return ( + Xt({ name: t, type: e ? "generator" : null }), + this + ); }), st("if", function () { var e = f.tokens.next; - $t(), (f.condition = !0), V("("); + ($t(), (f.condition = !0), V("(")); var t = Q(0); Jt(t); var n = null; - f.option.forin && + (f.option.forin && f.forinifcheckneeded && ((f.forinifcheckneeded = !1), (n = f.forinifchecks[f.forinifchecks.length - 1]), @@ -5422,7 +5443,7 @@ ? (n.type = "(negative)") : (n.type = "(positive)")), V(")", e), - (f.condition = !1); + (f.condition = !1)); var r = _t(!0, !0); return ( n && @@ -5443,9 +5464,9 @@ }), st("try", function () { function t() { - V("catch"), + (V("catch"), V("("), - f.funct["(scope)"].stack("catchparams"); + f.funct["(scope)"].stack("catchparams")); if (hn(f.tokens.next, ["[", "{"])) { var e = Gt(); r.each(e, function (e) { @@ -5464,19 +5485,19 @@ f.tokens.curr, "exception", ); - f.tokens.next.value === "if" && + (f.tokens.next.value === "if" && (f.inMoz() || F("W118", f.tokens.curr, "catch filter"), V("if"), Q(0)), V(")"), _t(!1), - f.funct["(scope)"].unstack(); + f.funct["(scope)"].unstack()); } var e; _t(!0); while (f.tokens.next.id === "catch") - $t(), + ($t(), e && !f.inMoz() && F( @@ -5485,9 +5506,9 @@ "multiple catch blocks", ), t(), - (e = !0); + (e = !0)); if (f.tokens.next.id === "finally") { - V("finally"), _t(!0); + (V("finally"), _t(!0)); return; } return ( @@ -5533,7 +5554,7 @@ var e = f.tokens.next, t = !1, n = !1; - (f.funct["(breakage)"] += 1), + ((f.funct["(breakage)"] += 1), V("("), Jt(Q(0)), V(")", e), @@ -5541,7 +5562,7 @@ V("{"), f.tokens.next.from === g && (n = !0), n || (g += f.option.indent), - (this.cases = []); + (this.cases = [])); for (;;) switch (f.tokens.next.id) { case "case": @@ -5558,12 +5579,12 @@ f.tokens.curr.caseFallsThrough || F("W086", f.tokens.curr, "case"); } - V("case"), + (V("case"), this.cases.push(Q(0)), $t(), (t = !0), V(":"), - (f.funct["(verb)"] = "case"); + (f.funct["(verb)"] = "case")); break; case "default": switch (f.funct["(verb)"]) { @@ -5582,13 +5603,13 @@ "default", )); } - V("default"), (t = !0), V(":"); + (V("default"), (t = !0), V(":")); break; case "}": - n || (g -= f.option.indent), + (n || (g -= f.option.indent), V("}", e), (f.funct["(breakage)"] -= 1), - (f.funct["(verb)"] = undefined); + (f.funct["(verb)"] = undefined)); return; case "(end)": q("E023", f.tokens.next, "}"); @@ -5601,7 +5622,7 @@ q("E040"); return; case ":": - (t = !1), Ot(); + ((t = !1), Ot()); break; default: q("E025", f.tokens.curr); @@ -5617,22 +5638,24 @@ ); return; } - V(":"), q("E024", f.tokens.curr, ":"), Ot(); + (V(":"), + q("E024", f.tokens.curr, ":"), + Ot()); } g -= f.option.indent; } return this; }).labelled = !0), (it("debugger", function () { - return f.option.debug || F("W087", this), this; + return (f.option.debug || F("W087", this), this); }).exps = !0), (function () { var e = it("do", function () { - (f.funct["(breakage)"] += 1), + ((f.funct["(breakage)"] += 1), (f.funct["(loopage)"] += 1), $t(), (this.first = _t(!0, !0)), - V("while"); + V("while")); var e = f.tokens.next; return ( V("("), @@ -5643,19 +5666,19 @@ this ); }); - (e.labelled = !0), (e.exps = !0); + ((e.labelled = !0), (e.exps = !0)); })(), (st("for", function () { var e, t = f.tokens.next, n = !1, i = null; - t.value === "each" && + (t.value === "each" && ((i = t), V("each"), f.inMoz() || F("W118", f.tokens.curr, "for each")), $t(), - V("("); + V("(")); var s, o = 0, u = ["in", "of"], @@ -5664,9 +5687,9 @@ c; hn(f.tokens.next, ["{", "["]) && ++a; do { - (s = W(o)), + ((s = W(o)), ++o, - hn(s, ["{", "["]) ? ++a : hn(s, ["}", "]"]) && --a; + hn(s, ["{", "["]) ? ++a : hn(s, ["}", "]"]) && --a); if (a < 0) break; a === 0 && (!l && pn(s, ",") @@ -5683,7 +5706,7 @@ s.value === "of" && F("W104", s, "for of", "6"); var h = !c && !l; - c && q("W133", l, s.value, "initializer is forbidden"), + (c && q("W133", l, s.value, "initializer is forbidden"), l && q( "W133", @@ -5715,7 +5738,7 @@ f.forinifchecks.push({ type: "(none)" })), (f.funct["(breakage)"] += 1), (f.funct["(loopage)"] += 1), - (e = _t(!0, !0)); + (e = _t(!0, !0))); if (s.value === "in" && f.option.forin) { if (f.forinifchecks && f.forinifchecks.length > 0) { var p = f.forinifchecks.pop(); @@ -5729,45 +5752,45 @@ } f.forinifcheckneeded = !1; } - (f.funct["(breakage)"] -= 1), - (f.funct["(loopage)"] -= 1); + ((f.funct["(breakage)"] -= 1), + (f.funct["(loopage)"] -= 1)); } else { i && q("E045", i); if (f.tokens.next.id !== ";") if (f.tokens.next.id === "var") - V("var"), f.tokens.curr.fud(); + (V("var"), f.tokens.curr.fud()); else if (f.tokens.next.id === "let") - V("let"), + (V("let"), (n = !0), f.funct["(scope)"].stack(), - f.tokens.curr.fud(); + f.tokens.curr.fud()); else for (;;) { Q(0, "for"); if (f.tokens.next.id !== ",") break; l(); } - Z(f.tokens.curr), + (Z(f.tokens.curr), V(";"), (f.funct["(loopage)"] += 1), f.tokens.next.id !== ";" && Jt(Q(0)), Z(f.tokens.curr), V(";"), f.tokens.next.id === ";" && - q("E021", f.tokens.next, ")", ";"); + q("E021", f.tokens.next, ")", ";")); if (f.tokens.next.id !== ")") for (;;) { Q(0, "for"); if (f.tokens.next.id !== ",") break; l(); } - V(")", t), + (V(")", t), (f.funct["(breakage)"] += 1), _t(!0, !0), (f.funct["(breakage)"] -= 1), - (f.funct["(loopage)"] -= 1); + (f.funct["(loopage)"] -= 1)); } - return n && f.funct["(scope)"].unstack(), this; + return (n && f.funct["(scope)"].unstack(), this); }).labelled = !0), (it("break", function () { var e = f.tokens.next.value; @@ -5831,17 +5854,17 @@ ); }).exps = !0), (function (e) { - (e.exps = !0), (e.lbp = 25); + ((e.exps = !0), (e.lbp = 25)); })( ut("yield", function () { var e = f.tokens.prev; - f.inES6(!0) && !f.funct["(generator)"] + (f.inES6(!0) && !f.funct["(generator)"] ? ("(catch)" !== f.funct["(name)"] || !f.funct["(context)"]["(generator)"]) && q("E046", f.tokens.curr, "yield") : f.inES6() || F("W104", f.tokens.curr, "yield", "6"), - (f.funct["(generator)"] = "yielded"); + (f.funct["(generator)"] = "yielded")); var t = !1; f.tokens.next.value === "*" && ((t = !0), V("*")); if (this.line === G(f.tokens.next) || !f.inMoz()) { @@ -5852,7 +5875,7 @@ !f.tokens.next.reach && f.tokens.next.nud) ) - Y(f.tokens.curr, f.tokens.next), + (Y(f.tokens.curr, f.tokens.next), (this.first = Q(10)), this.first.type === "(punctuator)" && this.first.value === "=" && @@ -5862,7 +5885,7 @@ "W093", this.first.line, this.first.character, - ); + )); f.inMoz() && f.tokens.next.id !== ")" && (e.lbp > 30 || @@ -5874,31 +5897,31 @@ }), ), (it("throw", function () { - return Z(this), (this.first = Q(20)), kt(this), this; + return (Z(this), (this.first = Q(20)), kt(this), this); }).exps = !0), (it("import", function () { f.inES6() || F("W119", f.tokens.curr, "import", "6"); if (f.tokens.next.type === "(string)") - return V("(string)"), this; + return (V("(string)"), this); if (f.tokens.next.identifier) { - (this.name = Ct()), + ((this.name = Ct()), f.funct["(scope)"].addlabel(this.name, { type: "const", token: f.tokens.curr, - }); + })); if (f.tokens.next.value !== ",") - return V("from"), V("(string)"), this; + return (V("from"), V("(string)"), this); V(","); } if (f.tokens.next.id === "*") - V("*"), + (V("*"), V("as"), f.tokens.next.identifier && ((this.name = Ct()), f.funct["(scope)"].addlabel(this.name, { type: "const", token: f.tokens.curr, - })); + }))); else { V("{"); for (;;) { @@ -5907,7 +5930,7 @@ break; } var e; - f.tokens.next.type === "default" + (f.tokens.next.type === "default" ? ((e = "default"), V("default")) : (e = Ct()), f.tokens.next.value === "as" && @@ -5915,7 +5938,7 @@ f.funct["(scope)"].addlabel(e, { type: "const", token: f.tokens.curr, - }); + })); if (f.tokens.next.value !== ",") { if (f.tokens.next.value === "}") { V("}"); @@ -5927,20 +5950,20 @@ V(","); } } - return V("from"), V("(string)"), this; + return (V("from"), V("(string)"), this); }).exps = !0), (it("export", function () { var e = !0, t, n; - f.inES6() || + (f.inES6() || (F("W119", f.tokens.curr, "export", "6"), (e = !1)), f.funct["(scope)"].block.isGlobal() || - (q("E053", f.tokens.curr), (e = !1)); + (q("E053", f.tokens.curr), (e = !1))); if (f.tokens.next.value === "*") - return V("*"), V("from"), V("(string)"), this; + return (V("*"), V("from"), V("(string)"), this); if (f.tokens.next.type === "default") { - f.nameStack.set(f.tokens.next), V("default"); + (f.nameStack.set(f.tokens.next), V("default")); var r = f.tokens.next.id; if (r === "function" || r === "class") this.block = !0; return ( @@ -5960,7 +5983,7 @@ V("{"); var i = []; for (;;) { - f.tokens.next.identifier || + (f.tokens.next.identifier || q("E030", f.tokens.next, f.tokens.next.value), V(), i.push(f.tokens.curr), @@ -5972,7 +5995,7 @@ f.tokens.next, f.tokens.next.value, ), - V()); + V())); if (f.tokens.next.value !== ",") { if (f.tokens.next.value === "}") { V("}"); @@ -5997,20 +6020,20 @@ ); } if (f.tokens.next.id === "var") - V("var"), f.tokens.curr.fud({ inexport: !0 }); + (V("var"), f.tokens.curr.fud({ inexport: !0 })); else if (f.tokens.next.id === "let") - V("let"), f.tokens.curr.fud({ inexport: !0 }); + (V("let"), f.tokens.curr.fud({ inexport: !0 })); else if (f.tokens.next.id === "const") - V("const"), f.tokens.curr.fud({ inexport: !0 }); + (V("const"), f.tokens.curr.fud({ inexport: !0 })); else if (f.tokens.next.id === "function") - (this.block = !0), + ((this.block = !0), V("function"), - f.syntax["function"].fud({ inexport: !0 }); + f.syntax["function"].fud({ inexport: !0 })); else if (f.tokens.next.id === "class") { - (this.block = !0), V("class"); + ((this.block = !0), V("class")); var s = f.tokens.next; - f.syntax["class"].fud(), - f.funct["(scope)"].setExported(s.value, s); + (f.syntax["class"].fud(), + f.funct["(scope)"].setExported(s.value, s)); } else q("E024", f.tokens.next, f.tokens.next.value); return this; }).exps = !0), @@ -6041,7 +6064,7 @@ lt("super", { es5: !0 }), lt("synchronized"), lt("transient"), - lt("volatile"); + lt("volatile")); var an = function () { var e, t, @@ -6051,25 +6074,25 @@ s = {}; hn(f.tokens.curr, ["[", "{"]) && (i += 1); do { - (n = r === -1 ? f.tokens.curr : e), + ((n = r === -1 ? f.tokens.curr : e), (e = r === -1 ? f.tokens.next : W(r)), (t = W(r + 1)), (r += 1), hn(e, ["[", "{"]) ? (i += 1) - : hn(e, ["]", "}"]) && (i -= 1); + : hn(e, ["]", "}"]) && (i -= 1)); if ( i === 1 && e.identifier && e.value === "for" && !pn(n, ".") ) { - (s.isCompArray = !0), (s.notJson = !0); + ((s.isCompArray = !0), (s.notJson = !0)); break; } if (i === 0 && hn(e, ["}", "]"])) { if (t.value === "=") { - (s.isDestAssign = !0), (s.notJson = !0); + ((s.isDestAssign = !0), (s.notJson = !0)); break; } if (t.value === ".") { @@ -6084,38 +6107,38 @@ vn = function () { function i(e) { var t = n.variables.filter(function (t) { - if (t.value === e) return (t.undef = !1), e; + if (t.value === e) return ((t.undef = !1), e); }).length; return t !== 0; } function s(e) { var t = n.variables.filter(function (t) { if (t.value === e && !t.undef) - return t.unused === !0 && (t.unused = !1), e; + return (t.unused === !0 && (t.unused = !1), e); }).length; return t === 0; } var e = function () { - (this.mode = "use"), (this.variables = []); + ((this.mode = "use"), (this.variables = [])); }, t = [], n; return { stack: function () { - (n = new e()), t.push(n); + ((n = new e()), t.push(n)); }, unstack: function () { - n.variables.filter(function (e) { - e.unused && + (n.variables.filter(function (e) { + (e.unused && F("W098", e.token, e.raw_text || e.value), e.undef && f.funct["(scope)"].block.use( e.value, e.token, - ); + )); }), t.splice(-1, 1), - (n = t[t.length - 1]); + (n = t[t.length - 1])); }, setState: function (e) { r.contains( @@ -6168,10 +6191,10 @@ yn = function (t, i, o) { function U(e, t) { if (!e) return; - !Array.isArray(e) && + (!Array.isArray(e) && typeof e == "object" && (e = Object.keys(e)), - e.forEach(t); + e.forEach(t)); } var a, l, @@ -6181,7 +6204,7 @@ O, M = {}, P = {}; - (i = r.clone(i)), + ((i = r.clone(i)), f.reset(), i && i.scope ? (p.scope = i.scope) @@ -6194,10 +6217,10 @@ D(S, s.ecmaIdentifiers[3]), D(S, s.reservedVars), D(S, o || {}), - (n = Object.create(null)); + (n = Object.create(null))); var j = Object.create(null); if (i) { - U(i.predef || null, function (e) { + (U(i.predef || null, function (e) { var t, n; e[0] === "-" ? ((t = e.slice(1)), @@ -6214,27 +6237,27 @@ }), delete i.predef, delete i.exported, - (O = Object.keys(i)); + (O = Object.keys(i))); for (c = 0; c < O.length; c++) if (/^-W\d{3}$/g.test(O[c])) P[O[c].slice(1)] = !0; else { var z = O[c]; - (M[z] = i[z]), + ((M[z] = i[z]), ((z === "esversion" && i[z] === 5) || (z === "es5" && i[z])) && F("I003"), O[c] === "newcap" && i[z] === !1 && - (M["(explicitNewcap)"] = !0); + (M["(explicitNewcap)"] = !0)); } } - (f.option = M), + ((f.option = M), (f.ignored = P), (f.option.indent = f.option.indent || 4), (f.option.maxerr = f.option.maxerr || 50), - (g = 1); + (g = 1)); var W = h(f, S, j, n); - W.on("warning", function (e) { + (W.on("warning", function (e) { F.apply(null, [e.code, e.token].concat(e.data)); }), W.on("error", function (e) { @@ -6252,9 +6275,9 @@ (w = {}), (E = null), (m = !1), - (y = []); - if (!L(t) && !Array.isArray(t)) return R("E004", 0), !1; - (e = { + (y = [])); + if (!L(t) && !Array.isArray(t)) return (R("E004", 0), !1); + ((e = { get isJSON() { return f.jsonMode; }, @@ -6292,11 +6315,11 @@ (i.ignoreDelimiters = [i.ignoreDelimiters]), i.ignoreDelimiters.forEach(function (e) { if (!e.start || !e.end) return; - (d = gn(e.start) + "[\\s\\S]*?" + gn(e.end)), + ((d = gn(e.start) + "[\\s\\S]*?" + gn(e.end)), (A = new RegExp(d, "ig")), (t = t.replace(A, function (e) { return e.replace(/./g, " "); - })); + }))); })), (b = new u(t)), b.on("warning", function (e) { @@ -6323,9 +6346,9 @@ b.on("Number", function (e) { C.emit("Number", e); }), - b.start(); + b.start()); for (var X in i) r.has(i, X) && k(X, f.tokens.curr); - H(), D(S, o || {}), (tt.first = !0); + (H(), D(S, o || {}), (tt.first = !0)); try { V(); switch (f.tokens.next.id) { @@ -6334,15 +6357,15 @@ dn(); break; default: - Mt(), + (Mt(), f.directive["use strict"] && f.option.strict !== "global" && F("W097", f.tokens.prev), - Ot(); + Ot()); } - f.tokens.next.id !== "(end)" && + (f.tokens.next.id !== "(end)" && B("E041", f.tokens.curr.line), - f.funct["(scope)"].unstack(); + f.funct["(scope)"].unstack()); } catch ($) { if (!$ || $.name !== "JSHintError") throw $; var J = f.tokens.next || {}; @@ -6361,9 +6384,9 @@ if (p.scope === "(main)") { i = i || {}; for (a = 0; a < p.internals.length; a += 1) - (l = p.internals[a]), + ((l = p.internals[a]), (i.scope = l.elem), - yn(l.value, i, o); + yn(l.value, i, o)); } return p.errors.length === 0; }; @@ -6380,19 +6403,19 @@ i, s, o; - yn.errors.length && (e.errors = yn.errors), - f.jsonMode && (e.json = !0); + (yn.errors.length && (e.errors = yn.errors), + f.jsonMode && (e.json = !0)); var u = f.funct["(scope)"].getImpliedGlobals(); - u.length > 0 && (e.implieds = u), + (u.length > 0 && (e.implieds = u), T.length > 0 && (e.urls = T), (o = f.funct["(scope)"].getUsedOrDefinedGlobals()), - o.length > 0 && (e.globals = o); + o.length > 0 && (e.globals = o)); for (r = 1; r < v.length; r += 1) { - (n = v[r]), (t = {}); + ((n = v[r]), (t = {})); for (i = 0; i < d.length; i += 1) t[d[i]] = []; for (i = 0; i < d.length; i += 1) t[d[i]].length === 0 && delete t[d[i]]; - (t.name = n["(name)"]), + ((t.name = n["(name)"]), (t.param = n["(params)"]), (t.line = n["(line)"]), (t.character = n["(character)"]), @@ -6403,7 +6426,7 @@ parameters: n["(metrics)"].arity, statements: n["(metrics)"].statementCount, }), - e.functions.push(t); + e.functions.push(t)); } var a = f.funct["(scope)"].getUnuseds(); a.length > 0 && (e.unused = a); @@ -6450,7 +6473,7 @@ } function p(e) { var t = e; - typeof t == "string" && + (typeof t == "string" && (t = t.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n")), t[0] && t[0].substr(0, 2) === "#!" && @@ -6466,7 +6489,7 @@ (this.input = ""), (this.inComment = !1), (this.context = []), - (this.templateStarts = []); + (this.templateStarts = [])); for (var n = 0; n < o.option.indent; n += 1) o.tab += " "; this.ignoreLinterErrors = !1; } @@ -6493,7 +6516,7 @@ NoSubstTemplate: 13, }, c = { Block: 1, Template: 2 }; - (p.prototype = { + ((p.prototype = { _lines: [], inContext: function (e) { return ( @@ -6519,16 +6542,18 @@ ); }, getLines: function () { - return (this._lines = o.lines), this._lines; + return ((this._lines = o.lines), this._lines); }, setLines: function (e) { - (this._lines = e), (o.lines = this._lines); + ((this._lines = e), (o.lines = this._lines)); }, peek: function (e) { return this.input.charAt(e || 0); }, skip: function (e) { - (e = e || 1), (this.char += e), (this.input = this.input.slice(e)); + ((e = e || 1), + (this.char += e), + (this.input = this.input.slice(e))); }, on: function (e, t) { e.split(" ").forEach( @@ -6640,7 +6665,7 @@ r.forEach(function (n) { if (i) return; if (e === "//" && n !== "jshint") return; - t.charAt(n.length) === " " && + (t.charAt(n.length) === " " && t.substr(0, n.length) === n && ((i = !0), (e += n), (t = t.substr(n.length))), !i && @@ -6649,7 +6674,7 @@ t.substr(1, n.length) === n && ((i = !0), (e = e + " " + n), - (t = t.substr(n.length + 1))); + (t = t.substr(n.length + 1)))); if (!i) return; switch (n) { case "member": @@ -6669,14 +6694,14 @@ case "ignore": switch (r[1]) { case "start": - (o.ignoringLinterErrors = + ((o.ignoringLinterErrors = !0), - (i = !1); + (i = !1)); break; case "end": - (o.ignoringLinterErrors = + ((o.ignoringLinterErrors = !1), - (i = !1); + (i = !1)); } } a = n; @@ -6710,10 +6735,10 @@ null ); if (e !== "/" || (t !== "*" && t !== "/")) return null; - if (t === "/") return this.skip(this.input.length), u("//", n); + if (t === "/") return (this.skip(this.input.length), u("//", n)); var a = ""; if (t === "*") { - (this.inComment = !0), this.skip(2); + ((this.inComment = !0), this.skip(2)); while (this.peek() !== "*" || this.peek(1) !== "/") if (this.peek() === "") { a += "\n"; @@ -6727,7 +6752,7 @@ (this.inComment = !1), u("/*", a, { isMultiline: !0, isMalformed: !0 }) ); - } else (a += this.peek()), this.skip(); + } else ((a += this.peek()), this.skip()); return ( this.skip(2), (this.inComment = !1), @@ -6891,12 +6916,12 @@ a = !1; if (r !== "." && !f(r)) return null; if (r !== ".") { - (t = this.peek(e)), (e += 1), (r = this.peek(e)); + ((t = this.peek(e)), (e += 1), (r = this.peek(e))); if (t === "0") { if (r === "x" || r === "X") - (s = p), (u = 16), (e += 1), (t += r); + ((s = p), (u = 16), (e += 1), (t += r)); if (r === "o" || r === "O") - (s = c), + ((s = c), (u = 8), o.inES6(!0) || this.trigger("warning", { @@ -6906,9 +6931,9 @@ data: ["Octal integer literal", "6"], }), (e += 1), - (t += r); + (t += r)); if (r === "b" || r === "B") - (s = h), + ((s = h), (u = 2), o.inES6(!0) || this.trigger("warning", { @@ -6918,21 +6943,21 @@ data: ["Binary integer literal", "6"], }), (e += 1), - (t += r); - c(r) && + (t += r)); + (c(r) && ((s = c), (u = 8), (a = !0), (i = !1), (e += 1), (t += r)), - !c(r) && f(r) && ((e += 1), (t += r)); + !c(r) && f(r) && ((e += 1), (t += r))); } while (e < n) { r = this.peek(e); if (a && f(r)) i = !0; else if (!s(r)) break; - (t += r), (e += 1); + ((t += r), (e += 1)); } if (s !== f) { if (!a && t.length <= 2) @@ -6955,23 +6980,23 @@ } } if (r === ".") { - (t += r), (e += 1); + ((t += r), (e += 1)); while (e < n) { r = this.peek(e); if (!f(r)) break; - (t += r), (e += 1); + ((t += r), (e += 1)); } } if (r === "e" || r === "E") { - (t += r), (e += 1), (r = this.peek(e)); - if (r === "+" || r === "-") (t += this.peek(e)), (e += 1); + ((t += r), (e += 1), (r = this.peek(e))); + if (r === "+" || r === "-") ((t += this.peek(e)), (e += 1)); r = this.peek(e); if (!f(r)) return null; - (t += r), (e += 1); + ((t += r), (e += 1)); while (e < n) { r = this.peek(e); if (!f(r)) break; - (t += r), (e += 1); + ((t += r), (e += 1)); } } if (e < n) { @@ -7036,7 +7061,7 @@ case "u": var s = this.input.substr(1, 4), u = parseInt(s, 16); - isNaN(u) && + (isNaN(u) && this.trigger("warning", { code: "W052", line: this.line, @@ -7044,10 +7069,10 @@ data: ["u" + s], }), (r = String.fromCharCode(u)), - (n = 5); + (n = 5)); break; case "v": - this.triggerAsync( + (this.triggerAsync( "warning", { code: "W114", @@ -7060,11 +7085,11 @@ return o.jsonMode; }, ), - (r = "\x0b"); + (r = "\x0b")); break; case "x": var a = parseInt(this.input.substr(1, 2), 16); - this.triggerAsync( + (this.triggerAsync( "warning", { code: "W114", @@ -7078,7 +7103,7 @@ }, ), (r = String.fromCharCode(a)), - (n = 3); + (n = 3)); break; case "\\": r = "\\\\"; @@ -7089,7 +7114,7 @@ case "/": break; case "": - (t = !0), (r = ""); + ((t = !0), (r = "")); } return { char: r, jump: n, allowNewLine: t }; }, @@ -7102,14 +7127,14 @@ u = this.templateStarts.length; if (!o.inES6(!0)) return null; if (this.peek() === "`") - (t = l.TemplateHead), + ((t = l.TemplateHead), this.templateStarts.push({ line: this.line, char: this.char, }), (u = this.templateStarts.length), this.skip(1), - this.pushContext(c.Template); + this.pushContext(c.Template)); else { if (!this.inContext(c.Template) || this.peek() !== "}") return null; @@ -7154,7 +7179,7 @@ ); if (r === "\\") { var f = this.scanEscapeSequence(e); - (n += f.char), this.skip(f.jump); + ((n += f.char), this.skip(f.jump)); } else r !== "`" && ((n += r), this.skip(1)); } return ( @@ -7250,9 +7275,9 @@ }); if (u === "\\") { var f = this.scanEscapeSequence(e); - (u = f.char), (a = f.jump), (s = f.allowNewLine); + ((u = f.char), (a = f.jump), (s = f.allowNewLine)); } - (n += u), this.skip(a); + ((n += u), this.skip(a)); } return ( this.skip(), @@ -7277,7 +7302,7 @@ u = !1, a, f = function () { - n < " " && + (n < " " && ((o = !0), this.trigger("warning", { code: "W048", @@ -7291,14 +7316,14 @@ line: this.line, character: this.char, data: [n], - })); + }))); }.bind(this); if (!this.prereg || n !== "/") return null; - (e += 1), (a = !1); + ((e += 1), (a = !1)); while (e < t) { - (n = this.peek(e)), (r += n), (i += n); + ((n = this.peek(e)), (r += n), (i += n)); if (u) { - n === "]" && + (n === "]" && (this.peek(e - 1) !== "\\" || this.peek(e - 2) === "\\") && (u = !1), @@ -7308,11 +7333,11 @@ (i += n), (r += n), f()), - (e += 1); + (e += 1)); continue; } if (n === "\\") { - (e += 1), (n = this.peek(e)), (i += n), (r += n), f(); + ((e += 1), (n = this.peek(e)), (i += n), (r += n), f()); if (n === "/") { e += 1; continue; @@ -7323,11 +7348,11 @@ } } if (n === "[") { - (u = !0), (e += 1); + ((u = !0), (e += 1)); continue; } if (n === "/") { - (i = i.substr(0, i.length - 1)), (a = !0), (e += 1); + ((i = i.substr(0, i.length - 1)), (a = !0), (e += 1)); break; } e += 1; @@ -7347,18 +7372,18 @@ while (e < t) { n = this.peek(e); if (!/[gim]/.test(n)) break; - s.push(n), (r += n), (e += 1); + (s.push(n), (r += n), (e += 1)); } try { new RegExp(i, s.join("")); } catch (c) { - (o = !0), + ((o = !0), this.trigger("error", { code: "E016", line: this.line, character: this.char, data: [c.message], - }); + })); } return { type: l.RegExp, value: r, flags: s, isMalformed: o }; }, @@ -7373,7 +7398,7 @@ var t; if (/\s/.test(this.peek())) { t = this.char; - while (/\s/.test(this.peek())) (this.from += 1), this.skip(); + while (/\s/.test(this.peek())) ((this.from += 1), this.skip()); } var n = this.scanComments() || @@ -7392,10 +7417,10 @@ nextLine: function () { var e; if (this.line >= this.getLines().length) return !1; - (this.input = this.getLines()[this.line]), + ((this.input = this.getLines()[this.line]), (this.line += 1), (this.char = 1), - (this.from = 1); + (this.from = 1)); var t = this.input.trim(), n = function () { return r.some(arguments, function (e) { @@ -7407,7 +7432,7 @@ return t.indexOf(e, t.length - e.length) !== -1; }); }; - this.ignoringLinterErrors === !0 && + (this.ignoringLinterErrors === !0 && !n("/*", "//") && (!this.inComment || !i("*/")) && (this.input = ""), @@ -7425,7 +7450,7 @@ code: "W100", line: this.line, character: e, - }); + })); if ( !this.ignoringLinterErrors && o.option.maxlen && @@ -7694,7 +7719,7 @@ }, }), (n.Lexer = p), - (n.Context = c); + (n.Context = c)); }, { "../data/ascii-identifier-data.js": @@ -7911,7 +7936,7 @@ I002: null, I003: "ES5 option is now set per default", }; - (n.errors = {}), + ((n.errors = {}), (n.warnings = {}), (n.info = {}), r.each(i, function (e, t) { @@ -7922,7 +7947,7 @@ }), r.each(o, function (e, t) { n.info[t] = { code: t, desc: e }; - }); + })); }, { "../lodash": "/node_modules/jshint/lodash.js" }, ], @@ -7932,7 +7957,7 @@ function r() { this._stack = []; } - Object.defineProperty(r.prototype, "length", { + (Object.defineProperty(r.prototype, "length", { get: function () { return this._stack.length; }, @@ -7962,14 +7987,14 @@ t + e.value)) : "(empty)"; }), - (t.exports = r); + (t.exports = r)); }, {}, ], "/node_modules/jshint/src/options.js": [ function (e, t, n) { "use strict"; - (n.bool = { + ((n.bool = { enforcing: { bitwise: !0, freeze: !0, @@ -8090,14 +8115,14 @@ smarttabs: !0, trailing: !0, }), - (n.noenforceall = { varstmt: !0, strict: !0 }); + (n.noenforceall = { varstmt: !0, strict: !0 })); }, {}, ], "/node_modules/jshint/src/reg.js": [ function (e, t, n) { "use strict"; - (n.unsafeString = /@cc|<\/?|script|\]\s*\]|<\s*!|</i), + ((n.unsafeString = /@cc|<\/?|script|\]\s*\]|<\s*!|</i), (n.unsafeChars = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/), (n.needEsc = @@ -8109,7 +8134,7 @@ (n.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i), (n.fallsThrough = /^\s*falls?\sthrough\s*$/), - (n.maxlenException = /^(?:(?:\/\/|\/\*|\*) ?)?[^ ]+$/); + (n.maxlenException = /^(?:(?:\/\/|\/\*|\*) ?)?[^ ]+$/)); }, {}, ], @@ -8121,7 +8146,7 @@ s = {}, o = function (e, t, n, o) { function f(e) { - (u = { + ((u = { "(labels)": Object.create(null), "(usages)": Object.create(null), "(breakLabels)": Object.create(null), @@ -8132,7 +8157,7 @@ ? [] : null, }), - a.push(u); + a.push(u)); } function v(e, t) { d.emit("warning", { @@ -8204,9 +8229,9 @@ s = !r; for (var o = 0; o < a.length; o++) { var f = a[o]; - !i && a[o + 1] === l && (s = !1), + (!i && a[o + 1] === l && (s = !1), s && f["(labels)"][t] && v("W123", n, t), - f["(breakLabels)"][t] && v("W123", n, t); + f["(breakLabels)"][t] && v("W123", n, t)); } } function N(t, n, r) { @@ -8217,7 +8242,7 @@ } var u, a = []; - f("global"), (u["(predefined)"] = t); + (f("global"), (u["(predefined)"] = t)); var l = u, c = Object.create(null), h = Object.create(null), @@ -8240,12 +8265,12 @@ "last-param": ["var", "param"], strict: ["var", "param", "last-param"], }; - r && + (r && u[r] && u[r].indexOf(n) !== -1 && v("W098", { line: i, from: s }, o), (r || n === "var") && - p.push({ name: e, line: i, character: s }); + p.push({ name: e, line: i, character: s })); }, C = { on: function (e, t) { @@ -8258,12 +8283,12 @@ }, stack: function (e) { var t = u; - f(e), + (f(e), !e && t["(type)"] === "functionparams" && ((u["(isFuncBody)"] = !0), (u["(context)"] = l), - (l = u)); + (l = u))); }, unstack: function () { var t = a.length > 1 ? a[a.length - 2] : null, @@ -8314,14 +8339,14 @@ f && (e.funct["(isCapturing)"] = !0); if (t) if (!t["(usages)"][S]) - (t["(usages)"][S] = x), + ((t["(usages)"][S] = x), n && (t["(usages)"][S][ "(onlyUsedSubFunction)" - ] = !0); + ] = !0)); else { var k = t["(usages)"][S]; - (k["(modified)"] = k["(modified)"].concat( + ((k["(modified)"] = k["(modified)"].concat( x["(modified)"], )), (k["(tokens)"] = k["(tokens)"].concat( @@ -8330,10 +8355,10 @@ (k["(reassigned)"] = k[ "(reassigned)" ].concat(x["(reassigned)"])), - (k["(onlyUsedSubFunction)"] = !1); + (k["(onlyUsedSubFunction)"] = !1)); } else if (typeof u["(predefined)"][S] == "boolean") { - delete o[S], (c[S] = s); + (delete o[S], (c[S] = s)); if ( u["(predefined)"][S] === !1 && x["(reassigned)"] @@ -8380,7 +8405,7 @@ delete y[O]); } } - w(), + (w(), a.pop(), n && (l = @@ -8392,7 +8417,7 @@ ); }) ]), - (u = t); + (u = t)); }, addParam: function (t, n, i) { i = i || "param"; @@ -8506,15 +8531,15 @@ ? N(o, t, a) : v("E056", a, t, o); } - p + (p ? v("E011", a, t) : e.option.shadow === "outer" && C.funct.has(t) && v("W004", a, t), - C.block.add(t, o, a, !h); + C.block.add(t, o, a, !h)); } else { var m = C.funct.has(t); - !m && x(t) && N(o, t, a), + (!m && x(t) && N(o, t, a), C.funct.has(t, { onlyBlockscoped: !0 }) ? v("E011", a, t) : e.option.shadow !== !0 && @@ -8523,7 +8548,7 @@ l["(type)"] !== "global" && v("W004", a, t), C.funct.add(t, o, a, !h), - l["(type)"] === "global" && (c[t] = s); + l["(type)"] === "global" && (c[t] = s)); } }, funct: { @@ -8571,7 +8596,7 @@ }, use: function (t, n) { var r = l["(parent)"]; - r && + (r && r["(labels)"][t] && r["(labels)"][t]["(type)"] === "param" && (C.funct.has(t, { @@ -8585,14 +8610,14 @@ g(t), n && ((n["(function)"] = l), - u["(usages)"][t]["(tokens)"].push(n)); + u["(usages)"][t]["(tokens)"].push(n))); }, reassign: function (e, t) { - this.modify(e, t), - u["(usages)"][e]["(reassigned)"].push(t); + (this.modify(e, t), + u["(usages)"][e]["(reassigned)"].push(t)); }, modify: function (e, t) { - g(e), u["(usages)"][e]["(modified)"].push(t); + (g(e), u["(usages)"][e]["(modified)"].push(t)); }, add: function (e, t, n, r) { u["(labels)"][e] = { @@ -8604,11 +8629,11 @@ }, addBreakLabel: function (t, n) { var r = n.token; - C.funct.hasBreakLabel(t) + (C.funct.hasBreakLabel(t) ? v("E011", r, t) : e.option.shadow === "outer" && (C.funct.has(t) ? v("W004", r, t) : T(t, r)), - (u["(breakLabels)"][t] = r); + (u["(breakLabels)"][t] = r)); }, }, }; @@ -8650,7 +8675,7 @@ this.option.moz; }, reset: function () { - (this.tokens = { prev: null, next: null, curr: null }), + ((this.tokens = { prev: null, next: null, curr: null }), (this.option = {}), (this.funct = null), (this.ignored = {}), @@ -8663,7 +8688,7 @@ (this.ignoredLines = {}), (this.forinifcheckneeded = !1), (this.nameStack = new r()), - (this.inClassBody = !1); + (this.inClassBody = !1)); }, }; n.state = i; @@ -8674,7 +8699,7 @@ function (e, t, n) { "use strict"; n.register = function (e) { - e.on("Identifier", function (n) { + (e.on("Identifier", function (n) { if (e.getOption("proto")) return; n.name === "__proto__" && e.warn("W103", { @@ -8706,16 +8731,16 @@ var r = e.getOption("quotmark"), i; if (!r) return; - r === "single" && n.quote !== "'" && (i = "W109"), + (r === "single" && n.quote !== "'" && (i = "W109"), r === "double" && n.quote !== '"' && (i = "W108"), r === !0 && (e.getCache("quotmark") || e.setCache("quotmark", n.quote), e.getCache("quotmark") !== n.quote && (i = "W110")), - i && e.warn(i, { line: n.line, char: n.char }); + i && e.warn(i, { line: n.line, char: n.char })); }), e.on("Number", function (n) { - n.value.charAt(0) === "." && + (n.value.charAt(0) === "." && e.warn("W008", { line: n.line, char: n.char, @@ -8732,7 +8757,7 @@ line: n.line, char: n.char, data: [n.value], - }); + })); }), e.on("String", function (n) { var r = @@ -8740,7 +8765,7 @@ if (e.getOption("scripturl")) return; r.test(n.value) && e.warn("W107", { line: n.line, char: n.char }); - }); + })); }; }, {}, @@ -8748,7 +8773,7 @@ "/node_modules/jshint/src/vars.js": [ function (e, t, n) { "use strict"; - (n.reservedVars = { arguments: !1, NaN: !1 }), + ((n.reservedVars = { arguments: !1, NaN: !1 }), (n.ecmaIdentifiers = { 3: { Array: !1, @@ -9404,7 +9429,7 @@ fdescribe: !1, fit: !1, pending: !1, - }); + })); }, {}, ], @@ -9448,12 +9473,12 @@ "'{a}' used out of scope", ]), JavaScriptWorker = (exports.JavaScriptWorker = function (e) { - Mirror.call(this, e), this.setTimeout(500), this.setOptions(); + (Mirror.call(this, e), this.setTimeout(500), this.setOptions()); }); - oop.inherits(JavaScriptWorker, Mirror), + (oop.inherits(JavaScriptWorker, Mirror), function () { - (this.setOptions = function (e) { - (this.options = e || { + ((this.setOptions = function (e) { + ((this.options = e || { esnext: !0, moz: !0, devel: !0, @@ -9469,11 +9494,11 @@ multistr: !0, globalstrict: !0, }), - this.doc.getValue() && this.deferredUpdate.schedule(100); + this.doc.getValue() && this.deferredUpdate.schedule(100)); }), (this.changeOptions = function (e) { - oop.mixin(this.options, e), - this.doc.getValue() && this.deferredUpdate.schedule(100); + (oop.mixin(this.options, e), + this.doc.getValue() && this.deferredUpdate.schedule(100)); }), (this.isValidJS = function (str) { try { @@ -9499,11 +9524,11 @@ a = "warning"; if (u == "Missing semicolon.") { var f = o.evidence.substr(o.character); - (f = f.charAt(f.search(/\S/))), + ((f = f.charAt(f.search(/\S/))), n == "error" && f && /[\w\d{(['"]/.test(f) ? ((o.reason = 'Missing ";" before statement'), (a = "error")) - : (a = "info"); + : (a = "info")); } else { if (disabledWarningsRe.test(u)) continue; infoRe.test(u) @@ -9514,24 +9539,24 @@ ? (a = "warning") : u == "'{a}' is defined but never used." && (a = "info"); } - t.push({ + (t.push({ row: o.line - 1, column: o.character - 1, text: o.reason, type: a, raw: u, }), - i; + i); } this.sender.emit("annotate", t); - }); - }.call(JavaScriptWorker.prototype); + })); + }.call(JavaScriptWorker.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -9604,35 +9629,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -9645,7 +9670,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -9672,7 +9697,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -9774,15 +9799,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -9792,8 +9817,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -9815,9 +9840,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -9826,7 +9851,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -9853,10 +9878,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -9879,16 +9904,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -9900,7 +9925,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -9910,7 +9935,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -9929,8 +9954,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -9975,4 +10000,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/ace/worker-json.js b/web/static/ace/worker-json.js index 74b5885a6..34fffbcde 100644 --- a/web/static/ace/worker-json.js +++ b/web/static/ace/worker-json.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,7 +160,7 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -168,10 +168,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -316,11 +316,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -329,7 +329,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -340,11 +340,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -366,9 +366,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -389,18 +389,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -417,7 +417,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -426,7 +426,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -465,18 +465,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -495,7 +495,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -514,16 +514,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -541,7 +541,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -552,19 +552,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -581,7 +581,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -597,7 +597,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -625,8 +625,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -707,10 +707,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -753,8 +753,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -789,7 +789,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -813,7 +813,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -822,12 +822,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -853,13 +853,13 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -872,10 +872,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -942,18 +942,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -964,28 +964,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,7 +1025,7 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/json/json_parse", [], function (e, t, n) { @@ -1049,15 +1049,15 @@ var e, t = ""; i === "-" && ((t = "-"), a("-")); - while (i >= "0" && i <= "9") (t += i), a(); + while (i >= "0" && i <= "9") ((t += i), a()); if (i === ".") { t += "."; while (a() && i >= "0" && i <= "9") t += i; } if (i === "e" || i === "E") { - (t += i), a(); - if (i === "-" || i === "+") (t += i), a(); - while (i >= "0" && i <= "9") (t += i), a(); + ((t += i), a()); + if (i === "-" || i === "+") ((t += i), a()); + while (i >= "0" && i <= "9") ((t += i), a()); } e = +t; if (!isNaN(e)) return e; @@ -1070,7 +1070,7 @@ r; if (i === '"') while (a()) { - if (i === '"') return a(), n; + if (i === '"') return (a(), n); if (i === "\\") { a(); if (i === "u") { @@ -1098,11 +1098,11 @@ h = function () { switch (i) { case "t": - return a("t"), a("r"), a("u"), a("e"), !0; + return (a("t"), a("r"), a("u"), a("e"), !0); case "f": - return a("f"), a("a"), a("l"), a("s"), a("e"), !1; + return (a("f"), a("a"), a("l"), a("s"), a("e"), !1); case "n": - return a("n"), a("u"), a("l"), a("l"), null; + return (a("n"), a("u"), a("l"), a("l"), null); } u("Unexpected '" + i + "'"); }, @@ -1110,12 +1110,12 @@ d = function () { var e = []; if (i === "[") { - a("["), c(); - if (i === "]") return a("]"), e; + (a("["), c()); + if (i === "]") return (a("]"), e); while (i) { - e.push(p()), c(); - if (i === "]") return a("]"), e; - a(","), c(); + (e.push(p()), c()); + if (i === "]") return (a("]"), e); + (a(","), c()); } } u("Bad array"); @@ -1124,17 +1124,17 @@ var e, t = {}; if (i === "{") { - a("{"), c(); - if (i === "}") return a("}"), t; + (a("{"), c()); + if (i === "}") return (a("}"), t); while (i) { - (e = l()), + ((e = l()), c(), a(":"), Object.hasOwnProperty.call(t, e) && u('Duplicate key "' + e + '"'), (t[e] = p()), - c(); - if (i === "}") return a("}"), t; - a(","), c(); + c()); + if (i === "}") return (a("}"), t); + (a(","), c()); } } u("Bad object"); @@ -1187,9 +1187,9 @@ i = e("../worker/mirror").Mirror, s = e("./json/json_parse"), o = (t.JsonWorker = function (e) { - i.call(this, e), this.setTimeout(200); + (i.call(this, e), this.setTimeout(200)); }); - r.inherits(o, i), + (r.inherits(o, i), function () { this.onUpdate = function () { var e = this.doc.getValue(), @@ -1202,13 +1202,13 @@ } this.sender.emit("annotate", t); }; - }.call(o.prototype); + }.call(o.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -1281,35 +1281,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -1322,7 +1322,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -1349,7 +1349,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -1451,15 +1451,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -1469,8 +1469,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -1492,9 +1492,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -1503,7 +1503,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -1530,10 +1530,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -1556,16 +1556,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -1577,7 +1577,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -1587,7 +1587,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -1606,8 +1606,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -1652,4 +1652,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/ace/worker-lua.js b/web/static/ace/worker-lua.js index fd69b08db..0601dc26a 100644 --- a/web/static/ace/worker-lua.js +++ b/web/static/ace/worker-lua.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,7 +160,7 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -168,10 +168,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -316,11 +316,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -329,7 +329,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -340,11 +340,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -366,9 +366,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -389,18 +389,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -417,7 +417,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -426,7 +426,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -465,18 +465,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -495,7 +495,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -514,16 +514,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -541,7 +541,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -552,19 +552,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -581,7 +581,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -597,7 +597,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -625,8 +625,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -707,10 +707,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -753,8 +753,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -789,7 +789,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -813,7 +813,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -822,12 +822,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -853,13 +853,13 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -872,10 +872,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -942,18 +942,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -964,28 +964,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,7 +1025,7 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/lua/luaparse", [], function (e, t, n) { @@ -1036,7 +1036,7 @@ function m(e) { if (mt) { var t = vt.pop(); - t.complete(), n.locations && (e.loc = t.loc), n.ranges && (e.range = t.range); + (t.complete(), n.locations && (e.loc = t.loc), n.ranges && (e.range = t.range)); } return e; } @@ -1069,7 +1069,7 @@ n, r; throw ( - ("undefined" != typeof e.line + "undefined" != typeof e.line ? ((r = e.range[0] - e.lineStart), (n = new SyntaxError(E("[%1:%2] %3", e.line, r, t))), (n.line = e.line), @@ -1080,7 +1080,7 @@ (n.index = C), (n.line = _), (n.column = r)), - n) + n ); } function T(e, t) { @@ -1118,7 +1118,7 @@ } function P() { H(); - while (45 === t.charCodeAt(C) && 45 === t.charCodeAt(C + 1)) X(), H(); + while (45 === t.charCodeAt(C) && 45 === t.charCodeAt(C + 1)) (X(), H()); if (C >= r) return { type: s, value: "", line: _, lineStart: D, range: [C, C] }; var e = t.charCodeAt(C), @@ -1188,7 +1188,7 @@ if (Q(e)) C++; else { if (!G(e)) break; - _++, (D = ++C); + (_++, (D = ++C)); } } } @@ -1208,10 +1208,13 @@ ); } function j(e) { - return (C += e.length), { type: l, value: e, line: _, lineStart: D, range: [M, C] }; + return ( + (C += e.length), + { type: l, value: e, line: _, lineStart: D, range: [M, C] } + ); } function F() { - return (C += 3), { type: p, value: "...", line: _, lineStart: D, range: [M, C] }; + return ((C += 3), { type: p, value: "...", line: _, lineStart: D, range: [M, C] }); } function I() { var e = t.charCodeAt(C++), @@ -1221,10 +1224,10 @@ while (C < r) { s = t.charCodeAt(C++); if (e === s) break; - if (92 === s) (i += t.slice(n, C - 1) + W()), (n = C); + if (92 === s) ((i += t.slice(n, C - 1) + W()), (n = C)); else if (C >= r || G(s)) - (i += t.slice(n, C - 1)), - x({}, d.unfinishedString, i + String.fromCharCode(s)); + ((i += t.slice(n, C - 1)), + x({}, d.unfinishedString, i + String.fromCharCode(s))); } return ( (i += t.slice(n, C - 1)), @@ -1252,22 +1255,23 @@ s, o, u; - (u = C += 2), Z(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C)); + ((u = C += 2), Z(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C))); while (Z(t.charCodeAt(C))) C++; i = parseInt(t.slice(u, C), 16); if ("." === t.charAt(C)) { s = ++C; while (Z(t.charCodeAt(C))) C++; - (e = t.slice(s, C)), (e = s === C ? 0 : parseInt(e, 16) / Math.pow(16, C - s)); + ((e = t.slice(s, C)), + (e = s === C ? 0 : parseInt(e, 16) / Math.pow(16, C - s))); } if ("pP".indexOf(t.charAt(C) || null) >= 0) { - C++, + (C++, "+-".indexOf(t.charAt(C) || null) >= 0 && (r = "+" === t.charAt(C++) ? 1 : -1), (o = C), - Y(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C)); + Y(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C))); while (Y(t.charCodeAt(C))) C++; - (n = t.slice(o, C)), (n = Math.pow(2, n * r)); + ((n = t.slice(o, C)), (n = Math.pow(2, n * r))); } return (i + e) * n; } @@ -1278,9 +1282,9 @@ while (Y(t.charCodeAt(C))) C++; } if ("eE".indexOf(t.charAt(C) || null) >= 0) { - C++, + (C++, "+-".indexOf(t.charAt(C) || null) >= 0 && C++, - Y(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C)); + Y(t.charCodeAt(C)) || x({}, d.malformedNumber, t.slice(M, C))); while (Y(t.charCodeAt(C))) C++; } return parseFloat(t.slice(M, C)); @@ -1289,22 +1293,22 @@ var e = C; switch (t.charAt(C)) { case "n": - return C++, "\n"; + return (C++, "\n"); case "r": - return C++, "\r"; + return (C++, "\r"); case "t": - return C++, " "; + return (C++, " "); case "v": - return C++, "\x0b"; + return (C++, "\x0b"); case "b": - return C++, "\b"; + return (C++, "\b"); case "f": - return C++, "\f"; + return (C++, "\f"); case "z": - return C++, H(), ""; + return (C++, H(), ""); case "x": if (Z(t.charCodeAt(C + 1)) && Z(t.charCodeAt(C + 2))) - return (C += 3), "\\" + t.slice(e, C); + return ((C += 3), "\\" + t.slice(e, C)); return "\\" + t.charAt(C++); default: if (Y(t.charCodeAt(C))) { @@ -1315,7 +1319,7 @@ } } function X() { - (M = C), (C += 2); + ((M = C), (C += 2)); var e = t.charAt(C), i = "", s = !1, @@ -1332,13 +1336,13 @@ } if (n.comments) { var f = v.comment(i, t.slice(M, C)); - n.locations && + (n.locations && (f.loc = { start: { line: a, column: M - u }, end: { line: _, column: C - D }, }), n.ranges && (f.range = [M, C]), - O.push(f); + O.push(f)); } } function V() { @@ -1350,9 +1354,9 @@ C++; while ("=" === t.charAt(C + e)) e++; if ("[" !== t.charAt(C + e)) return !1; - (C += e + 1), G(t.charCodeAt(C)) && (_++, (D = C++)), (o = C); + ((C += e + 1), G(t.charCodeAt(C)) && (_++, (D = C++)), (o = C)); while (C < r) { - (s = t.charAt(C++)), G(s.charCodeAt(0)) && (_++, (D = C)); + ((s = t.charAt(C++)), G(s.charCodeAt(0)) && (_++, (D = C))); if ("]" === s) { i = !0; for (var u = 0; u < e; u++) "=" !== t.charAt(C + u) && (i = !1); @@ -1360,10 +1364,10 @@ } if (i) break; } - return (n += t.slice(o, C - 1)), (C += e + 1), n; + return ((n += t.slice(o, C - 1)), (C += e + 1), n); } function $() { - (L = k), (k = A), (A = P()); + ((L = k), (k = A), (A = P())); } function J(e) { return e === k.value ? ($(), !0) : !1; @@ -1444,17 +1448,17 @@ ot.push(Array.apply(null, ot[ut++])); } function lt() { - ot.pop(), ut--; + (ot.pop(), ut--); } function ct(e) { if (-1 !== b(ot[ut], e)) return; ot[ut].push(e); } function ht(e) { - ct(e.name), pt(e, !0); + (ct(e.name), pt(e, !0)); } function pt(e, t) { - !t && -1 === w(at, "name", e.name) && at.push(e), (e.isLocal = t); + (!t && -1 === w(at, "name", e.name) && at.push(e), (e.isLocal = t)); } function dt(e) { return -1 !== b(ot[ut], e); @@ -1463,12 +1467,12 @@ return new yt(k); } function yt(e) { - n.locations && + (n.locations && (this.loc = { start: { line: e.line, column: e.range[0] - e.lineStart }, end: { line: 0, column: 0 }, }), - n.ranges && (this.range = [e.range[0], 0]); + n.ranges && (this.range = [e.range[0], 0])); } function bt() { mt && vt.push(gt()); @@ -1477,9 +1481,9 @@ mt && vt.push(e); } function Et() { - $(), bt(); + ($(), bt()); var e = St(); - return s !== k.type && N(k), mt && !e.length && (L = k), m(v.chunk(e)); + return (s !== k.type && N(k), mt && !e.length && (L = k), m(v.chunk(e))); } function St(e) { var t = [], @@ -1490,36 +1494,36 @@ t.push(xt()); break; } - (r = xt()), r && t.push(r); + ((r = xt()), r && t.push(r)); } - return n.scope && lt(), t; + return (n.scope && lt(), t); } function xt() { bt(); if (u === k.type) switch (k.value) { case "local": - return $(), Dt(); + return ($(), Dt()); case "if": - return $(), Mt(); + return ($(), Mt()); case "return": - return $(), Ot(); + return ($(), Ot()); case "function": $(); var e = jt(); return Bt(e); case "while": - return $(), Lt(); + return ($(), Lt()); case "for": - return $(), _t(); + return ($(), _t()); case "repeat": - return $(), At(); + return ($(), At()); case "break": - return $(), Nt(); + return ($(), Nt()); case "do": - return $(), kt(); + return ($(), kt()); case "goto": - return $(), Ct(); + return ($(), Ct()); } if (l === k.type && J("::")) return Tt(); mt && vt.pop(); @@ -1529,7 +1533,11 @@ function Tt() { var e = k.value, t = Ht(); - return n.scope && (ct("::" + e + "::"), pt(t, !0)), K("::"), m(v.labelStatement(t)); + return ( + n.scope && (ct("::" + e + "::"), pt(t, !0)), + K("::"), + m(v.labelStatement(t)) + ); } function Nt() { return m(v.breakStatement()); @@ -1537,17 +1545,17 @@ function Ct() { var e = k.value, t = Ht(); - return n.scope && (t.isLabel = dt("::" + e + "::")), m(v.gotoStatement(t)); + return (n.scope && (t.isLabel = dt("::" + e + "::")), m(v.gotoStatement(t))); } function kt() { var e = St(); - return K("end"), m(v.doStatement(e)); + return (K("end"), m(v.doStatement(e))); } function Lt() { var e = qt(); K("do"); var t = St(); - return K("end"), m(v.whileStatement(e, t)); + return (K("end"), m(v.whileStatement(e, t))); } function At() { var e = St(); @@ -1560,7 +1568,7 @@ if ("end" !== k.value) { var t = It(); null != t && e.push(t); - while (J(",")) (t = qt()), e.push(t); + while (J(",")) ((t = qt()), e.push(t)); J(";"); } return m(v.returnStatement(e)); @@ -1570,19 +1578,19 @@ t, n, r; - mt && ((r = vt[vt.length - 1]), vt.push(r)), + (mt && ((r = vt[vt.length - 1]), vt.push(r)), (t = qt()), K("then"), (n = St()), e.push(m(v.ifClause(t, n))), - mt && (r = gt()); + mt && (r = gt())); while (J("elseif")) - wt(r), + (wt(r), (t = qt()), K("then"), (n = St()), e.push(m(v.elseifClause(t, n))), - mt && (r = gt()); + mt && (r = gt())); return ( J("else") && (mt && ((r = new yt(L)), vt.push(r)), @@ -1601,24 +1609,24 @@ K(","); var i = qt(), s = J(",") ? qt() : null; - return K("do"), (t = St()), K("end"), m(v.forNumericStatement(e, r, i, s, t)); + return (K("do"), (t = St()), K("end"), m(v.forNumericStatement(e, r, i, s, t))); } var o = [e]; - while (J(",")) (e = Ht()), n.scope && ht(e), o.push(e); + while (J(",")) ((e = Ht()), n.scope && ht(e), o.push(e)); K("in"); var u = []; do { var a = qt(); u.push(a); } while (J(",")); - return K("do"), (t = St()), K("end"), m(v.forGenericStatement(o, u, t)); + return (K("do"), (t = St()), K("end"), m(v.forGenericStatement(o, u, t))); } function Dt() { var e; if (a === k.type) { var t = [], r = []; - do (e = Ht()), t.push(e); + do ((e = Ht()), t.push(e)); while (J(",")); if (J("=")) do { @@ -1628,31 +1636,31 @@ if (n.scope) for (var s = 0, o = t.length; s < o; s++) ht(t[s]); return m(v.localStatement(t, r)); } - if (J("function")) return (e = Ht()), n.scope && ht(e), Bt(e, !0); + if (J("function")) return ((e = Ht()), n.scope && ht(e), Bt(e, !0)); T("", k); } function Pt() { var e = k, t, n; - mt && (n = gt()), (t = zt()); + (mt && (n = gt()), (t = zt())); if (null == t) return N(k); if (",=".indexOf(k.value) >= 0) { var r = [t], i = [], s; - while (J(",")) (s = zt()), null == s && T("", k), r.push(s); + while (J(",")) ((s = zt()), null == s && T("", k), r.push(s)); K("="); - do (s = qt()), i.push(s); + do ((s = qt()), i.push(s)); while (J(",")); - return wt(n), m(v.assignmentStatement(r, i)); + return (wt(n), m(v.assignmentStatement(r, i))); } return it(t) ? (wt(n), m(v.callStatement(t))) : N(e); } function Ht() { bt(); var e = k.value; - return a !== k.type && T("", k), $(), m(v.identifier(e)); + return (a !== k.type && T("", k), $(), m(v.identifier(e))); } function Bt(e, t) { var r = []; @@ -1661,24 +1669,27 @@ for (;;) if (a === k.type) { var i = Ht(); - n.scope && ht(i), r.push(i); + (n.scope && ht(i), r.push(i)); if (J(",")) continue; if (J(")")) break; } else { if (p === k.type) { - r.push(Xt()), K(")"); + (r.push(Xt()), K(")")); break; } T(" or '...'", k); } var s = St(); - return K("end"), (t = t || !1), m(v.functionStatement(e, r, t, s)); + return (K("end"), (t = t || !1), m(v.functionStatement(e, r, t, s))); } function jt() { var e, t, r; - mt && (r = gt()), (e = Ht()), n.scope && pt(e, !1); + (mt && (r = gt()), (e = Ht()), n.scope && pt(e, !1)); while (J(".")) - wt(r), (t = Ht()), n.scope && pt(t, !1), (e = m(v.memberExpression(e, ".", t))); + (wt(r), + (t = Ht()), + n.scope && pt(t, !1), + (e = m(v.memberExpression(e, ".", t)))); return ( J(":") && (wt(r), @@ -1695,12 +1706,12 @@ for (;;) { bt(); if (l === k.type && J("[")) - (t = qt()), K("]"), K("="), (n = qt()), e.push(m(v.tableKey(t, n))); + ((t = qt()), K("]"), K("="), (n = qt()), e.push(m(v.tableKey(t, n)))); else if (a === k.type) - (t = qt()), + ((t = qt()), J("=") ? ((n = qt()), e.push(m(v.tableKeyString(t, n)))) - : e.push(m(v.tableValue(t))); + : e.push(m(v.tableValue(t)))); else { if (null == (n = It())) { vt.pop(); @@ -1714,7 +1725,7 @@ } if ("}" === k.value) break; } - return K("}"), m(v.tableConstructorExpression(e)); + return (K("}"), m(v.tableConstructorExpression(e))); } function It() { var e = Ut(0); @@ -1767,65 +1778,65 @@ r; mt && (r = gt()); if (rt(k)) { - bt(), $(); + (bt(), $()); var i = Ut(8); - i == null && T("", k), (n = m(v.unaryExpression(t, i))); + (i == null && T("", k), (n = m(v.unaryExpression(t, i)))); } null == n && ((n = Xt()), null == n && (n = zt())); if (null == n) return null; var s; for (;;) { - (t = k.value), (s = l === k.type || u === k.type ? Rt(t) : 0); + ((t = k.value), (s = l === k.type || u === k.type ? Rt(t) : 0)); if (s === 0 || s <= e) break; - ("^" === t || ".." === t) && s--, $(); + (("^" === t || ".." === t) && s--, $()); var o = Ut(s); - null == o && T("", k), + (null == o && T("", k), mt && vt.push(r), - (n = m(v.binaryExpression(t, n, o))); + (n = m(v.binaryExpression(t, n, o)))); } return n; } function zt() { var e, t, r, i; mt && (r = gt()); - if (a === k.type) (t = k.value), (e = Ht()), n.scope && pt(e, (i = dt(t))); + if (a === k.type) ((t = k.value), (e = Ht()), n.scope && pt(e, (i = dt(t)))); else { if (!J("(")) return null; - (e = qt()), K(")"), n.scope && (i = e.isLocal); + ((e = qt()), K(")"), n.scope && (i = e.isLocal)); } var s, u; for (;;) if (l === k.type) switch (k.value) { case "[": - wt(r), $(), (s = qt()), (e = m(v.indexExpression(e, s))), K("]"); + (wt(r), $(), (s = qt()), (e = m(v.indexExpression(e, s))), K("]")); break; case ".": - wt(r), + (wt(r), $(), (u = Ht()), n.scope && pt(u, i), - (e = m(v.memberExpression(e, ".", u))); + (e = m(v.memberExpression(e, ".", u)))); break; case ":": - wt(r), + (wt(r), $(), (u = Ht()), n.scope && pt(u, i), (e = m(v.memberExpression(e, ":", u))), wt(r), - (e = Wt(e)); + (e = Wt(e))); break; case "(": case "{": - wt(r), (e = Wt(e)); + (wt(r), (e = Wt(e))); break; default: return e; } else { if (o !== k.type) break; - wt(r), (e = Wt(e)); + (wt(r), (e = Wt(e))); } return e; } @@ -1837,10 +1848,10 @@ var t = [], n = It(); null != n && t.push(n); - while (J(",")) (n = qt()), t.push(n); - return K(")"), m(v.callExpression(e, t)); + while (J(",")) ((n = qt()), t.push(n)); + return (K(")"), m(v.callExpression(e, t))); case "{": - bt(), $(); + (bt(), $()); var r = Ft(); return m(v.tableCallExpression(e, r)); } @@ -1856,10 +1867,10 @@ if (r & e) { wt(i); var s = t.slice(k.range[0], k.range[1]); - return $(), m(v.literal(r, n, s)); + return ($(), m(v.literal(r, n, s))); } - if (u === r && "function" === n) return wt(i), $(), Bt(null); - if (J("{")) return wt(i), Ft(); + if (u === r && "function" === n) return (wt(i), $(), Bt(null)); + if (J("{")) return (wt(i), Ft()); } function Vt(s, o) { return ( @@ -1880,15 +1891,15 @@ ); } function $t(n) { - return (t += String(n)), (r = t.length), e; + return ((t += String(n)), (r = t.length), e); } function Jt(e) { - "undefined" != typeof e && $t(e), + ("undefined" != typeof e && $t(e), (r = t.length), (mt = n.locations || n.ranges), - (A = P()); + (A = P())); var i = Et(); - n.comments && (i.comments = O), n.scope && (i.globals = at); + (n.comments && (i.comments = O), n.scope && (i.globals = at)); if (vt.length > 0) throw new Error( "Location tracking failed. This is most likely a bug in luaparse", @@ -2078,15 +2089,15 @@ at, vt = [], mt; - (yt.prototype.complete = function () { - n.locations && + ((yt.prototype.complete = function () { + (n.locations && ((this.loc.end.line = L.line), (this.loc.end.column = L.range[1] - L.lineStart)), - n.ranges && (this.range[1] = L.range[1]); + n.ranges && (this.range[1] = L.range[1])); }), (e.parse = Vt), (e.write = $t), - (e.end = Jt); + (e.end = Jt)); }); }), define("ace/mode/lua_worker", [], function (e, t, n) { @@ -2095,9 +2106,9 @@ i = e("../worker/mirror").Mirror, s = e("../mode/lua/luaparse"), o = (t.Worker = function (e) { - i.call(this, e), this.setTimeout(500); + (i.call(this, e), this.setTimeout(500)); }); - r.inherits(o, i), + (r.inherits(o, i), function () { this.onUpdate = function () { var e = this.doc.getValue(), @@ -2115,13 +2126,13 @@ } this.sender.emit("annotate", t); }; - }.call(o.prototype); + }.call(o.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -2194,35 +2205,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -2235,7 +2246,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -2262,7 +2273,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -2364,15 +2375,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -2382,8 +2393,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -2405,9 +2416,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -2416,7 +2427,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -2443,10 +2454,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -2469,16 +2480,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -2490,7 +2501,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -2500,7 +2511,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -2519,8 +2530,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -2565,4 +2576,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/ace/worker-php.js b/web/static/ace/worker-php.js index 3c88e3923..0f69a2881 100644 --- a/web/static/ace/worker-php.js +++ b/web/static/ace/worker-php.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,7 +160,7 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -168,10 +168,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -316,11 +316,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -329,7 +329,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -340,11 +340,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -366,9 +366,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -389,18 +389,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -417,7 +417,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -426,7 +426,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -465,18 +465,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -495,7 +495,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -514,16 +514,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -541,7 +541,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -552,19 +552,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -581,7 +581,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -597,7 +597,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -625,8 +625,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -707,10 +707,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -753,8 +753,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -789,7 +789,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -813,7 +813,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -822,12 +822,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -853,13 +853,13 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -872,10 +872,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -942,18 +942,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -964,28 +964,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,12 +1025,12 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/php/php", [], function (e, t, n) { var r = { Constants: {} }; - (r.Constants.T_INCLUDE = 257), + ((r.Constants.T_INCLUDE = 257), (r.Constants.T_INCLUDE_ONCE = 258), (r.Constants.T_EVAL = 259), (r.Constants.T_REQUIRE = 260), @@ -1371,7 +1371,7 @@ value: r.Constants.T_START_HEREDOC, re: new RegExp("^[bB]?<<<[ \\t]*'(" + p + ")'(?:\\r\\n|\\r|\\n)"), func: function (e) { - (n = e[1]), u("NOWDOC"); + ((n = e[1]), u("NOWDOC")); }, }, { @@ -1380,7 +1380,7 @@ '^[bB]?<<<[ \\t]*("?)(' + p + ")\\1(?:\\r\\n|\\r|\\n)", ), func: function (e) { - (n = e[2]), (i = !0), u("HEREDOC"); + ((n = e[2]), (i = !0), u("HEREDOC")); }, }, { value: r.Constants.T_SL, re: /^< 0) { - ++this.stackPos, + (++this.stackPos, (w[this.stackPos] = b = E), (this.yyastk[this.stackPos] = this.tokenValue), (y[this.stackPos] = this.startAttributes), - (g = this.TOKEN_NONE); + (g = this.TOKEN_NONE)); if (E < this.YYNLSTATES) continue; E -= this.YYNLSTATES; } else E = -E; @@ -1687,18 +1687,18 @@ } var C = ""; throw ( - (T.length && (C = ", expecting " + T.join(" or ")), + T.length && (C = ", expecting " + T.join(" or ")), new r.ParseError( "syntax error, unexpected " + p[g] + C, this.startAttributes.startLine, - )) + ) ); } return this.startAttributes.startLine; } for (var x in this.endAttributes) y[this.stackPos - u[E]][x] = this.endAttributes[x]; - (this.stackPos -= u[E]), + ((this.stackPos -= u[E]), (E = h[E]), (l = a[E] + w[this.stackPos]) >= 0 && l < this.YYGLAST && f[l] === E ? (b = c[l]) @@ -1706,17 +1706,17 @@ ++this.stackPos, (w[this.stackPos] = b), (this.yyastk[this.stackPos] = this.yyval), - (y[this.stackPos] = this.startAttributes); + (y[this.stackPos] = this.startAttributes)); if (b < this.YYNLSTATES) break; E = b - this.YYNLSTATES; } } }), (r.ParseError = function (e, t) { - (this.message = e), (this.line = t); + ((this.message = e), (this.line = t)); }), (r.Parser.prototype.getNextToken = function () { - (this.startAttributes = {}), (this.endAttributes = {}); + ((this.startAttributes = {}), (this.endAttributes = {})); var e, t; while (this.tokens[++this.pos] !== undefined) { e = this.tokens[this.pos]; @@ -1730,13 +1730,13 @@ ); this.line += (t = e[1].match(/\n/g)) === null ? 0 : t.length; if (r.Constants.T_COMMENT === e[0]) - Array.isArray(this.startAttributes.comments) || + (Array.isArray(this.startAttributes.comments) || (this.startAttributes.comments = []), this.startAttributes.comments.push({ type: "comment", comment: e[1], line: e[2], - }); + })); else if (r.Constants.T_DOC_COMMENT === e[0]) this.startAttributes.comments.push(new PHPParser_Comment_Doc(e[1], e[2])); else if (this.dropTokens[e[0]] === undefined) @@ -1747,7 +1747,7 @@ this.tokenMap[e[0]] ); } - return (this.startAttributes.startLine = this.line), 0; + return ((this.startAttributes.startLine = this.line), 0); }), (r.Parser.prototype.tokenName = function (e) { var t = [ @@ -2548,7 +2548,7 @@ 3, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 3, 3, 0, 1, 3, 1, 3, 1, 4, 2, 0, 2, 2, 1, 2, 1, 1, 4, 3, 3, 3, 6, 3, 1, 1, 1, ]), - (t.PHP = r); + (t.PHP = r)); }), define("ace/mode/php_worker", [], function (e, t, n) { "use strict"; @@ -2556,11 +2556,11 @@ i = e("../worker/mirror").Mirror, s = e("./php/php").PHP, o = (t.PhpWorker = function (e) { - i.call(this, e), this.setTimeout(500); + (i.call(this, e), this.setTimeout(500)); }); - r.inherits(o, i), + (r.inherits(o, i), function () { - (this.setOptions = function (e) { + ((this.setOptions = function (e) { this.inlinePhp = e && e.inline; }), (this.onUpdate = function () { @@ -2579,14 +2579,14 @@ }); } this.sender.emit("annotate", t); - }); - }.call(o.prototype); + })); + }.call(o.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -2659,35 +2659,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -2700,7 +2700,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -2727,7 +2727,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -2829,15 +2829,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -2847,8 +2847,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -2870,9 +2870,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -2881,7 +2881,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -2908,10 +2908,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -2934,16 +2934,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -2955,7 +2955,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -2965,7 +2965,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -2984,8 +2984,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -3030,4 +3030,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/ace/worker-xml.js b/web/static/ace/worker-xml.js index fb3cdb555..be53ab838 100644 --- a/web/static/ace/worker-xml.js +++ b/web/static/ace/worker-xml.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,11 +160,11 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -177,10 +177,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -247,18 +247,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -269,28 +269,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -298,10 +298,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -446,11 +446,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -459,7 +459,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -470,11 +470,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -496,9 +496,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -519,18 +519,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -547,7 +547,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -556,7 +556,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -595,18 +595,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -625,7 +625,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -644,16 +644,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -671,7 +671,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -682,19 +682,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -711,7 +711,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -727,7 +727,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -755,8 +755,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -837,10 +837,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -883,8 +883,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -919,7 +919,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -943,7 +943,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -952,12 +952,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -983,9 +983,9 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,7 +1025,7 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/xml/sax", [], function (e, t, n) { @@ -1050,11 +1050,11 @@ } function u(t) { var n = e.substring(v, t).replace(/&#?\w+;/g, o); - h && a(v), r.characters(n, 0, t - v), (v = t); + (h && a(v), r.characters(n, 0, t - v), (v = t)); } function a(t, n) { while (t >= l && (n = c.exec(e))) - (f = n.index), (l = f + n[0].length), h.lineNumber++; + ((f = n.index), (l = f + n[0].length), h.lineNumber++); h.columnNumber = t - f + 1; } var f = 0, @@ -1070,7 +1070,7 @@ if (!e.substr(v).match(/^\s*$/)) { var N = r.document, C = N.createTextNode(e.substr(v)); - N.appendChild(C), (r.currentElement = C); + (N.appendChild(C), (r.currentElement = C)); } return; } @@ -1086,22 +1086,22 @@ } A = p.pop(); var O = A.localNSMap; - A.tagName != L && + (A.tagName != L && i.fatalError( "end tag name: " + L + " does not match the current start tagName: " + A.tagName, ), - r.endElement(A.uri, A.localName, L); + r.endElement(A.uri, A.localName, L)); if (O) for (var M in O) r.endPrefixMapping(M); k++; break; case "?": - h && a(E), (k = x(e, E, r)); + (h && a(E), (k = x(e, E, r))); break; case "!": - h && a(E), (k = S(e, E, r, i)); + (h && a(E), (k = S(e, E, r, i))); break; default: try { @@ -1113,26 +1113,26 @@ var P = m(h, {}); for (var E = 0; E < D; E++) { var H = _[E]; - a(H.offset), (H.offset = m(h, {})); + (a(H.offset), (H.offset = m(h, {}))); } m(P, h); } - !_.closed && + (!_.closed && w(e, k, _.tagName, d) && ((_.closed = !0), n.nbsp || i.warning("unclosed xml attribute")), y(_, r, p), _.uri === "http://www.w3.org/1999/xhtml" && !_.closed ? (k = b(e, k, _.tagName, o, r)) - : k++; + : k++); } catch (B) { - i.error("element parse error: " + B), (k = -1); + (i.error("element parse error: " + B), (k = -1)); } } k < 0 ? u(E + 1) : (v = k); } } function m(e, t) { - return (t.lineNumber = e.lineNumber), (t.columnNumber = e.columnNumber), t; + return ((t.lineNumber = e.lineNumber), (t.columnNumber = e.columnNumber), t); } function g(e, t, n, r, i) { var s, @@ -1143,7 +1143,7 @@ var g = e.charAt(v); switch (g) { case "=": - if (m === u) (s = e.slice(t, v)), (m = f); + if (m === u) ((s = e.slice(t, v)), (m = f)); else { if (m !== a) throw new Error("attribute equal must after attrName"); m = f; @@ -1152,17 +1152,19 @@ case "'": case '"': if (m === f) { - (t = v + 1), (v = e.indexOf(g, t)); + ((t = v + 1), (v = e.indexOf(g, t))); if (!(v > 0)) throw new Error("attribute value no end '" + g + "' match"); - (d = e.slice(t, v).replace(/&#?\w+;/g, r)), n.add(s, d, t - 1), (m = c); + ((d = e.slice(t, v).replace(/&#?\w+;/g, r)), + n.add(s, d, t - 1), + (m = c)); } else { if (m != l) throw new Error('attribute value must after "="'); - (d = e.slice(t, v).replace(/&#?\w+;/g, r)), + ((d = e.slice(t, v).replace(/&#?\w+;/g, r)), n.add(s, d, t), i.warning('attribute "' + s + '" missed start quot(' + g + ")!!"), (t = v + 1), - (m = c); + (m = c)); } break; case "/": @@ -1172,7 +1174,7 @@ case c: case h: case p: - (m = p), (n.closed = !0); + ((m = p), (n.closed = !0)); case l: case u: case a: @@ -1193,10 +1195,10 @@ break; case l: case u: - (d = e.slice(t, v)), - d.slice(-1) === "/" && ((n.closed = !0), (d = d.slice(0, -1))); + ((d = e.slice(t, v)), + d.slice(-1) === "/" && ((n.closed = !0), (d = d.slice(0, -1)))); case a: - m === a && (d = s), + (m === a && (d = s), m == l ? (i.warning('attribute "' + d + '" missed quot(")!!'), n.add(s, d.replace(/&#?\w+;/g, r), t)) @@ -1207,7 +1209,7 @@ d + '" instead!!', ), - n.add(d, d, t)); + n.add(d, d, t))); break; case f: throw new Error("attribute value missed!!"); @@ -1219,22 +1221,22 @@ if (g <= " ") switch (m) { case o: - n.setTagName(e.slice(t, v)), (m = h); + (n.setTagName(e.slice(t, v)), (m = h)); break; case u: - (s = e.slice(t, v)), (m = a); + ((s = e.slice(t, v)), (m = a)); break; case l: var d = e.slice(t, v).replace(/&#?\w+;/g, r); - i.warning('attribute "' + d + '" missed quot(")!!'), - n.add(s, d, t); + (i.warning('attribute "' + d + '" missed quot(")!!'), + n.add(s, d, t)); case c: m = h; } else switch (m) { case a: - i.warning( + (i.warning( 'attribute "' + s + '" missed value!! "' + @@ -1243,15 +1245,15 @@ ), n.add(s, s, t), (t = v), - (m = u); + (m = u)); break; case c: i.warning('attribute space is required"' + s + '"!!'); case h: - (m = u), (t = v); + ((m = u), (t = v)); break; case f: - (m = l), (t = v); + ((m = l), (t = v)); break; case p: throw new Error( @@ -1276,13 +1278,13 @@ var c = (u.prefix = a.slice(0, l)), h = a.slice(l + 1), p = c === "xmlns" && h; - else (h = a), (c = null), (p = a === "xmlns" && ""); - (u.localName = h), + else ((h = a), (c = null), (p = a === "xmlns" && "")); + ((u.localName = h), p !== !1 && (i == null && ((i = {}), E(s, (s = {}))), (s[p] = i[p] = f), (u.uri = "http://www.w3.org/2000/xmlns/"), - t.startPrefixMapping(p, f)); + t.startPrefixMapping(p, f))); } var o = e.length; while (o--) { @@ -1301,7 +1303,7 @@ if (e.closed) { t.endElement(d, h, r); if (i) for (c in i) t.endPrefixMapping(c); - } else (e.currentNSMap = s), (e.localNSMap = i), n.push(e); + } else ((e.currentNSMap = s), (e.localNSMap = i), n.push(e)); } function b(e, t, n, r, i) { if (/^(?:script|textarea)$/i.test(n)) { @@ -1316,7 +1318,7 @@ } function w(e, t, n, r) { var i = r[n]; - return i == null && (i = r[n] = e.lastIndexOf("")), i < t; + return (i == null && (i = r[n] = e.lastIndexOf("")), i < t); } function E(e, t) { for (var n in e) t[n] = e[n]; @@ -1336,7 +1338,10 @@ if (e.substr(t + 3, 6) == "CDATA[") { var s = e.indexOf("]]>", t + 9); return ( - n.startCDATA(), n.characters(e, t + 9, s - t - 9), n.endCDATA(), s + 3 + n.startCDATA(), + n.characters(e, t + 9, s - t - 9), + n.endCDATA(), + s + 3 ); } var o = C(e, t), @@ -1365,7 +1370,7 @@ var i = e.substring(t, r).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/); if (i) { var s = i[0].length; - return n.processingInstruction(i[1], i[2]), r + 2; + return (n.processingInstruction(i[1], i[2]), r + 2); } return -1; } @@ -1373,13 +1378,13 @@ } function T(e) {} function N(e, t) { - return (e.__proto__ = t), e; + return ((e.__proto__ = t), e); } function C(e, t) { var n, r = [], i = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g; - (i.lastIndex = t), i.exec(e); + ((i.lastIndex = t), i.exec(e)); while ((n = i.exec(e))) { r.push(n); if (n[1]) return r; @@ -1403,10 +1408,10 @@ (d.prototype = { parse: function (e, t, n) { var r = this.domBuilder; - r.startDocument(), + (r.startDocument(), E(t, (t = {})), v(e, t, n, r, this.errorHandler), - r.endDocument(); + r.endDocument()); }, }), (T.prototype = { @@ -1438,7 +1443,7 @@ N({}, N.prototype) instanceof N || (N = function (e, t) { function n() {} - (n.prototype = t), (n = new n()); + ((n.prototype = t), (n = new n())); for (t in e) n[t] = e[t]; return n; }), @@ -1456,30 +1461,30 @@ var s = Object.create(t.prototype); i.__proto__ = s; } - i instanceof t || + (i instanceof t || ((n.prototype = t.prototype), (n = new n()), r(i, n), (e.prototype = i = n)), i.constructor != e && (typeof e != "function" && console.error("unknown Class:" + e), - (i.constructor = e)); + (i.constructor = e))); } function B(e, t) { if (t instanceof Error) var n = t; else - (n = this), + ((n = this), Error.call(this, w[e]), (this.message = w[e]), - Error.captureStackTrace && Error.captureStackTrace(this, B); - return (n.code = e), t && (this.message = this.message + ": " + t), n; + Error.captureStackTrace && Error.captureStackTrace(this, B)); + return ((n.code = e), t && (this.message = this.message + ": " + t), n); } function j() {} function F(e, t) { - (this._node = e), (this._refresh = t), I(this); + ((this._node = e), (this._refresh = t), I(this)); } function I(e) { var t = e._node._inc || e._node.ownerDocument._inc; if (e._inc != t) { var n = e._refresh(e._node); - gt(e, "length", n.length), r(n, e), (e._inc = t); + (gt(e, "length", n.length), r(n, e), (e._inc = t)); } } function q() {} @@ -1546,7 +1551,7 @@ else { var i = t.firstChild, s = 0; - while (i) (r[s++] = i), (i = i.nextSibling); + while (i) ((r[s++] = i), (i = i.nextSibling)); r.length = s; } } @@ -1570,10 +1575,10 @@ var s = t.lastChild; } else i = s = t; var o = n ? n.previousSibling : e.lastChild; - (i.previousSibling = o), + ((i.previousSibling = o), (s.nextSibling = n), o ? (o.nextSibling = i) : (e.firstChild = i), - n == null ? (e.lastChild = s) : (n.previousSibling = s); + n == null ? (e.lastChild = s) : (n.previousSibling = s)); do i.parentNode = e; while (i !== s && (i = i.nextSibling)); return ( @@ -1628,14 +1633,14 @@ if (i || (h && !/^(?:meta|link|img|br|hr|input|button)$/i.test(o))) { t.push(">"); if (h && /^script$/i.test(o)) i && t.push(i.data); - else while (i) dt(i, t), (i = i.nextSibling); + else while (i) (dt(i, t), (i = i.nextSibling)); t.push(""); } else t.push("/>"); return; case v: case g: var i = e.firstChild; - while (i) dt(i, t), (i = i.nextSibling); + while (i) (dt(i, t), (i = i.nextSibling)); return; case a: return t.push(" ", e.name, '="', e.value.replace(/[<&"]/g, V), '"'); @@ -1649,11 +1654,12 @@ var b = e.publicId, w = e.systemId; t.push("'); + if (b) + (t.push(' PUBLIC "', b), w && w != "." && t.push('" "', w), t.push('">')); else if (w && w != ".") t.push(' SYSTEM "', w, '">'); else { var E = e.internalSubset; - E && t.push(" [", E, "]"), t.push(">"); + (E && t.push(" [", E, "]"), t.push(">")); } return; case p: @@ -1668,16 +1674,16 @@ var r; switch (t.nodeType) { case u: - (r = t.cloneNode(!1)), (r.ownerDocument = e); + ((r = t.cloneNode(!1)), (r.ownerDocument = e)); case g: break; case a: n = !0; } - r || (r = t.cloneNode(!1)), (r.ownerDocument = e), (r.parentNode = null); + (r || (r = t.cloneNode(!1)), (r.ownerDocument = e), (r.parentNode = null)); if (n) { var i = t.firstChild; - while (i) r.appendChild(vt(e, i, n)), (i = i.nextSibling); + while (i) (r.appendChild(vt(e, i, n)), (i = i.nextSibling)); } return r; } @@ -1687,7 +1693,7 @@ var s = t[i]; typeof s != "object" && s != r[i] && (r[i] = s); } - t.childNodes && (r.childNodes = new j()), (r.ownerDocument = e); + (t.childNodes && (r.childNodes = new j()), (r.ownerDocument = e)); switch (r.nodeType) { case u: var o = t.attributes, @@ -1701,7 +1707,7 @@ } if (n) { var h = t.firstChild; - while (h) r.appendChild(mt(e, h, n)), (h = h.nextSibling); + while (h) (r.appendChild(mt(e, h, n)), (h = h.nextSibling)); } return r; } @@ -1715,7 +1721,8 @@ var t = []; e = e.firstChild; while (e) - e.nodeType !== 7 && e.nodeType !== 8 && t.push(yt(e)), (e = e.nextSibling); + (e.nodeType !== 7 && e.nodeType !== 8 && t.push(yt(e)), + (e = e.nextSibling)); return t.join(""); default: return e.nodeValue; @@ -1752,7 +1759,7 @@ D = (b.INVALID_MODIFICATION_ERR = ((w[13] = "Invalid modification"), 13)), P = (b.NAMESPACE_ERR = ((w[14] = "Invalid namespace"), 14)), H = (b.INVALID_ACCESS_ERR = ((w[15] = "Invalid access"), 15)); - (B.prototype = Error.prototype), + ((B.prototype = Error.prototype), r(b, B), (j.prototype = { length: 0, @@ -1761,7 +1768,7 @@ }, }), (F.prototype.item = function (e) { - return I(this), this[e]; + return (I(this), this[e]); }), i(F, j), (q.prototype = { @@ -1778,7 +1785,7 @@ var t = e.ownerElement; if (t && t != this._ownerElement) throw new B(O); var n = this.getNamedItem(e.nodeName); - return U(this._ownerElement, this, e, n), n; + return (U(this._ownerElement, this, e, n), n); }, setNamedItemNS: function (e) { var t = e.ownerElement, @@ -1792,11 +1799,11 @@ }, removeNamedItem: function (e) { var t = this.getNamedItem(e); - return z(this._ownerElement, this, t), t; + return (z(this._ownerElement, this, t), t); }, removeNamedItemNS: function (e, t) { var n = this.getNamedItemNS(e, t); - return z(this._ownerElement, this, n), n; + return (z(this._ownerElement, this, n), n); }, getNamedItemNS: function (e, t) { var n = this.length; @@ -1814,10 +1821,10 @@ }, createDocument: function (e, t, n) { var r = new J(); - (r.implementation = this), + ((r.implementation = this), (r.childNodes = new j()), (r.doctype = n), - n && r.appendChild(n); + n && r.appendChild(n)); if (t) { var i = r.createElementNS(e, t); r.appendChild(i); @@ -1826,7 +1833,7 @@ }, createDocumentType: function (e, t, n) { var r = new ut(); - return (r.name = e), (r.nodeName = e), (r.publicId = t), (r.systemId = n), r; + return ((r.name = e), (r.nodeName = e), (r.publicId = t), (r.systemId = n), r); }, }), (X.prototype = { @@ -1846,7 +1853,7 @@ return Z(this, e, t); }, replaceChild: function (e, t) { - this.insertBefore(e, t), t && this.removeChild(t); + (this.insertBefore(e, t), t && this.removeChild(t)); }, removeChild: function (e) { return Y(this, e); @@ -1911,7 +1918,7 @@ var n = e.firstChild; while (n) { var r = n.nextSibling; - this.insertBefore(n, t), (n = r); + (this.insertBefore(n, t), (n = r)); } return e; } @@ -1925,7 +1932,7 @@ ); }, removeChild: function (e) { - return this.documentElement == e && (this.documentElement = null), Y(this, e); + return (this.documentElement == e && (this.documentElement = null), Y(this, e)); }, importNode: function (e, t) { return vt(this, e, t); @@ -1934,35 +1941,35 @@ var t = null; return ( $(this.documentElement, function (n) { - if (n.nodeType == 1 && n.getAttribute("id") == e) return (t = n), !0; + if (n.nodeType == 1 && n.getAttribute("id") == e) return ((t = n), !0); }), t ); }, createElement: function (e) { var t = new tt(); - (t.ownerDocument = this), + ((t.ownerDocument = this), (t.nodeName = e), (t.tagName = e), - (t.childNodes = new j()); + (t.childNodes = new j())); var n = (t.attributes = new q()); - return (n._ownerElement = t), t; + return ((n._ownerElement = t), t); }, createDocumentFragment: function () { var e = new ct(); - return (e.ownerDocument = this), (e.childNodes = new j()), e; + return ((e.ownerDocument = this), (e.childNodes = new j()), e); }, createTextNode: function (e) { var t = new it(); - return (t.ownerDocument = this), t.appendData(e), t; + return ((t.ownerDocument = this), t.appendData(e), t); }, createComment: function (e) { var t = new st(); - return (t.ownerDocument = this), t.appendData(e), t; + return ((t.ownerDocument = this), t.appendData(e), t); }, createCDATASection: function (e) { var t = new ot(); - return (t.ownerDocument = this), t.appendData(e), t; + return ((t.ownerDocument = this), t.appendData(e), t); }, createProcessingInstruction: function (e, t) { var n = new ht(); @@ -1986,7 +1993,7 @@ }, createEntityReference: function (e) { var t = new lt(); - return (t.ownerDocument = this), (t.nodeName = e), t; + return ((t.ownerDocument = this), (t.nodeName = e), t); }, createElementNS: function (e, t) { var n = new tt(), @@ -2036,7 +2043,7 @@ }, setAttribute: function (e, t) { var n = this.ownerDocument.createAttribute(e); - (n.value = n.nodeValue = "" + t), this.setAttributeNode(n); + ((n.value = n.nodeValue = "" + t), this.setAttributeNode(n)); }, removeAttribute: function (e) { var t = this.getAttributeNode(e); @@ -2067,7 +2074,7 @@ }, setAttributeNS: function (e, t, n) { var r = this.ownerDocument.createAttributeNS(e, t); - (r.value = r.nodeValue = "" + n), this.setAttributeNode(r); + ((r.value = r.nodeValue = "" + n), this.setAttributeNode(r)); }, getAttributeNodeNS: function (e, t) { return this.attributes.getNamedItemNS(e, t); @@ -2113,7 +2120,9 @@ return this.data.substring(e, e + t); }, appendData: function (e) { - (e = this.data + e), (this.nodeValue = this.data = e), (this.length = e.length); + ((e = this.data + e), + (this.nodeValue = this.data = e), + (this.length = e.length)); }, insertData: function (e, t) { this.replaceData(e, 0, t); @@ -2127,7 +2136,7 @@ replaceData: function (e, t, n) { var r = this.data.substring(0, e), i = this.data.substring(e + t); - (n = r + n + i), (this.nodeValue = this.data = n), (this.length = n.length); + ((n = r + n + i), (this.nodeValue = this.data = n), (this.length = n.length)); }, }), i(rt, X), @@ -2137,11 +2146,14 @@ splitText: function (e) { var t = this.data, n = t.substring(e); - (t = t.substring(0, e)), + ((t = t.substring(0, e)), (this.data = this.nodeValue = t), - (this.length = t.length); + (this.length = t.length)); var r = this.ownerDocument.createTextNode(n); - return this.parentNode && this.parentNode.insertBefore(r, this.nextSibling), r; + return ( + this.parentNode && this.parentNode.insertBefore(r, this.nextSibling), + r + ); }, }), i(it, rt), @@ -2164,16 +2176,16 @@ i(ht, X), (pt.prototype.serializeToString = function (e) { var t = []; - return dt(e, t), t.join(""); + return (dt(e, t), t.join("")); }), (X.prototype.toString = function () { return pt.prototype.serializeToString(this); - }); + })); try { Object.defineProperty && (Object.defineProperty(F.prototype, "length", { get: function () { - return I(this), this.$$length; + return (I(this), this.$$length); }, }), Object.defineProperty(X.prototype, "textContent", { @@ -2189,7 +2201,7 @@ this.appendChild(this.ownerDocument.createTextNode(e)); break; default: - (this.data = e), (this.value = value), (this.nodeValue = e); + ((this.data = e), (this.value = value), (this.nodeValue = e)); } }, }), @@ -2244,7 +2256,7 @@ this.cdata = !1; } function a(e, t) { - (t.lineNumber = e.lineNumber), (t.columnNumber = e.columnNumber); + ((t.lineNumber = e.lineNumber), (t.columnNumber = e.columnNumber)); } function f(e) { if (e) @@ -2293,22 +2305,22 @@ }), (u.prototype = { startDocument: function () { - (this.document = new i().createDocument(null, null, null)), - this.locator && (this.document.documentURI = this.locator.systemId); + ((this.document = new i().createDocument(null, null, null)), + this.locator && (this.document.documentURI = this.locator.systemId)); }, startElement: function (e, t, n, r) { var i = this.document, s = i.createElementNS(e, n || t), o = r.length; - c(this, s), (this.currentElement = s), this.locator && a(this.locator, s); + (c(this, s), (this.currentElement = s), this.locator && a(this.locator, s)); for (var u = 0; u < o; u++) { var e = r.getURI(u), f = r.getValue(u), n = r.getQName(u), l = i.createAttributeNS(e, n); - l.getOffset && a(l.getOffset(1), l), + (l.getOffset && a(l.getOffset(1), l), (l.value = l.nodeValue = f), - s.setAttributeNode(l); + s.setAttributeNode(l)); } }, endElement: function (e, t, n) { @@ -2320,7 +2332,7 @@ endPrefixMapping: function (e) {}, processingInstruction: function (e, t) { var n = this.document.createProcessingInstruction(e, t); - this.locator && a(this.locator, n), c(this, n); + (this.locator && a(this.locator, n), c(this, n)); }, ignorableWhitespace: function (e, t, n) {}, characters: function (e, t, n) { @@ -2346,7 +2358,7 @@ comment: function (e, t, n) { e = l.apply(this, arguments); var r = this.document.createComment(e); - this.locator && a(this.locator, r), c(this, r); + (this.locator && a(this.locator, r), c(this, r)); }, startCDATA: function () { this.cdata = !0; @@ -2358,7 +2370,7 @@ var r = this.document.implementation; if (r && r.createDocumentType) { var i = r.createDocumentType(e, t, n); - this.locator && a(this.locator, i), c(this, i); + (this.locator && a(this.locator, i), c(this, i)); } }, warning: function (e) { @@ -2389,11 +2401,11 @@ s = e("../worker/mirror").Mirror, o = e("./xml/dom-parser").DOMParser, u = (t.Worker = function (e) { - s.call(this, e), this.setTimeout(400), (this.context = null); + (s.call(this, e), this.setTimeout(400), (this.context = null)); }); - r.inherits(u, s), + (r.inherits(u, s), function () { - (this.setOptions = function (e) { + ((this.setOptions = function (e) { this.context = e.context; }), (this.onUpdate = function () { @@ -2401,7 +2413,7 @@ if (!e) return; var t = new o(), n = []; - (t.options.errorHandler = { + ((t.options.errorHandler = { fatalError: function (e, t, r) { n.push({ row: r.lineNumber, @@ -2428,15 +2440,15 @@ }, }), t.parseFromString(e), - this.sender.emit("error", n); - }); - }.call(u.prototype); + this.sender.emit("error", n)); + })); + }.call(u.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -2509,35 +2521,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -2550,7 +2562,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -2577,7 +2589,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -2679,15 +2691,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -2697,8 +2709,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -2720,9 +2732,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -2731,7 +2743,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -2758,10 +2770,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -2784,16 +2796,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -2805,7 +2817,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -2815,7 +2827,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -2834,8 +2846,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -2880,4 +2892,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/ace/worker-xquery.js b/web/static/ace/worker-xquery.js index fdc5d2af2..1ad64327f 100644 --- a/web/static/ace/worker-xquery.js +++ b/web/static/ace/worker-xquery.js @@ -1,5 +1,5 @@ "no use strict"; -!(function (e) { +(!(function (e) { function t(e, t) { var n = e, r = ""; @@ -10,13 +10,13 @@ if (i === !1) return ""; var s = n.lastIndexOf("/"); if (s === -1) break; - (r = n.substr(s) + r), (n = n.slice(0, s)); + ((r = n.substr(s) + r), (n = n.slice(0, s))); } return e; } if (typeof e.window != "undefined" && e.document) return; if (e.require && e.define) return; - e.console || + (e.console || ((e.console = function () { var e = Array.prototype.slice.call(arguments, 0); postMessage({ type: "log", data: e }); @@ -102,7 +102,7 @@ } }), ); - return t && (e.exports = t), e; + return (t && (e.exports = t), e); }, }; }), @@ -117,17 +117,17 @@ i = function () {}; return ( function () { - r.implement(this, n), + (r.implement(this, n), (this.callback = function (e, t) { postMessage({ type: "call", id: t, data: e }); }), (this.emit = function (e, t) { postMessage({ type: "event", name: e, data: t }); - }); + })); }.call(i.prototype), new i() ); - }); + })); var n = (e.main = null), r = (e.sender = null); e.onmessage = function (t) { @@ -140,7 +140,7 @@ e[i.command].apply(e, i.args); } else if (i.init) { - e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender()); + (e.initBaseUrls(i.tlns), require("ace/lib/es5-shim"), (r = e.sender = e.initSender())); var s = require(i.module)[i.classname]; n = e.main = new s(r); } @@ -148,11 +148,11 @@ })(this), define("ace/lib/oop", [], function (e, t, n) { "use strict"; - (t.inherits = function (e, t) { - (e.super_ = t), + ((t.inherits = function (e, t) { + ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 }, - })); + }))); }), (t.mixin = function (e, t) { for (var n in t) e[n] = t[n]; @@ -160,7 +160,7 @@ }), (t.implement = function (e, n) { t.mixin(e, n); - }); + })); }), define("ace/range", [], function (e, t, n) { "use strict"; @@ -168,10 +168,10 @@ return e.row - t.row || e.column - t.column; }, i = function (e, t, n, r) { - (this.start = { row: e, column: t }), (this.end = { row: n, column: r }); + ((this.start = { row: e, column: t }), (this.end = { row: n, column: r })); }; - (function () { - (this.isEqual = function (e) { + ((function () { + ((this.isEqual = function (e) { return ( this.start.row === e.start.row && this.end.row === e.end.row && @@ -316,11 +316,11 @@ return new i(t.row, t.column, n.row, n.column); }), (this.moveBy = function (e, t) { - (this.start.row += e), + ((this.start.row += e), (this.start.column += t), (this.end.row += e), - (this.end.column += t); - }); + (this.end.column += t)); + })); }).call(i.prototype), (i.fromPoints = function (e, t) { return new i(e.row, e.column, t.row, t.column); @@ -329,7 +329,7 @@ (i.comparePoints = function (e, t) { return e.row - t.row || e.column - t.column; }), - (t.Range = i); + (t.Range = i)); }), define("ace/apply_delta", [], function (e, t, n) { "use strict"; @@ -340,11 +340,11 @@ return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length; } function s(e, t) { - t.action != "insert" && + (t.action != "insert" && t.action != "remove" && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, "delta.lines must be an Array"), - (!t.start || !t.end) && r(t, "delta.start/end must be an present"); + (!t.start || !t.end) && r(t, "delta.start/end must be an present")); var n = t.start; i(e, t.start) || r(t, "delta.start must be contained in document"); var s = t.end; @@ -366,9 +366,9 @@ if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i); else { var u = [r, 1].concat(t.lines); - e.splice.apply(e, u), + (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), - (e[r + t.lines.length - 1] += s.substring(i)); + (e[r + t.lines.length - 1] += s.substring(i))); } break; case "remove": @@ -389,18 +389,18 @@ s = function () { this.defaultPrevented = !0; }; - (r._emit = r._dispatchEvent = + ((r._emit = r._dispatchEvent = function (e, t) { - this._eventRegistry || (this._eventRegistry = {}), - this._defaultHandlers || (this._defaultHandlers = {}); + (this._eventRegistry || (this._eventRegistry = {}), + this._defaultHandlers || (this._defaultHandlers = {})); var n = this._eventRegistry[e] || [], r = this._defaultHandlers[e]; if (!n.length && !r) return; if (typeof t != "object" || !t) t = {}; - t.type || (t.type = e), + (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), - (n = n.slice()); + (n = n.slice())); for (var o = 0; o < n.length; o++) { n[o](t, this); if (t.propagationStopped) break; @@ -417,7 +417,7 @@ var n = this; t && this.addEventListener(e, function r() { - n.removeEventListener(e, r), t.apply(null, arguments); + (n.removeEventListener(e, r), t.apply(null, arguments)); }); }), (r.setDefaultHandler = function (e, t) { @@ -426,7 +426,7 @@ if (n[e]) { var r = n[e], i = n._disabled_[e]; - i || (n._disabled_[e] = i = []), i.push(r); + (i || (n._disabled_[e] = i = []), i.push(r)); var s = i.indexOf(t); s != -1 && i.splice(s, 1); } @@ -465,18 +465,18 @@ (r.removeAllListeners = function (e) { this._eventRegistry && (this._eventRegistry[e] = []); }), - (t.EventEmitter = r); + (t.EventEmitter = r)); }), define("ace/anchor", [], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = (t.Anchor = function (e, t, n) { - (this.$onChange = this.onChange.bind(this)), + ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) - : this.setPosition(t, n); + : this.setPosition(t, n)); }); (function () { function e(e, t, n) { @@ -495,7 +495,7 @@ ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column }; } - r.implement(this, i), + (r.implement(this, i), (this.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }), @@ -514,16 +514,16 @@ n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t)); if (this.row == r.row && this.column == r.column) return; var i = { row: this.row, column: this.column }; - (this.row = r.row), + ((this.row = r.row), (this.column = r.column), - this._signal("change", { old: i, value: r }); + this._signal("change", { old: i, value: r })); }), (this.detach = function () { this.document.removeEventListener("change", this.$onChange); }), (this.attach = function (e) { - (this.document = e || this.document), - this.document.on("change", this.$onChange); + ((this.document = e || this.document), + this.document.on("change", this.$onChange)); }), (this.$clipPositionToDocument = function (e, t) { var n = {}; @@ -541,7 +541,7 @@ t < 0 && (n.column = 0), n ); - }); + })); }).call(s.prototype); }), define("ace/document", [], function (e, t, n) { @@ -552,19 +552,19 @@ o = e("./range").Range, u = e("./anchor").Anchor, a = function (e) { - (this.$lines = [""]), + ((this.$lines = [""]), e.length === 0 ? (this.$lines = [""]) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) - : this.insert({ row: 0, column: 0 }, e); + : this.insert({ row: 0, column: 0 }, e)); }; - (function () { - r.implement(this, s), + ((function () { + (r.implement(this, s), (this.setValue = function (e) { var t = this.getLength() - 1; - this.remove(new o(0, 0, t, this.getLine(t).length)), - this.insert({ row: 0, column: 0 }, e); + (this.remove(new o(0, 0, t, this.getLine(t).length)), + this.insert({ row: 0, column: 0 }, e)); }), (this.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); @@ -581,7 +581,7 @@ }), (this.$detectNewLine = function (e) { var t = e.match(/^.*?(\r\n|\r|\n)/m); - (this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode"); + ((this.$autoNewLine = t ? t[1] : "\n"), this._signal("changeNewLineMode")); }), (this.getNewLineCharacter = function () { switch (this.$newLineMode) { @@ -597,7 +597,7 @@ (this.$newLineMode = "auto"), (this.setNewLineMode = function (e) { if (this.$newLineMode === e) return; - (this.$newLineMode = e), this._signal("changeNewLineMode"); + ((this.$newLineMode = e), this._signal("changeNewLineMode")); }), (this.getNewLineMode = function () { return this.$newLineMode; @@ -625,8 +625,8 @@ if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)]; else { - (t = this.getLines(e.start.row, e.end.row)), - (t[0] = (t[0] || "").substring(e.start.column)); + ((t = this.getLines(e.start.row, e.end.row)), + (t[0] = (t[0] || "").substring(e.start.column))); var n = t.length - 1; e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)); } @@ -707,10 +707,10 @@ (this.insertFullLines = function (e, t) { e = Math.min(Math.max(e, 0), this.getLength()); var n = 0; - e < this.getLength() + (e < this.getLength() ? ((t = t.concat([""])), (n = 0)) : ((t = [""].concat(t)), e--, (n = this.$lines[e].length)), - this.insertMergedLines({ row: e, column: n }, t); + this.insertMergedLines({ row: e, column: n }, t)); }), (this.insertMergedLines = function (e, t) { var n = this.clippedPos(e.row, e.column), @@ -753,8 +753,8 @@ ); }), (this.removeFullLines = function (e, t) { - (e = Math.min(Math.max(0, e), this.getLength() - 1)), - (t = Math.min(Math.max(0, t), this.getLength() - 1)); + ((e = Math.min(Math.max(0, e), this.getLength() - 1)), + (t = Math.min(Math.max(0, t), this.getLength() - 1))); var n = t == this.getLength() - 1 && e > 0, r = t < this.getLength() - 1, i = n ? e - 1 : e, @@ -789,7 +789,7 @@ if (t == this.getTextRange(e)) return e.end; this.remove(e); var n; - return t ? (n = this.insert(e.start, t)) : (n = e.start), n; + return (t ? (n = this.insert(e.start, t)) : (n = e.start), n); }), (this.applyDeltas = function (e) { for (var t = 0; t < e.length; t++) this.applyDelta(e[t]); @@ -813,7 +813,7 @@ for (var o = 0, u = 0; o < r; o = u) { u += t - 1; var a = n.slice(o, u); - a.push(""), + (a.push(""), this.applyDelta( { start: this.pos(i + o, s), @@ -822,12 +822,12 @@ lines: a, }, !0, - ); + )); } - (e.lines = n.slice(o)), + ((e.lines = n.slice(o)), (e.start.row = i + o), (e.start.column = s), - this.applyDelta(e, !0); + this.applyDelta(e, !0)); }), (this.revertDelta = function (e) { this.applyDelta({ @@ -853,13 +853,13 @@ s = Math.min(e.row, n.length); for (var o = t || 0; o < s; ++o) i += n[o].length + r; return i + e.column; - }); + })); }).call(a.prototype), - (t.Document = a); + (t.Document = a)); }), define("ace/lib/lang", [], function (e, t, n) { "use strict"; - (t.last = function (e) { + ((t.last = function (e) { return e[e.length - 1]; }), (t.stringReverse = function (e) { @@ -872,10 +872,10 @@ if ((t >>= 1)) e += e; } return n; - }); + })); var r = /^\s\s*/, i = /\s\s*$/; - (t.stringTrimLeft = function (e) { + ((t.stringTrimLeft = function (e) { return e.replace(r, ""); }), (t.stringTrimRight = function (e) { @@ -942,18 +942,18 @@ (t.deferredCall = function (e) { var t = null, n = function () { - (t = null), e(); + ((t = null), e()); }, r = function (e) { - return r.cancel(), (t = setTimeout(n, e || 0)), r; + return (r.cancel(), (t = setTimeout(n, e || 0)), r); }; return ( (r.schedule = r), (r.call = function () { - return this.cancel(), e(), r; + return (this.cancel(), e(), r); }), (r.cancel = function () { - return clearTimeout(t), (t = null), r; + return (clearTimeout(t), (t = null), r); }), (r.isPending = function () { return t; @@ -964,28 +964,28 @@ (t.delayedCall = function (e, t) { var n = null, r = function () { - (n = null), e(); + ((n = null), e()); }, i = function (e) { n == null && (n = setTimeout(r, e || t)); }; return ( (i.delay = function (e) { - n && clearTimeout(n), (n = setTimeout(r, e || t)); + (n && clearTimeout(n), (n = setTimeout(r, e || t))); }), (i.schedule = i), (i.call = function () { - this.cancel(), e(); + (this.cancel(), e()); }), (i.cancel = function () { - n && clearTimeout(n), (n = null); + (n && clearTimeout(n), (n = null)); }), (i.isPending = function () { return n; }), i ); - }); + })); }), define("ace/worker/mirror", [], function (e, t, n) { "use strict"; @@ -1012,12 +1012,12 @@ }); }); (function () { - (this.$timeout = 500), + ((this.$timeout = 500), (this.setTimeout = function (e) { this.$timeout = e; }), (this.setValue = function (e) { - this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout); + (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)); }), (this.getValue = function (e) { this.sender.callback(this.doc.getValue(), e); @@ -1025,7 +1025,7 @@ (this.onUpdate = function () {}), (this.isPending = function () { return this.deferredUpdate.isPending(); - }); + })); }).call(o.prototype); }), define("ace/mode/xquery/xqlint", [], function (e, t, n) { @@ -1068,7 +1068,7 @@ if (!t) throw new Error(i + " code is missing."); if (!n) throw new Error(i + " message is missing."); if (!r) throw new Error(i + " position is missing."); - (e.getCode = function () { + ((e.getCode = function () { return t; }), (e.getMessage = function () { @@ -1076,11 +1076,11 @@ }), (e.getPos = function () { return r; - }); + })); }, i = {}, s = {}; - (i.prototype = new Error()), + ((i.prototype = new Error()), (s.prototype = new Error()), (n.StaticError = i.prototype.constructor = function (e, t, n) { @@ -1089,7 +1089,7 @@ (n.StaticWarning = s.prototype.constructor = function (e, t, n) { r(this, e, t, n, "Warning"); - }); + })); }, {}, ], @@ -1099,19 +1099,19 @@ var r = e("../tree_ops").TreeOps, i = e("./errors"), s = i.StaticWarning; - (n.ModuleDecl = function (e, t, n) { + ((n.ModuleDecl = function (e, t, n) { var i = ""; return { NCName: function (e) { i = r.flatten(e); }, URILiteral: function (s) { - (s = r.flatten(s)), + ((s = r.flatten(s)), (s = s.substring(1, s.length - 1)), e.apply(function () { - (t.moduleNamespace = s), - t.addNamespace(s, i, n.pos, "moduleDecl"); - }); + ((t.moduleNamespace = s), + t.addNamespace(s, i, n.pos, "moduleDecl")); + })); }, }; }), @@ -1124,12 +1124,12 @@ }, URILiteral: function (o) { if (s !== undefined) return; - (o = r.flatten(o)), + ((o = r.flatten(o)), (o = o.substring(1, o.length - 1)), (s = o), e.apply(function () { t.importModule(o, i, n.pos); - }); + })); }, }; }), @@ -1147,12 +1147,12 @@ }, URILiteral: function (o) { if (s !== undefined) return; - (o = r.flatten(o)), + ((o = r.flatten(o)), (o = o.substring(1, o.length - 1)), (s = o), e.apply(function () { t.addNamespace(o, i, n.pos, "schema"); - }); + })); }, }; }), @@ -1164,7 +1164,7 @@ i = i ? !0 : e.value === "function"; }, URILiteral: function (u) { - (o = r.flatten(u)), + ((o = r.flatten(u)), (o = o.substring(1, o.length - 1)), i ? (t.defaultFunctionNamespace = o) @@ -1175,7 +1175,7 @@ n.pos, ); }), - (t.defaultElementNamespace = o)); + (t.defaultElementNamespace = o))); }, }; }), @@ -1186,11 +1186,11 @@ i = r.flatten(e); }, URILiteral: function (s) { - (s = r.flatten(s)), + ((s = r.flatten(s)), (s = s.substring(1, s.length - 1)), e.apply(function () { t.addNamespace(s, i, n.pos, "declare"); - }); + })); }, }; }), @@ -1222,12 +1222,12 @@ var s = r.flatten(i); e.apply(function () { var e = t.resolveQName(s, n.pos); - e.uri !== "" && (t.root.namespaces[e.uri].used = !0), - t.addVarRef(e, i.pos); + (e.uri !== "" && (t.root.namespaces[e.uri].used = !0), + t.addVarRef(e, i.pos)); }); }, }; - }); + })); }, { "../tree_ops": "/node_modules/xqlint/lib/tree_ops.js", @@ -1647,7 +1647,7 @@ children: [], pos: n, setModuleResolver: function (e) { - return (this.root.moduleResolver = e), this; + return ((this.root.moduleResolver = e), this); }, setModules: function (e) { if (this !== this.root) @@ -1663,9 +1663,9 @@ var n = t.namespaces[e]; if (n.type === "module") { var i = t.moduleResolver(e); - i.variables && r.concat(t.variables, i.variables), + (i.variables && r.concat(t.variables, i.variables), i.functions && - r.concat(t.functions, i.functions); + r.concat(t.functions, i.functions)); } }), this @@ -1677,12 +1677,12 @@ "setModulesFromXQDoc() not invoked from the root static context.", ); var t = {}; - Object.keys(e).forEach(function (n) { + (Object.keys(e).forEach(function (n) { var r = e[n], i = {}, s = {}; - r.functions.forEach(function (e) { - (s[n + "#" + e.name + "#" + e.arity] = { + (r.functions.forEach(function (e) { + ((s[n + "#" + e.name + "#" + e.arity] = { params: [], annotations: [], name: e.name, @@ -1693,7 +1693,7 @@ s[n + "#" + e.name + "#" + e.arity].params.push( "$" + t.name, ); - }); + })); }), r.variables.forEach(function (e) { var t = e.name.substring(e.name.indexOf(":") + 1); @@ -1703,20 +1703,20 @@ eqname: { uri: n, name: t }, }; }), - (t[n] = { variables: i, functions: s }); + (t[n] = { variables: i, functions: s })); }), (this.root.moduleResolver = function (e) { return t[e]; - }); + })); var n = this; return ( Object.keys(this.namespaces).forEach(function (e) { var t = n.namespaces[e]; if (t.type === "module") { var i = n.moduleResolver(e); - i.variables && r.concat(n.variables, i.variables), + (i.variables && r.concat(n.variables, i.variables), i.functions && - r.concat(n.functions, i.functions); + r.concat(n.functions, i.functions)); } }), this @@ -1744,9 +1744,9 @@ if (this.moduleResolver) try { var i = this.moduleResolver(e, []); - i.variables && r.concat(this.variables, i.variables), + (i.variables && r.concat(this.variables, i.variables), i.functions && - r.concat(this.functions, i.functions); + r.concat(this.functions, i.functions)); } catch (o) { throw new s( "XQST0059", @@ -1795,8 +1795,8 @@ ); i = this.namespaces[e]; var u = [t]; - i && (u = u.concat(this.namespaces[e].prefixes)), - (this.namespaces[e] = { prefixes: u, pos: n, type: r }); + (i && (u = u.concat(this.namespaces[e].prefixes)), + (this.namespaces[e] = { prefixes: u, pos: n, type: r })); if (i) throw new o( "W02", @@ -1827,7 +1827,8 @@ ((i.uri = n), t.push(i)); }, r = this; - while (r) Object.keys(r.namespaces).forEach(n), (r = r.parent); + while (r) + (Object.keys(r.namespaces).forEach(n), (r = r.parent)); var i; return ( t.forEach(function (e) { @@ -1840,11 +1841,11 @@ var n = { uri: "", prefix: "", name: "" }, r; if (e.substring(0, 2) === "Q{") - (r = e.indexOf("}")), + ((r = e.indexOf("}")), (n.uri = e.substring(2, r)), - (n.name = e.substring(r + 1)); + (n.name = e.substring(r + 1))); else { - (r = e.indexOf(":")), (n.prefix = e.substring(0, r)); + ((r = e.indexOf(":")), (n.prefix = e.substring(0, r))); var i = this.getNamespaceByPrefix(n.prefix); if ( !i && @@ -1858,7 +1859,7 @@ '": can not expand prefix of lexical QName to namespace URI', t, ); - i && (n.uri = i.uri), (n.name = e.substring(r + 1)); + (i && (n.uri = i.uri), (n.name = e.substring(r + 1))); } return n; }, @@ -1904,7 +1905,7 @@ n = function (n) { e[n] || (e[n] = t.variables[n]); }; - while (t) Object.keys(t.variables).forEach(n), (t = t.parent); + while (t) (Object.keys(t.variables).forEach(n), (t = t.parent)); return e; }, getVariable: function (e) { @@ -1996,7 +1997,7 @@ '"' + e.name + '": duplicate function declaration', t, ); - return (this.functions[i] = { pos: t, params: n }), this; + return ((this.functions[i] = { pos: t, params: n }), this); } throw new s( "XQST0048", @@ -2009,7 +2010,7 @@ ); }, }; - return (h.root = t ? t.root : h), h; + return ((h.root = t ? t.root : h), h); }; }, { @@ -2075,10 +2076,10 @@ t.pos = n.pos; var d = t, v = function (e) { - (d = new u(d, e)), d.parent.children.push(d); + ((d = new u(d, e)), d.parent.children.push(d)); }, m = function (e) { - e !== undefined && ((d.pos.el = e.el), (d.pos.ec = e.ec)), + (e !== undefined && ((d.pos.el = e.el), (d.pos.ec = e.ec)), Object.keys(d.varRefs).forEach(function (e) { d.variables[e] || (d.parent.varRefs[e] = !0); }), @@ -2094,9 +2095,9 @@ d.variables[e].pos, ); }), - (d = d.parent); + (d = d.parent)); }; - (this.visitOnly = function (e, t) { + ((this.visitOnly = function (e, t) { e.children.forEach(function (e) { t.indexOf(e.name) !== -1 && p.visit(e); }); @@ -2114,7 +2115,7 @@ t.description = e.comment ? e.comment.description : undefined; }), (this.ModuleDecl = function (e) { - return this.visitChildren(e, a.ModuleDecl(p, t, e)), !0; + return (this.visitChildren(e, a.ModuleDecl(p, t, e)), !0); }), (this.Prolog = function (e) { return ( @@ -2138,7 +2139,7 @@ var n, r, i = []; - e.children.forEach(function (e) { + (e.children.forEach(function (e) { e.name === "EQName" ? ((n = e), (r = e.pos)) : e.name === "ParamList" && @@ -2148,10 +2149,10 @@ }); }), p.apply(function () { - (n = o.flatten(n)), + ((n = o.flatten(n)), (n = t.resolveQName(n, r)), - t.addFunction(n, r, i); - }); + t.addFunction(n, r, i)); + })); } }), this.visitOnly(e, [ @@ -2163,27 +2164,30 @@ ); }), (this.ModuleImport = function (e) { - return this.visitChildren(e, a.ModuleImport(p, t, e)), !0; + return (this.visitChildren(e, a.ModuleImport(p, t, e)), !0); }), (this.SchemaImport = function (e) { - return this.visitChildren(e, a.SchemaImport(p, t, e)), !0; + return (this.visitChildren(e, a.SchemaImport(p, t, e)), !0); }), (this.DefaultNamespaceDecl = function (e) { return ( - this.visitChildren(e, a.DefaultNamespaceDecl(p, t, e)), !0 + this.visitChildren(e, a.DefaultNamespaceDecl(p, t, e)), + !0 ); }), (this.NamespaceDecl = function (e) { - return this.visitChildren(e, a.NamespaceDecl(p, t, e)), !0; - }); + return (this.visitChildren(e, a.NamespaceDecl(p, t, e)), !0); + })); var g = {}; - (this.AnnotatedDecl = function (e) { + ((this.AnnotatedDecl = function (e) { return ( - (g = {}), this.visitChildren(e, a.NamespaceDecl(p, t, e)), !0 + (g = {}), + this.visitChildren(e, a.NamespaceDecl(p, t, e)), + !0 ); }), (this.CompatibilityAnnotation = function () { - return (g["http://www.w3.org/2012/xquery#updating"] = []), !0; + return ((g["http://www.w3.org/2012/xquery#updating"] = []), !0); }), (this.Annotation = function (e) { return ( @@ -2206,14 +2210,14 @@ i = d.resolveQName(r, n.pos), s = t.getVariable(i); if (s) { - (s.annotations = g), + ((s.annotations = g), (s.description = e.getParent.comment ? e.getParent.comment.description : undefined), (s.type = o .flatten(f(e, ["TypeDeclaration"])[0]) .substring(2) - .trim()); + .trim())); var u = s.type.substring(s.type.length - 1); u === "?" ? ((s.occurrence = 0), @@ -2253,14 +2257,14 @@ return ( e.children.forEach(function (e) { if (e.name === "TOKEN" && e.value === "external") - return (i = !0), !1; + return ((i = !0), !1); }), i || (v(e.pos), this.visitChildren(e), m()), !0 ); }), (this.VarRef = function (e) { - return this.visitChildren(e, a.VarRefHandler(p, d, e)), !0; + return (this.visitChildren(e, a.VarRefHandler(p, d, e)), !0); }), (this.Param = function (e) { var t = f(e, ["TypeDeclaration"])[0]; @@ -2271,34 +2275,34 @@ ); }), (this.InlineFunctionExpr = function (e) { - return v(e.pos), this.visitChildren(e), m(), !0; - }); + return (v(e.pos), this.visitChildren(e), m(), !0); + })); var y = [], b = function (e) { - v(e.pos), y.push(0), p.visitChildren(e); + (v(e.pos), y.push(0), p.visitChildren(e)); for (var t = 1; t <= y[y.length - 1]; t++) m(e.pos); - y.pop(), m(); + (y.pop(), m()); }; - (this.StatementsAndOptionalExpr = function (e) { - return b(e), !0; + ((this.StatementsAndOptionalExpr = function (e) { + return (b(e), !0); }), (this.StatementsAndExpr = function (e) { - return b(e), !0; + return (b(e), !0); }), (this.BlockStatement = function (e) { - return b(e), !0; + return (b(e), !0); }), (this.VarDeclStatement = function (e) { - v(e.pos), + (v(e.pos), y[y.length - 1]++, - this.visitChildren(e, a.VarHandler(p, d, e)); - }); + this.visitChildren(e, a.VarHandler(p, d, e))); + })); var w = []; - (this.FLWORExpr = this.FLWORStatement = + ((this.FLWORExpr = this.FLWORStatement = function (e) { - v(e.pos), w.push(0), this.visitChildren(e); + (v(e.pos), w.push(0), this.visitChildren(e)); for (var t = 1; t <= w[w.length - 1]; t++) m(e.pos); - return w.pop(), m(), !0; + return (w.pop(), m(), !0); }), (this.ForBinding = function (e) { return ( @@ -2329,7 +2333,7 @@ (this.GroupingSpec = function (e) { var t = !1; e.children.forEach(function (e) { - if (e.value === ":=") return (t = !0), !1; + if (e.value === ":=") return ((t = !0), !1); }); if (t) { var n = e.children[0]; @@ -2385,19 +2389,19 @@ ); }), (this.PositionalVar = function (e) { - return this.visitChildren(e, a.VarHandler(p, d, e)), !0; + return (this.visitChildren(e, a.VarHandler(p, d, e)), !0); }), (this.PositionalVar = function (e) { - return this.visitChildren(e, a.VarHandler(p, d, e)), !0; + return (this.visitChildren(e, a.VarHandler(p, d, e)), !0); }), (this.CurrentItem = function (e) { - return this.visitChildren(e, a.VarHandler(p, d, e)), !0; + return (this.visitChildren(e, a.VarHandler(p, d, e)), !0); }), (this.PreviousItem = function (e) { - return this.visitChildren(e, a.VarHandler(p, d, e)), !0; + return (this.visitChildren(e, a.VarHandler(p, d, e)), !0); }), (this.NextItem = function (e) { - return this.visitChildren(e, a.VarHandler(p, d, e)), !0; + return (this.visitChildren(e, a.VarHandler(p, d, e)), !0); }), (this.CountClause = function (e) { return ( @@ -2415,12 +2419,12 @@ m(), !0 ); - }); + })); var E = []; - (this.TransformExpr = function (e) { - v(e.pos), E.push(0), this.visitChildren(e); + ((this.TransformExpr = function (e) { + (v(e.pos), E.push(0), this.visitChildren(e)); for (var t = 1; t <= E[E.length - 1]; t++) m(e.pos); - return E.pop(), m(), !0; + return (E.pop(), m(), !0); }), (this.TransformSpec = function (e) { return ( @@ -2430,12 +2434,12 @@ this.visitChildren(e, a.VarHandler(p, d, e)), !0 ); - }); + })); var S = []; - (this.QuantifiedExpr = function (e) { - v(e.pos), S.push(0), this.visitChildren(e); + ((this.QuantifiedExpr = function (e) { + (v(e.pos), S.push(0), this.visitChildren(e)); for (var t = 1; t <= S[S.length - 1]; t++) m(e.pos); - return S.pop(), m(), !0; + return (S.pop(), m(), !0); }), (this.QuantifiedVarDecl = function (e) { return ( @@ -2464,7 +2468,7 @@ ); }), (this.TryClause = function (e) { - return v(e.pos), this.visitChildren(e), m(), !0; + return (v(e.pos), this.visitChildren(e), m(), !0); }), (this.CatchClause = function (e) { v(e.pos); @@ -2535,9 +2539,9 @@ t.substring(1), e.pos, ); - n.uri !== "" && + (n.uri !== "" && (d.root.namespaces[n.uri].used = !0), - d.addVarRef(n, e.pos); + d.addVarRef(n, e.pos)); }); }), this.visitChildren(e), @@ -2549,8 +2553,8 @@ (this.visit = function (e) { var t = e.name, n = !1; - typeof this[t] == "function" && (n = this[t](e) === !0), - n || this.visitChildren(e); + (typeof this[t] == "function" && (n = this[t](e) === !0), + n || this.visitChildren(e)); }), (this.visitChildren = function (e, t) { for (var n = 0; n < e.children.length; n++) { @@ -2580,7 +2584,7 @@ !n.override && n.type === "module" && h("W04", 'Unused module "' + e + '"', n.pos); - }); + })); }; }, { @@ -2607,8 +2611,8 @@ r = e.length - 1, i = Math.floor((r + n) / 2); while (r > n && i >= 0 && e[i].indexOf(t) !== 0) - t < e[i] ? (r = i - 1) : t > e[i] && (n = i + 1), - (i = Math.floor((r + n) / 2)); + (t < e[i] ? (r = i - 1) : t > e[i] && (n = i + 1), + (i = Math.floor((r + n) / 2))); while (i > 0 && e[i - 1].indexOf(t) === 0) i--; return i >= 0 ? i : 0; } @@ -2679,20 +2683,20 @@ f = e.indexOf(":"), l = !1; if (f !== -1) { - (u = e.substring(0, f)), (a = e.substring(f + 1)); + ((u = e.substring(0, f)), (a = e.substring(f + 1))); var h = n.getNamespaceByPrefix(u); h && (o = n.getNamespaceByPrefix(u).uri); - } else (l = !0), (o = n.root.defaultFunctionNamespace); + } else ((l = !0), (o = n.root.defaultFunctionNamespace)); Object.keys(s).forEach(function (e) { var t = s[e], u = e.substring(0, e.indexOf("#")), a = e.substring(e.indexOf("#") + 1); a = a.substring(0, a.indexOf("#")); if (u !== o) return; - l || (a = n.getNamespaces()[u].prefixes[0] + ":" + a), - (a += "("); + (l || (a = n.getNamespaces()[u].prefixes[0] + ":" + a), + (a += "(")); var f = a; - (f += t.params + ((f += t.params .map(function (e, t) { return "${" + (t + 1) + ":\\" + e.split(" ")[0] + "}"; }) @@ -2701,7 +2705,7 @@ (a += ")"), (f += ")"), r.push(a), - (i[a] = f); + (i[a] = f)); }); var p = d(e, r), v = function (e) { @@ -2795,7 +2799,7 @@ "use strict"; var n = " ", r = []; - (this.getMarkers = function () { + ((this.getMarkers = function () { return r; }), (this.WS = function (e) { @@ -2856,8 +2860,8 @@ (this.visit = function (e, t) { var n = e.name, r = !1; - typeof this[n] == "function" && (r = this[n](e, t) === !0), - r || this.visitChildren(e); + (typeof this[n] == "function" && (r = this[n](e, t) === !0), + r || this.visitChildren(e)); }), (this.visitChildren = function (e, t) { for (var n = 0; n < e.children.length; n++) { @@ -2882,7 +2886,7 @@ message: "[SW04] Trailing whitespace", }); }), - this.visit(e); + this.visit(e)); }; }, {}, @@ -2891,10 +2895,10 @@ function (e, t, n) { var r = (n.JSONiqTokenizer = function i(e, t) { function r(e, t) { - (E = t), (S = e), (x = e.length), s(0, 0, 0); + ((E = t), (S = e), (x = e.length), s(0, 0, 0)); } function s(e, t, n) { - (m = t), (g = t), (y = e), (b = t), (w = n), (N = n), E.reset(S); + ((m = t), (g = t), (y = e), (b = t), (w = n), (N = n), E.reset(S)); } function o() { E.startNonterminal("EQName", g); @@ -3759,14 +3763,14 @@ } s = o; var p = (u << 12) + o - 1; - (o = i.TRANSITION[(p & 15) + i.TRANSITION[p >> 4]]), - o > 4095 && ((r = o), (o &= 4095), (N = n)); + ((o = i.TRANSITION[(p & 15) + i.TRANSITION[p >> 4]]), + o > 4095 && ((r = o), (o &= 4095), (N = n))); } r >>= 12; if (r == 0) { N = n - 1; var f = N < x ? S.charCodeAt(N) : 0; - return f >= 56320 && f < 57344 && --N, d(T, N, s, -1, -1); + return (f >= 56320 && f < 57344 && --N, d(T, N, s, -1, -1)); } if (t) for (var v = r >> 9; v > 0; --v) { @@ -3779,13 +3783,13 @@ } r(e, t); var n = this; - (this.ParseException = function (e, t, n, r, i) { + ((this.ParseException = function (e, t, n, r, i) { var s = e, o = t, u = n, a = r, f = i; - (this.getBegin = function () { + ((this.getBegin = function () { return s; }), (this.getEnd = function () { @@ -3802,7 +3806,7 @@ }), (this.getMessage = function () { return a < 0 ? "lexical analysis failed" : "syntax error"; - }); + })); }), (this.getInput = function () { return S; @@ -3852,7 +3856,7 @@ ); }), (this.parse_start = function () { - E.startNonterminal("start", g), h(14); + (E.startNonterminal("start", g), h(14)); switch (y) { case 58: f(58); @@ -3962,7 +3966,7 @@ E.endNonterminal("start", g); }), (this.parse_StartTag = function () { - E.startNonterminal("StartTag", g), h(8); + (E.startNonterminal("StartTag", g), h(8)); switch (y) { case 61: f(61); @@ -3988,7 +3992,7 @@ E.endNonterminal("StartTag", g); }), (this.parse_TagContent = function () { - E.startNonterminal("TagContent", g), p(11); + (E.startNonterminal("TagContent", g), p(11)); switch (y) { case 25: f(25); @@ -4026,7 +4030,7 @@ E.endNonterminal("TagContent", g); }), (this.parse_AposAttr = function () { - E.startNonterminal("AposAttr", g), p(10); + (E.startNonterminal("AposAttr", g), p(10)); switch (y) { case 23: f(23); @@ -4058,7 +4062,7 @@ E.endNonterminal("AposAttr", g); }), (this.parse_QuotAttr = function () { - E.startNonterminal("QuotAttr", g), p(9); + (E.startNonterminal("QuotAttr", g), p(9)); switch (y) { case 22: f(22); @@ -4090,7 +4094,7 @@ E.endNonterminal("QuotAttr", g); }), (this.parse_CData = function () { - E.startNonterminal("CData", g), p(1); + (E.startNonterminal("CData", g), p(1)); switch (y) { case 14: f(14); @@ -4104,7 +4108,7 @@ E.endNonterminal("CData", g); }), (this.parse_XMLComment = function () { - E.startNonterminal("XMLComment", g), p(0); + (E.startNonterminal("XMLComment", g), p(0)); switch (y) { case 12: f(12); @@ -4118,7 +4122,7 @@ E.endNonterminal("XMLComment", g); }), (this.parse_PI = function () { - E.startNonterminal("PI", g), p(3); + (E.startNonterminal("PI", g), p(3)); switch (y) { case 13: f(13); @@ -4135,7 +4139,7 @@ E.endNonterminal("PI", g); }), (this.parse_Pragma = function () { - E.startNonterminal("Pragma", g), p(2); + (E.startNonterminal("Pragma", g), p(2)); switch (y) { case 11: f(11); @@ -4152,7 +4156,7 @@ E.endNonterminal("Pragma", g); }), (this.parse_Comment = function () { - E.startNonterminal("Comment", g), p(4); + (E.startNonterminal("Comment", g), p(4)); switch (y) { case 55: f(55); @@ -4169,7 +4173,7 @@ E.endNonterminal("Comment", g); }), (this.parse_CommentDoc = function () { - E.startNonterminal("CommentDoc", g), p(6); + (E.startNonterminal("CommentDoc", g), p(6)); switch (y) { case 33: f(33); @@ -4189,7 +4193,7 @@ E.endNonterminal("CommentDoc", g); }), (this.parse_QuotString = function () { - E.startNonterminal("QuotString", g), p(5); + (E.startNonterminal("QuotString", g), p(5)); switch (y) { case 3: f(3); @@ -4209,7 +4213,7 @@ E.endNonterminal("QuotString", g); }), (this.parse_AposString = function () { - E.startNonterminal("AposString", g), p(7); + (E.startNonterminal("AposString", g), p(7)); switch (y) { case 21: f(21); @@ -4232,22 +4236,22 @@ E.endNonterminal("AposString", g); }), (this.parse_Prefix = function () { - E.startNonterminal("Prefix", g), + (E.startNonterminal("Prefix", g), h(13), l(), a(), - E.endNonterminal("Prefix", g); + E.endNonterminal("Prefix", g)); }), (this.parse__EQName = function () { - E.startNonterminal("_EQName", g), + (E.startNonterminal("_EQName", g), h(12), l(), o(), - E.endNonterminal("_EQName", g); - }); + E.endNonterminal("_EQName", g)); + })); var v, m, g, y, b, w, E, S, x, T, N; }); - (r.getTokenSet = function (e) { + ((r.getTokenSet = function (e) { var t = [], n = e < 0 ? -e : INITIAL[e] & 4095; for (var i = 0; i < 279; i += 32) { @@ -8300,7 +8304,7 @@ "'|'", "'}'", "'}}'", - ]); + ])); }, {}, ], @@ -8308,10 +8312,10 @@ function (e, t, n) { var r = (n.XQueryTokenizer = function i(e, t) { function r(e, t) { - (E = t), (S = e), (x = e.length), s(0, 0, 0); + ((E = t), (S = e), (x = e.length), s(0, 0, 0)); } function s(e, t, n) { - (m = t), (g = t), (y = e), (b = t), (w = n), (N = n), E.reset(S); + ((m = t), (g = t), (y = e), (b = t), (w = n), (N = n), E.reset(S)); } function o() { E.startNonterminal("EQName", g); @@ -9176,14 +9180,14 @@ } s = o; var p = (u << 12) + o - 1; - (o = i.TRANSITION[(p & 15) + i.TRANSITION[p >> 4]]), - o > 4095 && ((r = o), (o &= 4095), (N = n)); + ((o = i.TRANSITION[(p & 15) + i.TRANSITION[p >> 4]]), + o > 4095 && ((r = o), (o &= 4095), (N = n))); } r >>= 12; if (r == 0) { N = n - 1; var f = N < x ? S.charCodeAt(N) : 0; - return f >= 56320 && f < 57344 && --N, d(T, N, s, -1, -1); + return (f >= 56320 && f < 57344 && --N, d(T, N, s, -1, -1)); } if (t) for (var v = r >> 9; v > 0; --v) { @@ -9196,13 +9200,13 @@ } r(e, t); var n = this; - (this.ParseException = function (e, t, n, r, i) { + ((this.ParseException = function (e, t, n, r, i) { var s = e, o = t, u = n, a = r, f = i; - (this.getBegin = function () { + ((this.getBegin = function () { return s; }), (this.getEnd = function () { @@ -9219,7 +9223,7 @@ }), (this.getMessage = function () { return a < 0 ? "lexical analysis failed" : "syntax error"; - }); + })); }), (this.getInput = function () { return S; @@ -9269,7 +9273,7 @@ ); }), (this.parse_start = function () { - E.startNonterminal("start", g), h(14); + (E.startNonterminal("start", g), h(14)); switch (y) { case 55: f(55); @@ -9376,7 +9380,7 @@ E.endNonterminal("start", g); }), (this.parse_StartTag = function () { - E.startNonterminal("StartTag", g), h(8); + (E.startNonterminal("StartTag", g), h(8)); switch (y) { case 58: f(58); @@ -9402,7 +9406,7 @@ E.endNonterminal("StartTag", g); }), (this.parse_TagContent = function () { - E.startNonterminal("TagContent", g), p(11); + (E.startNonterminal("TagContent", g), p(11)); switch (y) { case 23: f(23); @@ -9440,7 +9444,7 @@ E.endNonterminal("TagContent", g); }), (this.parse_AposAttr = function () { - E.startNonterminal("AposAttr", g), p(10); + (E.startNonterminal("AposAttr", g), p(10)); switch (y) { case 20: f(20); @@ -9472,7 +9476,7 @@ E.endNonterminal("AposAttr", g); }), (this.parse_QuotAttr = function () { - E.startNonterminal("QuotAttr", g), p(9); + (E.startNonterminal("QuotAttr", g), p(9)); switch (y) { case 19: f(19); @@ -9504,7 +9508,7 @@ E.endNonterminal("QuotAttr", g); }), (this.parse_CData = function () { - E.startNonterminal("CData", g), p(1); + (E.startNonterminal("CData", g), p(1)); switch (y) { case 11: f(11); @@ -9518,7 +9522,7 @@ E.endNonterminal("CData", g); }), (this.parse_XMLComment = function () { - E.startNonterminal("XMLComment", g), p(0); + (E.startNonterminal("XMLComment", g), p(0)); switch (y) { case 9: f(9); @@ -9532,7 +9536,7 @@ E.endNonterminal("XMLComment", g); }), (this.parse_PI = function () { - E.startNonterminal("PI", g), p(3); + (E.startNonterminal("PI", g), p(3)); switch (y) { case 10: f(10); @@ -9549,7 +9553,7 @@ E.endNonterminal("PI", g); }), (this.parse_Pragma = function () { - E.startNonterminal("Pragma", g), p(2); + (E.startNonterminal("Pragma", g), p(2)); switch (y) { case 8: f(8); @@ -9566,7 +9570,7 @@ E.endNonterminal("Pragma", g); }), (this.parse_Comment = function () { - E.startNonterminal("Comment", g), p(4); + (E.startNonterminal("Comment", g), p(4)); switch (y) { case 52: f(52); @@ -9583,7 +9587,7 @@ E.endNonterminal("Comment", g); }), (this.parse_CommentDoc = function () { - E.startNonterminal("CommentDoc", g), p(5); + (E.startNonterminal("CommentDoc", g), p(5)); switch (y) { case 31: f(31); @@ -9603,7 +9607,7 @@ E.endNonterminal("CommentDoc", g); }), (this.parse_QuotString = function () { - E.startNonterminal("QuotString", g), p(6); + (E.startNonterminal("QuotString", g), p(6)); switch (y) { case 18: f(18); @@ -9626,7 +9630,7 @@ E.endNonterminal("QuotString", g); }), (this.parse_AposString = function () { - E.startNonterminal("AposString", g), p(7); + (E.startNonterminal("AposString", g), p(7)); switch (y) { case 18: f(18); @@ -9649,22 +9653,22 @@ E.endNonterminal("AposString", g); }), (this.parse_Prefix = function () { - E.startNonterminal("Prefix", g), + (E.startNonterminal("Prefix", g), h(13), l(), a(), - E.endNonterminal("Prefix", g); + E.endNonterminal("Prefix", g)); }), (this.parse__EQName = function () { - E.startNonterminal("_EQName", g), + (E.startNonterminal("_EQName", g), h(12), l(), o(), - E.endNonterminal("_EQName", g); - }); + E.endNonterminal("_EQName", g)); + })); var v, m, g, y, b, w, E, S, x, T, N; }); - (r.getTokenSet = function (e) { + ((r.getTokenSet = function (e) { var t = [], n = e < 0 ? -e : INITIAL[e] & 4095; for (var i = 0; i < 276; i += 32) { @@ -13666,7 +13670,7 @@ "'|'", "'}'", "'}}'", - ]); + ])); }, {}, ], @@ -13901,7 +13905,7 @@ name: "EndTag", token: "meta.tag", next: function (e) { - e.pop(), e.pop(); + (e.pop(), e.pop()); }, }, ], @@ -14078,9 +14082,9 @@ "use strict"; var r = function (e) { var t = e; - (this.tokens = []), + ((this.tokens = []), (this.reset = function () { - (t = t), (this.tokens = []); + ((t = t), (this.tokens = [])); }), (this.startNonterminal = function () {}), (this.endNonterminal = function () {}), @@ -14089,10 +14093,10 @@ }), (this.whitespace = function (e, n) { this.tokens.push({ name: "WS", value: t.substring(e, n) }); - }); + })); }; n.Lexer = function (e, t) { - (this.tokens = []), + ((this.tokens = []), (this.getLineTokens = function (n, i) { i = i === "start" || !i ? '["start"]' : i; var s = JSON.parse(i), @@ -14102,7 +14106,7 @@ for (;;) { var f = s[s.length - 1]; try { - (o.tokens = []), u["parse_" + f](); + ((o.tokens = []), u["parse_" + f]()); var l = null; o.tokens.length > 1 && o.tokens[0].name === "WS" && @@ -14123,7 +14127,7 @@ if (c.name === "EOF") break; if (c.value === "") throw "Encountered empty string lexical rule."; - a.push({ + (a.push({ type: l === null ? "text" @@ -14132,7 +14136,7 @@ : l.token, value: c.value, }), - l && l.next && l.next(s); + l && l.next && l.next(s)); } catch (v) { if (v instanceof u.ParseException) { var m = 0; @@ -14147,7 +14151,7 @@ } } return { tokens: a, state: JSON.stringify(s) }; - }); + })); }; }, {}, @@ -14383,7 +14387,7 @@ name: "EndTag", token: "meta.tag", next: function (e) { - e.pop(), e.pop(); + (e.pop(), e.pop()); }, }, ], @@ -14584,17 +14588,17 @@ s = i.children[o]; if (s.pos.el !== 0 || s.pos.ec !== 0) break; } - (i.pos.sl = e.pos.sl), + ((i.pos.sl = e.pos.sl), (i.pos.sc = e.pos.sc), (i.pos.el = s.pos.el), - (i.pos.ec = s.pos.ec); + (i.pos.ec = s.pos.ec)); } - i.name === "FunctionName" && (i.name = "EQName"), + (i.name === "FunctionName" && (i.name = "EQName"), i.name === "EQName" && i.value === undefined && ((i.value = i.children[0].value), i.children.pop()), t.indexOf(i.name) !== -1 && r.index.push(i), - i.getParent !== null && (i = i.getParent); + i.getParent !== null && (i = i.getParent)); if (i.children.length > 0) { var u = i.children[i.children.length - 1]; u.children.length === 1 && @@ -14604,7 +14608,7 @@ } function h(e, t, n) { var r = n - o; - (i.value = s.substring(0, r)), (s = s.substring(r)), (o = n); + ((i.value = s.substring(0, r)), (s = s.substring(r)), (o = n)); var f = a, l = u, c = f + i.value.split("\n").length - 1, @@ -14613,12 +14617,12 @@ h === -1 ? l + i.value.length : i.value.substring(h + 1).length; - (a = c), + ((a = c), (u = p), (i.pos.sl = f), (i.pos.sc = l), (i.pos.el = c), - (i.pos.ec = p); + (i.pos.ec = p)); } var t = ["VarDecl", "FunctionDecl"], n = [ @@ -14650,7 +14654,7 @@ o = 0, u = 0, a = 0; - (this.closeParseTree = function () { + ((this.closeParseTree = function () { while (i.getParent !== null) c(); c(); }), @@ -14668,19 +14672,19 @@ c(); }), (this.terminal = function (e, t, n) { - (e = + ((e = e.substring(0, 1) === "'" && e.substring(e.length - 1) === "'" ? "TOKEN" : e), l(e, t), h(i, t, n), - c(); + c()); }), (this.whitespace = function (e, t) { var n = "WS"; - l(n, e), h(i, e, t), c(); - }); + (l(n, e), h(i, e, t), c()); + })); }; }, {}, @@ -14689,10 +14693,10 @@ function (e, t, n) { var r = (n.JSONiqParser = function i(e, t) { function r(e, t) { - (ic = t), (ac = e), (fc = e.length), s(0, 0, 0); + ((ic = t), (ac = e), (fc = e.length), s(0, 0, 0)); } function s(e, t, n) { - (Xl = t), + ((Xl = t), (Vl = t), ($l = e), (Jl = t), @@ -14701,7 +14705,7 @@ (cc = n), (ec = -1), (sc = {}), - ic.reset(ac); + ic.reset(ac)); } function o() { ic.startNonterminal("Module", Vl); @@ -14712,7 +14716,7 @@ default: Wl = $l; } - (Wl == 64682 || Wl == 137898) && u(), Il(277); + ((Wl == 64682 || Wl == 137898) && u(), Il(277)); switch ($l) { case 185: ql(146); @@ -14722,38 +14726,38 @@ } switch (Wl) { case 95929: - jl(), a(); + (jl(), a()); break; default: - jl(), Za(); + (jl(), Za()); } ic.endNonterminal("Module", Vl); } function u() { - ic.startNonterminal("VersionDecl", Vl), Pl(170), Il(120); + (ic.startNonterminal("VersionDecl", Vl), Pl(170), Il(120)); switch ($l) { case 126: - Pl(126), Il(17), Pl(11); + (Pl(126), Il(17), Pl(11)); break; default: - Pl(269), + (Pl(269), Il(17), Pl(11), Il(113), - $l == 126 && (Pl(126), Il(17), Pl(11)); + $l == 126 && (Pl(126), Il(17), Pl(11))); } - Il(29), jl(), c(), ic.endNonterminal("VersionDecl", Vl); + (Il(29), jl(), c(), ic.endNonterminal("VersionDecl", Vl)); } function a() { - ic.startNonterminal("LibraryModule", Vl), + (ic.startNonterminal("LibraryModule", Vl), f(), Il(142), jl(), l(), - ic.endNonterminal("LibraryModule", Vl); + ic.endNonterminal("LibraryModule", Vl)); } function f() { - ic.startNonterminal("ModuleDecl", Vl), + (ic.startNonterminal("ModuleDecl", Vl), Pl(185), Il(64), Pl(187), @@ -14767,7 +14771,7 @@ Il(29), jl(), c(), - ic.endNonterminal("ModuleDecl", Vl); + ic.endNonterminal("ModuleDecl", Vl)); } function l() { ic.startNonterminal("Prolog", Vl); @@ -14817,11 +14821,11 @@ o = Gl, u = Yl; try { - _(), (Wl = -1); + (_(), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -14832,26 +14836,26 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(0, Vl, Wl); + oc(0, Vl, Wl)); } } switch (Wl) { case -1: - jl(), M(); + (jl(), M()); break; case 95853: - jl(), O(); + (jl(), O()); break; case 155: - jl(), C(); + (jl(), C()); break; case 73325: - jl(), D(); + (jl(), D()); break; default: - jl(), h(); + (jl(), h()); } - Il(29), jl(), c(); + (Il(29), jl(), c()); } for (;;) { Il(277); @@ -14883,22 +14887,22 @@ } switch (Wl) { case 52333: - jl(), R(); + (jl(), R()); break; case 104045: - jl(), Q(); + (jl(), Q()); break; default: - jl(), P(); + (jl(), P()); } - Il(29), jl(), c(); + (Il(29), jl(), c()); } ic.endNonterminal("Prolog", Vl); } function c() { - ic.startNonterminal("Separator", Vl), + (ic.startNonterminal("Separator", Vl), Pl(54), - ic.endNonterminal("Separator", Vl); + ic.endNonterminal("Separator", Vl)); } function h() { ic.startNonterminal("Setter", Vl); @@ -14921,10 +14925,10 @@ o = Gl, u = Yl; try { - v(), (Wl = -2); + (v(), (Wl = -2)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -14936,12 +14940,12 @@ ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), w(), - (Wl = -6); + (Wl = -6)); } catch (f) { Wl = -9; } } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -14952,7 +14956,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(1, Vl, Wl); + oc(1, Vl, Wl)); } } switch (Wl) { @@ -14986,11 +14990,11 @@ ic.endNonterminal("Setter", Vl); } function p() { - ic.startNonterminal("BoundarySpaceDecl", Vl), + (ic.startNonterminal("BoundarySpaceDecl", Vl), Pl(109), Il(36), Pl(86), - Il(137); + Il(137)); switch ($l) { case 218: Pl(218); @@ -15001,7 +15005,7 @@ ic.endNonterminal("BoundarySpaceDecl", Vl); } function d() { - ic.startNonterminal("DefaultCollationDecl", Vl), + (ic.startNonterminal("DefaultCollationDecl", Vl), Pl(109), Il(49), Pl(110), @@ -15009,26 +15013,26 @@ Pl(95), Il(15), Pl(7), - ic.endNonterminal("DefaultCollationDecl", Vl); + ic.endNonterminal("DefaultCollationDecl", Vl)); } function v() { - Hl(109), Il(49), Hl(110), Il(41), Hl(95), Il(15), Hl(7); + (Hl(109), Il(49), Hl(110), Il(41), Hl(95), Il(15), Hl(7)); } function m() { - ic.startNonterminal("BaseURIDecl", Vl), + (ic.startNonterminal("BaseURIDecl", Vl), Pl(109), Il(35), Pl(84), Il(15), Pl(7), - ic.endNonterminal("BaseURIDecl", Vl); + ic.endNonterminal("BaseURIDecl", Vl)); } function g() { - ic.startNonterminal("ConstructionDecl", Vl), + (ic.startNonterminal("ConstructionDecl", Vl), Pl(109), Il(44), Pl(99), - Il(137); + Il(137)); switch ($l) { case 246: Pl(246); @@ -15039,11 +15043,11 @@ ic.endNonterminal("ConstructionDecl", Vl); } function y() { - ic.startNonterminal("OrderingModeDecl", Vl), + (ic.startNonterminal("OrderingModeDecl", Vl), Pl(109), Il(71), Pl(207), - Il(135); + Il(135)); switch ($l) { case 206: Pl(206); @@ -15054,7 +15058,7 @@ ic.endNonterminal("OrderingModeDecl", Vl); } function b() { - ic.startNonterminal("EmptyOrderDecl", Vl), + (ic.startNonterminal("EmptyOrderDecl", Vl), Pl(109), Il(49), Pl(110), @@ -15062,7 +15066,7 @@ Pl(205), Il(52), Pl(124), - Il(125); + Il(125)); switch ($l) { case 149: Pl(149); @@ -15073,7 +15077,14 @@ ic.endNonterminal("EmptyOrderDecl", Vl); } function w() { - Hl(109), Il(49), Hl(110), Il(70), Hl(205), Il(52), Hl(124), Il(125); + (Hl(109), + Il(49), + Hl(110), + Il(70), + Hl(205), + Il(52), + Hl(124), + Il(125)); switch ($l) { case 149: Hl(149); @@ -15083,7 +15094,7 @@ } } function E() { - ic.startNonterminal("CopyNamespacesDecl", Vl), + (ic.startNonterminal("CopyNamespacesDecl", Vl), Pl(109), Il(47), Pl(105), @@ -15095,7 +15106,7 @@ Il(127), jl(), x(), - ic.endNonterminal("CopyNamespacesDecl", Vl); + ic.endNonterminal("CopyNamespacesDecl", Vl)); } function S() { ic.startNonterminal("PreserveMode", Vl); @@ -15120,18 +15131,18 @@ ic.endNonterminal("InheritMode", Vl); } function T() { - ic.startNonterminal("DecimalFormatDecl", Vl), Pl(109), Il(118); + (ic.startNonterminal("DecimalFormatDecl", Vl), Pl(109), Il(118)); switch ($l) { case 107: - Pl(107), Il(245), jl(), $a(); + (Pl(107), Il(245), jl(), $a()); break; default: - Pl(110), Il(48), Pl(107); + (Pl(110), Il(48), Pl(107)); } for (;;) { Il(203); if ($l == 54) break; - jl(), N(), Il(30), Pl(61), Il(17), Pl(11); + (jl(), N(), Il(30), Pl(61), Il(17), Pl(11)); } ic.endNonterminal("DecimalFormatDecl", Vl); } @@ -15189,7 +15200,7 @@ ic.endNonterminal("Import", Vl); } function k() { - ic.startNonterminal("SchemaImport", Vl), + (ic.startNonterminal("SchemaImport", Vl), Pl(155), Il(76), Pl(229), @@ -15197,13 +15208,13 @@ $l != 7 && (jl(), L()), Il(15), Pl(7), - Il(112); + Il(112)); if ($l == 82) { - Pl(82), Il(15), Pl(7); + (Pl(82), Il(15), Pl(7)); for (;;) { Il(107); if ($l != 42) break; - Pl(42), Il(15), Pl(7); + (Pl(42), Il(15), Pl(7)); } } ic.endNonterminal("SchemaImport", Vl); @@ -15212,15 +15223,15 @@ ic.startNonterminal("SchemaPrefix", Vl); switch ($l) { case 187: - Pl(187), Il(239), jl(), Ga(), Il(30), Pl(61); + (Pl(187), Il(239), jl(), Ga(), Il(30), Pl(61)); break; default: - Pl(110), Il(50), Pl(122), Il(64), Pl(187); + (Pl(110), Il(50), Pl(122), Il(64), Pl(187)); } ic.endNonterminal("SchemaPrefix", Vl); } function A() { - ic.startNonterminal("ModuleImport", Vl), + (ic.startNonterminal("ModuleImport", Vl), Pl(155), Il(63), Pl(185), @@ -15228,19 +15239,19 @@ $l == 187 && (Pl(187), Il(239), jl(), Ga(), Il(30), Pl(61)), Il(15), Pl(7), - Il(112); + Il(112)); if ($l == 82) { - Pl(82), Il(15), Pl(7); + (Pl(82), Il(15), Pl(7)); for (;;) { Il(107); if ($l != 42) break; - Pl(42), Il(15), Pl(7); + (Pl(42), Il(15), Pl(7)); } } ic.endNonterminal("ModuleImport", Vl); } function O() { - ic.startNonterminal("NamespaceDecl", Vl), + (ic.startNonterminal("NamespaceDecl", Vl), Pl(109), Il(64), Pl(187), @@ -15251,14 +15262,14 @@ Pl(61), Il(15), Pl(7), - ic.endNonterminal("NamespaceDecl", Vl); + ic.endNonterminal("NamespaceDecl", Vl)); } function M() { - ic.startNonterminal("DefaultNamespaceDecl", Vl), + (ic.startNonterminal("DefaultNamespaceDecl", Vl), Pl(109), Il(49), Pl(110), - Il(119); + Il(119)); switch ($l) { case 122: Pl(122); @@ -15266,14 +15277,14 @@ default: Pl(147); } - Il(64), + (Il(64), Pl(187), Il(15), Pl(7), - ic.endNonterminal("DefaultNamespaceDecl", Vl); + ic.endNonterminal("DefaultNamespaceDecl", Vl)); } function _() { - Hl(109), Il(49), Hl(110), Il(119); + (Hl(109), Il(49), Hl(110), Il(119)); switch ($l) { case 122: Hl(122); @@ -15281,86 +15292,86 @@ default: Hl(147); } - Il(64), Hl(187), Il(15), Hl(7); + (Il(64), Hl(187), Il(15), Hl(7)); } function D() { - ic.startNonterminal("FTOptionDecl", Vl), + (ic.startNonterminal("FTOptionDecl", Vl), Pl(109), Il(55), Pl(143), Il(84), jl(), Qu(), - ic.endNonterminal("FTOptionDecl", Vl); + ic.endNonterminal("FTOptionDecl", Vl)); } function P() { - ic.startNonterminal("AnnotatedDecl", Vl), Pl(109); + (ic.startNonterminal("AnnotatedDecl", Vl), Pl(109)); for (;;) { Il(192); if ($l != 33 && $l != 263) break; switch ($l) { case 263: - jl(), H(); + (jl(), H()); break; default: - jl(), B(); + (jl(), B()); } } switch ($l) { case 268: - jl(), F(); + (jl(), F()); break; case 147: - jl(), _l(); + (jl(), _l()); break; case 96: - jl(), Ca(); + (jl(), Ca()); break; case 157: - jl(), Ha(); + (jl(), Ha()); break; default: - jl(), Ba(); + (jl(), Ba()); } ic.endNonterminal("AnnotatedDecl", Vl); } function H() { - ic.startNonterminal("CompatibilityAnnotation", Vl), + (ic.startNonterminal("CompatibilityAnnotation", Vl), Pl(263), - ic.endNonterminal("CompatibilityAnnotation", Vl); + ic.endNonterminal("CompatibilityAnnotation", Vl)); } function B() { - ic.startNonterminal("Annotation", Vl), + (ic.startNonterminal("Annotation", Vl), Pl(33), Il(245), jl(), $a(), - Il(193); + Il(193)); if ($l == 35) { - Pl(35), Il(190), jl(), di(); + (Pl(35), Il(190), jl(), di()); for (;;) { Il(105); if ($l != 42) break; - Pl(42), Il(190), jl(), di(); + (Pl(42), Il(190), jl(), di()); } Pl(38); } ic.endNonterminal("Annotation", Vl); } function j() { - Hl(33), Il(245), Ja(), Il(193); + (Hl(33), Il(245), Ja(), Il(193)); if ($l == 35) { - Hl(35), Il(190), vi(); + (Hl(35), Il(190), vi()); for (;;) { Il(105); if ($l != 42) break; - Hl(42), Il(190), vi(); + (Hl(42), Il(190), vi()); } Hl(38); } } function F() { - ic.startNonterminal("VarDecl", Vl), + (ic.startNonterminal("VarDecl", Vl), Pl(268), Il(21), Pl(31), @@ -15369,28 +15380,30 @@ Ti(), Il(157), $l == 80 && (jl(), Cs()), - Il(110); + Il(110)); switch ($l) { case 53: - Pl(53), Il(266), jl(), I(); + (Pl(53), Il(266), jl(), I()); break; default: - Pl(134), Il(108), $l == 53 && (Pl(53), Il(266), jl(), q()); + (Pl(134), + Il(108), + $l == 53 && (Pl(53), Il(266), jl(), q())); } ic.endNonterminal("VarDecl", Vl); } function I() { - ic.startNonterminal("VarValue", Vl), + (ic.startNonterminal("VarValue", Vl), Wf(), - ic.endNonterminal("VarValue", Vl); + ic.endNonterminal("VarValue", Vl)); } function q() { - ic.startNonterminal("VarDefaultValue", Vl), + (ic.startNonterminal("VarDefaultValue", Vl), Wf(), - ic.endNonterminal("VarDefaultValue", Vl); + ic.endNonterminal("VarDefaultValue", Vl)); } function R() { - ic.startNonterminal("ContextItemDecl", Vl), + (ic.startNonterminal("ContextItemDecl", Vl), Pl(109), Il(46), Pl(102), @@ -15398,22 +15411,24 @@ Pl(167), Il(157), $l == 80 && (Pl(80), Il(253), jl(), _s()), - Il(110); + Il(110)); switch ($l) { case 53: - Pl(53), Il(266), jl(), I(); + (Pl(53), Il(266), jl(), I()); break; default: - Pl(134), Il(108), $l == 53 && (Pl(53), Il(266), jl(), q()); + (Pl(134), + Il(108), + $l == 53 && (Pl(53), Il(266), jl(), q())); } ic.endNonterminal("ContextItemDecl", Vl); } function U() { - ic.startNonterminal("ParamList", Vl), W(); + (ic.startNonterminal("ParamList", Vl), W()); for (;;) { Il(105); if ($l != 42) break; - Pl(42), Il(21), jl(), W(); + (Pl(42), Il(21), jl(), W()); } ic.endNonterminal("ParamList", Vl); } @@ -15422,44 +15437,44 @@ for (;;) { Il(105); if ($l != 42) break; - Hl(42), Il(21), X(); + (Hl(42), Il(21), X()); } } function W() { - ic.startNonterminal("Param", Vl), + (ic.startNonterminal("Param", Vl), Pl(31), Il(245), jl(), $a(), Il(153), $l == 80 && (jl(), Cs()), - ic.endNonterminal("Param", Vl); + ic.endNonterminal("Param", Vl)); } function X() { - Hl(31), Il(245), Ja(), Il(153), $l == 80 && ks(); + (Hl(31), Il(245), Ja(), Il(153), $l == 80 && ks()); } function V() { - ic.startNonterminal("FunctionBody", Vl), + (ic.startNonterminal("FunctionBody", Vl), J(), - ic.endNonterminal("FunctionBody", Vl); + ic.endNonterminal("FunctionBody", Vl)); } function $() { K(); } function J() { - ic.startNonterminal("EnclosedExpr", Vl), + (ic.startNonterminal("EnclosedExpr", Vl), Pl(281), Il(266), jl(), G(), Pl(287), - ic.endNonterminal("EnclosedExpr", Vl); + ic.endNonterminal("EnclosedExpr", Vl)); } function K() { - Hl(281), Il(266), Y(), Hl(287); + (Hl(281), Il(266), Y(), Hl(287)); } function Q() { - ic.startNonterminal("OptionDecl", Vl), + (ic.startNonterminal("OptionDecl", Vl), Pl(109), Il(69), Pl(203), @@ -15468,13 +15483,13 @@ $a(), Il(17), Pl(11), - ic.endNonterminal("OptionDecl", Vl); + ic.endNonterminal("OptionDecl", Vl)); } function G() { - ic.startNonterminal("Expr", Vl), Wf(); + (ic.startNonterminal("Expr", Vl), Wf()); for (;;) { if ($l != 42) break; - Pl(42), Il(266), jl(), Wf(); + (Pl(42), Il(266), jl(), Wf()); } ic.endNonterminal("Expr", Vl); } @@ -15482,17 +15497,17 @@ Xf(); for (;;) { if ($l != 42) break; - Hl(42), Il(266), Xf(); + (Hl(42), Il(266), Xf()); } } function Z() { - ic.startNonterminal("FLWORExpr", Vl), tt(); + (ic.startNonterminal("FLWORExpr", Vl), tt()); for (;;) { Il(195); if ($l == 224) break; - jl(), rt(); + (jl(), rt()); } - jl(), rn(), ic.endNonterminal("FLWORExpr", Vl); + (jl(), rn(), ic.endNonterminal("FLWORExpr", Vl)); } function et() { nt(); @@ -15584,22 +15599,22 @@ } } function st() { - ic.startNonterminal("ForClause", Vl), Pl(139), Il(21), jl(), ut(); + (ic.startNonterminal("ForClause", Vl), Pl(139), Il(21), jl(), ut()); for (;;) { if ($l != 42) break; - Pl(42), Il(21), jl(), ut(); + (Pl(42), Il(21), jl(), ut()); } ic.endNonterminal("ForClause", Vl); } function ot() { - Hl(139), Il(21), at(); + (Hl(139), Il(21), at()); for (;;) { if ($l != 42) break; - Hl(42), Il(21), at(); + (Hl(42), Il(21), at()); } } function ut() { - ic.startNonterminal("ForBinding", Vl), + (ic.startNonterminal("ForBinding", Vl), Pl(31), Il(245), jl(), @@ -15617,10 +15632,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("ForBinding", Vl); + ic.endNonterminal("ForBinding", Vl)); } function at() { - Hl(31), + (Hl(31), Il(245), Ni(), Il(182), @@ -15634,103 +15649,107 @@ Il(56), Hl(156), Il(266), - Xf(); + Xf()); } function ft() { - ic.startNonterminal("AllowingEmpty", Vl), + (ic.startNonterminal("AllowingEmpty", Vl), Pl(73), Il(52), Pl(124), - ic.endNonterminal("AllowingEmpty", Vl); + ic.endNonterminal("AllowingEmpty", Vl)); } function lt() { - Hl(73), Il(52), Hl(124); + (Hl(73), Il(52), Hl(124)); } function ct() { - ic.startNonterminal("PositionalVar", Vl), + (ic.startNonterminal("PositionalVar", Vl), Pl(82), Il(21), Pl(31), Il(245), jl(), Ti(), - ic.endNonterminal("PositionalVar", Vl); + ic.endNonterminal("PositionalVar", Vl)); } function ht() { - Hl(82), Il(21), Hl(31), Il(245), Ni(); + (Hl(82), Il(21), Hl(31), Il(245), Ni()); } function pt() { - ic.startNonterminal("FTScoreVar", Vl), + (ic.startNonterminal("FTScoreVar", Vl), Pl(232), Il(21), Pl(31), Il(245), jl(), Ti(), - ic.endNonterminal("FTScoreVar", Vl); + ic.endNonterminal("FTScoreVar", Vl)); } function dt() { - Hl(232), Il(21), Hl(31), Il(245), Ni(); + (Hl(232), Il(21), Hl(31), Il(245), Ni()); } function vt() { - ic.startNonterminal("LetClause", Vl), Pl(177), Il(100), jl(), gt(); + (ic.startNonterminal("LetClause", Vl), + Pl(177), + Il(100), + jl(), + gt()); for (;;) { if ($l != 42) break; - Pl(42), Il(100), jl(), gt(); + (Pl(42), Il(100), jl(), gt()); } ic.endNonterminal("LetClause", Vl); } function mt() { - Hl(177), Il(100), yt(); + (Hl(177), Il(100), yt()); for (;;) { if ($l != 42) break; - Hl(42), Il(100), yt(); + (Hl(42), Il(100), yt()); } } function gt() { ic.startNonterminal("LetBinding", Vl); switch ($l) { case 31: - Pl(31), + (Pl(31), Il(245), jl(), Ti(), Il(109), - $l == 80 && (jl(), Cs()); + $l == 80 && (jl(), Cs())); break; default: pt(); } - Il(28), + (Il(28), Pl(53), Il(266), jl(), Wf(), - ic.endNonterminal("LetBinding", Vl); + ic.endNonterminal("LetBinding", Vl)); } function yt() { switch ($l) { case 31: - Hl(31), Il(245), Ni(), Il(109), $l == 80 && ks(); + (Hl(31), Il(245), Ni(), Il(109), $l == 80 && ks()); break; default: dt(); } - Il(28), Hl(53), Il(266), Xf(); + (Il(28), Hl(53), Il(266), Xf()); } function bt() { - ic.startNonterminal("WindowClause", Vl), Pl(139), Il(139); + (ic.startNonterminal("WindowClause", Vl), Pl(139), Il(139)); switch ($l) { case 257: - jl(), Et(); + (jl(), Et()); break; default: - jl(), xt(); + (jl(), xt()); } ic.endNonterminal("WindowClause", Vl); } function wt() { - Hl(139), Il(139); + (Hl(139), Il(139)); switch ($l) { case 257: St(); @@ -15740,7 +15759,7 @@ } } function Et() { - ic.startNonterminal("TumblingWindowClause", Vl), + (ic.startNonterminal("TumblingWindowClause", Vl), Pl(257), Il(88), Pl(275), @@ -15757,12 +15776,12 @@ jl(), Wf(), jl(), - Nt(); - if ($l == 127 || $l == 202) jl(), kt(); + Nt()); + if ($l == 127 || $l == 202) (jl(), kt()); ic.endNonterminal("TumblingWindowClause", Vl); } function St() { - Hl(257), + (Hl(257), Il(88), Hl(275), Il(21), @@ -15776,10 +15795,10 @@ Il(266), Xf(), Ct(), - ($l == 127 || $l == 202) && Lt(); + ($l == 127 || $l == 202) && Lt()); } function xt() { - ic.startNonterminal("SlidingWindowClause", Vl), + (ic.startNonterminal("SlidingWindowClause", Vl), Pl(239), Il(88), Pl(275), @@ -15799,10 +15818,10 @@ Nt(), jl(), kt(), - ic.endNonterminal("SlidingWindowClause", Vl); + ic.endNonterminal("SlidingWindowClause", Vl)); } function Tt() { - Hl(239), + (Hl(239), Il(88), Hl(275), Il(21), @@ -15816,10 +15835,10 @@ Il(266), Xf(), Ct(), - Lt(); + Lt()); } function Nt() { - ic.startNonterminal("WindowStartCondition", Vl), + (ic.startNonterminal("WindowStartCondition", Vl), Pl(242), Il(181), jl(), @@ -15829,13 +15848,13 @@ Il(266), jl(), Wf(), - ic.endNonterminal("WindowStartCondition", Vl); + ic.endNonterminal("WindowStartCondition", Vl)); } function Ct() { - Hl(242), Il(181), Ot(), Il(86), Hl(271), Il(266), Xf(); + (Hl(242), Il(181), Ot(), Il(86), Hl(271), Il(266), Xf()); } function kt() { - ic.startNonterminal("WindowEndCondition", Vl), + (ic.startNonterminal("WindowEndCondition", Vl), $l == 202 && Pl(202), Il(53), Pl(127), @@ -15847,10 +15866,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("WindowEndCondition", Vl); + ic.endNonterminal("WindowEndCondition", Vl)); } function Lt() { - $l == 202 && Hl(202), + ($l == 202 && Hl(202), Il(53), Hl(127), Il(181), @@ -15858,10 +15877,10 @@ Il(86), Hl(271), Il(266), - Xf(); + Xf()); } function At() { - ic.startNonterminal("WindowVars", Vl), + (ic.startNonterminal("WindowVars", Vl), $l == 31 && (Pl(31), Il(245), jl(), Mt()), Il(174), $l == 82 && (jl(), ct()), @@ -15869,84 +15888,84 @@ $l == 219 && (Pl(219), Il(21), Pl(31), Il(245), jl(), Dt()), Il(131), $l == 190 && (Pl(190), Il(21), Pl(31), Il(245), jl(), Ht()), - ic.endNonterminal("WindowVars", Vl); + ic.endNonterminal("WindowVars", Vl)); } function Ot() { - $l == 31 && (Hl(31), Il(245), _t()), + ($l == 31 && (Hl(31), Il(245), _t()), Il(174), $l == 82 && ht(), Il(163), $l == 219 && (Hl(219), Il(21), Hl(31), Il(245), Pt()), Il(131), - $l == 190 && (Hl(190), Il(21), Hl(31), Il(245), Bt()); + $l == 190 && (Hl(190), Il(21), Hl(31), Il(245), Bt())); } function Mt() { - ic.startNonterminal("CurrentItem", Vl), + (ic.startNonterminal("CurrentItem", Vl), $a(), - ic.endNonterminal("CurrentItem", Vl); + ic.endNonterminal("CurrentItem", Vl)); } function _t() { Ja(); } function Dt() { - ic.startNonterminal("PreviousItem", Vl), + (ic.startNonterminal("PreviousItem", Vl), $a(), - ic.endNonterminal("PreviousItem", Vl); + ic.endNonterminal("PreviousItem", Vl)); } function Pt() { Ja(); } function Ht() { - ic.startNonterminal("NextItem", Vl), + (ic.startNonterminal("NextItem", Vl), $a(), - ic.endNonterminal("NextItem", Vl); + ic.endNonterminal("NextItem", Vl)); } function Bt() { Ja(); } function jt() { - ic.startNonterminal("CountClause", Vl), + (ic.startNonterminal("CountClause", Vl), Pl(106), Il(21), Pl(31), Il(245), jl(), Ti(), - ic.endNonterminal("CountClause", Vl); + ic.endNonterminal("CountClause", Vl)); } function Ft() { - Hl(106), Il(21), Hl(31), Il(245), Ni(); + (Hl(106), Il(21), Hl(31), Il(245), Ni()); } function It() { - ic.startNonterminal("WhereClause", Vl), + (ic.startNonterminal("WhereClause", Vl), Pl(272), Il(266), jl(), Wf(), - ic.endNonterminal("WhereClause", Vl); + ic.endNonterminal("WhereClause", Vl)); } function qt() { - Hl(272), Il(266), Xf(); + (Hl(272), Il(266), Xf()); } function Rt() { - ic.startNonterminal("GroupByClause", Vl), + (ic.startNonterminal("GroupByClause", Vl), Pl(150), Il(37), Pl(88), Il(266), jl(), zt(), - ic.endNonterminal("GroupByClause", Vl); + ic.endNonterminal("GroupByClause", Vl)); } function Ut() { - Hl(150), Il(37), Hl(88), Il(266), Wt(); + (Hl(150), Il(37), Hl(88), Il(266), Wt()); } function zt() { - ic.startNonterminal("GroupingSpecList", Vl), Xt(); + (ic.startNonterminal("GroupingSpecList", Vl), Xt()); for (;;) { Il(198); if ($l != 42) break; - Pl(42), Il(266), jl(), Xt(); + (Pl(42), Il(266), jl(), Xt()); } ic.endNonterminal("GroupingSpecList", Vl); } @@ -15955,7 +15974,7 @@ for (;;) { Il(198); if ($l != 42) break; - Hl(42), Il(266), Vt(); + (Hl(42), Il(266), Vt()); } } function Xt() { @@ -16120,14 +16139,14 @@ o = Gl, u = Yl; try { - Jt(), Il(205); + (Jt(), Il(205)); if ($l == 53 || $l == 80) - $l == 80 && ks(), Il(28), Hl(53), Il(266), Xf(); - $l == 95 && (Hl(95), Il(15), Hl(7)), (Wl = -1); + ($l == 80 && ks(), Il(28), Hl(53), Il(266), Xf()); + ($l == 95 && (Hl(95), Il(15), Hl(7)), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -16138,19 +16157,19 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(2, Vl, Wl); + oc(2, Vl, Wl)); } } switch (Wl) { case -1: - $t(), Il(205); + ($t(), Il(205)); if ($l == 53 || $l == 80) - $l == 80 && (jl(), Cs()), + ($l == 80 && (jl(), Cs()), Il(28), Pl(53), Il(266), jl(), - Wf(); + Wf()); $l == 95 && (Pl(95), Il(15), Pl(7)); break; default: @@ -16319,14 +16338,14 @@ o = Gl, u = Yl; try { - Jt(), Il(205); + (Jt(), Il(205)); if ($l == 53 || $l == 80) - $l == 80 && ks(), Il(28), Hl(53), Il(266), Xf(); - $l == 95 && (Hl(95), Il(15), Hl(7)), + ($l == 80 && ks(), Il(28), Hl(53), Il(266), Xf()); + ($l == 95 && (Hl(95), Il(15), Hl(7)), oc(2, t, -1), - (Wl = -3); + (Wl = -3)); } catch (a) { - (Wl = -2), + ((Wl = -2), (Xl = e), (Vl = t), ($l = n), @@ -16338,15 +16357,15 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(2, t, -2); + oc(2, t, -2)); } } } switch (Wl) { case -1: - Jt(), Il(205); + (Jt(), Il(205)); if ($l == 53 || $l == 80) - $l == 80 && ks(), Il(28), Hl(53), Il(266), Xf(); + ($l == 80 && ks(), Il(28), Hl(53), Il(266), Xf()); $l == 95 && (Hl(95), Il(15), Hl(7)); break; case -3: @@ -16356,43 +16375,43 @@ } } function $t() { - ic.startNonterminal("GroupingVariable", Vl), + (ic.startNonterminal("GroupingVariable", Vl), Pl(31), Il(245), jl(), Ti(), - ic.endNonterminal("GroupingVariable", Vl); + ic.endNonterminal("GroupingVariable", Vl)); } function Jt() { - Hl(31), Il(245), Ni(); + (Hl(31), Il(245), Ni()); } function Kt() { ic.startNonterminal("OrderByClause", Vl); switch ($l) { case 205: - Pl(205), Il(37), Pl(88); + (Pl(205), Il(37), Pl(88)); break; default: - Pl(241), Il(70), Pl(205), Il(37), Pl(88); + (Pl(241), Il(70), Pl(205), Il(37), Pl(88)); } - Il(266), jl(), Gt(), ic.endNonterminal("OrderByClause", Vl); + (Il(266), jl(), Gt(), ic.endNonterminal("OrderByClause", Vl)); } function Qt() { switch ($l) { case 205: - Hl(205), Il(37), Hl(88); + (Hl(205), Il(37), Hl(88)); break; default: - Hl(241), Il(70), Hl(205), Il(37), Hl(88); + (Hl(241), Il(70), Hl(205), Il(37), Hl(88)); } - Il(266), Yt(); + (Il(266), Yt()); } function Gt() { - ic.startNonterminal("OrderSpecList", Vl), Zt(); + (ic.startNonterminal("OrderSpecList", Vl), Zt()); for (;;) { Il(198); if ($l != 42) break; - Pl(42), Il(266), jl(), Zt(); + (Pl(42), Il(266), jl(), Zt()); } ic.endNonterminal("OrderSpecList", Vl); } @@ -16401,18 +16420,18 @@ for (;;) { Il(198); if ($l != 42) break; - Hl(42), Il(266), en(); + (Hl(42), Il(266), en()); } } function Zt() { - ic.startNonterminal("OrderSpec", Vl), + (ic.startNonterminal("OrderSpec", Vl), Wf(), jl(), tn(), - ic.endNonterminal("OrderSpec", Vl); + ic.endNonterminal("OrderSpec", Vl)); } function en() { - Xf(), nn(); + (Xf(), nn()); } function tn() { ic.startNonterminal("OrderModifier", Vl); @@ -16426,7 +16445,7 @@ } Il(202); if ($l == 124) { - Pl(124), Il(125); + (Pl(124), Il(125)); switch ($l) { case 149: Pl(149); @@ -16435,9 +16454,9 @@ Pl(176); } } - Il(199), + (Il(199), $l == 95 && (Pl(95), Il(15), Pl(7)), - ic.endNonterminal("OrderModifier", Vl); + ic.endNonterminal("OrderModifier", Vl)); } function nn() { if ($l == 81 || $l == 114) @@ -16450,7 +16469,7 @@ } Il(202); if ($l == 124) { - Hl(124), Il(125); + (Hl(124), Il(125)); switch ($l) { case 149: Hl(149); @@ -16459,18 +16478,18 @@ Hl(176); } } - Il(199), $l == 95 && (Hl(95), Il(15), Hl(7)); + (Il(199), $l == 95 && (Hl(95), Il(15), Hl(7))); } function rn() { - ic.startNonterminal("ReturnClause", Vl), + (ic.startNonterminal("ReturnClause", Vl), Pl(224), Il(266), jl(), Wf(), - ic.endNonterminal("ReturnClause", Vl); + ic.endNonterminal("ReturnClause", Vl)); } function sn() { - Hl(224), Il(266), Xf(); + (Hl(224), Il(266), Xf()); } function on() { ic.startNonterminal("QuantifiedExpr", Vl); @@ -16481,16 +16500,16 @@ default: Pl(130); } - Il(21), jl(), an(); + (Il(21), jl(), an()); for (;;) { if ($l != 42) break; - Pl(42), Il(21), jl(), an(); + (Pl(42), Il(21), jl(), an()); } - Pl(228), + (Pl(228), Il(266), jl(), Wf(), - ic.endNonterminal("QuantifiedExpr", Vl); + ic.endNonterminal("QuantifiedExpr", Vl)); } function un() { switch ($l) { @@ -16500,15 +16519,15 @@ default: Hl(130); } - Il(21), fn(); + (Il(21), fn()); for (;;) { if ($l != 42) break; - Hl(42), Il(21), fn(); + (Hl(42), Il(21), fn()); } - Hl(228), Il(266), Xf(); + (Hl(228), Il(266), Xf()); } function an() { - ic.startNonterminal("QuantifiedVarDecl", Vl), + (ic.startNonterminal("QuantifiedVarDecl", Vl), Pl(31), Il(245), jl(), @@ -16520,10 +16539,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("QuantifiedVarDecl", Vl); + ic.endNonterminal("QuantifiedVarDecl", Vl)); } function fn() { - Hl(31), + (Hl(31), Il(245), Ni(), Il(114), @@ -16531,78 +16550,78 @@ Il(56), Hl(156), Il(266), - Xf(); + Xf()); } function ln() { - ic.startNonterminal("SwitchExpr", Vl), + (ic.startNonterminal("SwitchExpr", Vl), Pl(248), Il(22), Pl(35), Il(266), jl(), G(), - Pl(38); + Pl(38)); for (;;) { - Il(38), jl(), hn(); + (Il(38), jl(), hn()); if ($l != 89) break; } - Pl(110), + (Pl(110), Il(73), Pl(224), Il(266), jl(), Wf(), - ic.endNonterminal("SwitchExpr", Vl); + ic.endNonterminal("SwitchExpr", Vl)); } function cn() { - Hl(248), Il(22), Hl(35), Il(266), Y(), Hl(38); + (Hl(248), Il(22), Hl(35), Il(266), Y(), Hl(38)); for (;;) { - Il(38), pn(); + (Il(38), pn()); if ($l != 89) break; } - Hl(110), Il(73), Hl(224), Il(266), Xf(); + (Hl(110), Il(73), Hl(224), Il(266), Xf()); } function hn() { ic.startNonterminal("SwitchCaseClause", Vl); for (;;) { - Pl(89), Il(266), jl(), dn(); + (Pl(89), Il(266), jl(), dn()); if ($l != 89) break; } - Pl(224), + (Pl(224), Il(266), jl(), Wf(), - ic.endNonterminal("SwitchCaseClause", Vl); + ic.endNonterminal("SwitchCaseClause", Vl)); } function pn() { for (;;) { - Hl(89), Il(266), vn(); + (Hl(89), Il(266), vn()); if ($l != 89) break; } - Hl(224), Il(266), Xf(); + (Hl(224), Il(266), Xf()); } function dn() { - ic.startNonterminal("SwitchCaseOperand", Vl), + (ic.startNonterminal("SwitchCaseOperand", Vl), Wf(), - ic.endNonterminal("SwitchCaseOperand", Vl); + ic.endNonterminal("SwitchCaseOperand", Vl)); } function vn() { Xf(); } function mn() { - ic.startNonterminal("TypeswitchExpr", Vl), + (ic.startNonterminal("TypeswitchExpr", Vl), Pl(259), Il(22), Pl(35), Il(266), jl(), G(), - Pl(38); + Pl(38)); for (;;) { - Il(38), jl(), yn(); + (Il(38), jl(), yn()); if ($l != 89) break; } - Pl(110), + (Pl(110), Il(99), $l == 31 && (Pl(31), Il(245), jl(), Ti()), Il(73), @@ -16610,24 +16629,24 @@ Il(266), jl(), Wf(), - ic.endNonterminal("TypeswitchExpr", Vl); + ic.endNonterminal("TypeswitchExpr", Vl)); } function gn() { - Hl(259), Il(22), Hl(35), Il(266), Y(), Hl(38); + (Hl(259), Il(22), Hl(35), Il(266), Y(), Hl(38)); for (;;) { - Il(38), bn(); + (Il(38), bn()); if ($l != 89) break; } - Hl(110), + (Hl(110), Il(99), $l == 31 && (Hl(31), Il(245), Ni()), Il(73), Hl(224), Il(266), - Xf(); + Xf()); } function yn() { - ic.startNonterminal("CaseClause", Vl), + (ic.startNonterminal("CaseClause", Vl), Pl(89), Il(257), $l == 31 && (Pl(31), Il(245), jl(), Ti(), Il(33), Pl(80)), @@ -16638,24 +16657,24 @@ Il(266), jl(), Wf(), - ic.endNonterminal("CaseClause", Vl); + ic.endNonterminal("CaseClause", Vl)); } function bn() { - Hl(89), + (Hl(89), Il(257), $l == 31 && (Hl(31), Il(245), Ni(), Il(33), Hl(80)), Il(253), En(), Hl(224), Il(266), - Xf(); + Xf()); } function wn() { - ic.startNonterminal("SequenceTypeUnion", Vl), Ls(); + (ic.startNonterminal("SequenceTypeUnion", Vl), Ls()); for (;;) { Il(138); if ($l != 284) break; - Pl(284), Il(253), jl(), Ls(); + (Pl(284), Il(253), jl(), Ls()); } ic.endNonterminal("SequenceTypeUnion", Vl); } @@ -16664,11 +16683,11 @@ for (;;) { Il(138); if ($l != 284) break; - Hl(284), Il(253), As(); + (Hl(284), Il(253), As()); } } function Sn() { - ic.startNonterminal("IfExpr", Vl), + (ic.startNonterminal("IfExpr", Vl), Pl(154), Il(22), Pl(35), @@ -16685,10 +16704,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("IfExpr", Vl); + ic.endNonterminal("IfExpr", Vl)); } function xn() { - Hl(154), + (Hl(154), Il(22), Hl(35), Il(266), @@ -16700,12 +16719,12 @@ Xf(), Hl(123), Il(266), - Xf(); + Xf()); } function Tn() { - ic.startNonterminal("TryCatchExpr", Vl), Cn(); + (ic.startNonterminal("TryCatchExpr", Vl), Cn()); for (;;) { - Il(39), jl(), On(), Il(207); + (Il(39), jl(), On(), Il(207)); if ($l != 92) break; } ic.endNonterminal("TryCatchExpr", Vl); @@ -16713,12 +16732,12 @@ function Nn() { kn(); for (;;) { - Il(39), Mn(), Il(207); + (Il(39), Mn(), Il(207)); if ($l != 92) break; } } function Cn() { - ic.startNonterminal("TryClause", Vl), + (ic.startNonterminal("TryClause", Vl), Pl(256), Il(90), Pl(281), @@ -16726,21 +16745,21 @@ jl(), Ln(), Pl(287), - ic.endNonterminal("TryClause", Vl); + ic.endNonterminal("TryClause", Vl)); } function kn() { - Hl(256), Il(90), Hl(281), Il(266), An(), Hl(287); + (Hl(256), Il(90), Hl(281), Il(266), An(), Hl(287)); } function Ln() { - ic.startNonterminal("TryTargetExpr", Vl), + (ic.startNonterminal("TryTargetExpr", Vl), G(), - ic.endNonterminal("TryTargetExpr", Vl); + ic.endNonterminal("TryTargetExpr", Vl)); } function An() { Y(); } function On() { - ic.startNonterminal("CatchClause", Vl), + (ic.startNonterminal("CatchClause", Vl), Pl(92), Il(248), jl(), @@ -16750,17 +16769,17 @@ jl(), G(), Pl(287), - ic.endNonterminal("CatchClause", Vl); + ic.endNonterminal("CatchClause", Vl)); } function Mn() { - Hl(92), Il(248), Dn(), Hl(281), Il(266), Y(), Hl(287); + (Hl(92), Il(248), Dn(), Hl(281), Il(266), Y(), Hl(287)); } function _n() { - ic.startNonterminal("CatchErrorList", Vl), Yr(); + (ic.startNonterminal("CatchErrorList", Vl), Yr()); for (;;) { Il(140); if ($l != 284) break; - Pl(284), Il(248), jl(), Yr(); + (Pl(284), Il(248), jl(), Yr()); } ic.endNonterminal("CatchErrorList", Vl); } @@ -16769,14 +16788,14 @@ for (;;) { Il(140); if ($l != 284) break; - Hl(284), Il(248), Zr(); + (Hl(284), Il(248), Zr()); } } function Pn() { - ic.startNonterminal("OrExpr", Vl), Bn(); + (ic.startNonterminal("OrExpr", Vl), Bn()); for (;;) { if ($l != 204) break; - Pl(204), Il(266), jl(), Bn(); + (Pl(204), Il(266), jl(), Bn()); } ic.endNonterminal("OrExpr", Vl); } @@ -16784,14 +16803,14 @@ jn(); for (;;) { if ($l != 204) break; - Hl(204), Il(266), jn(); + (Hl(204), Il(266), jn()); } } function Bn() { - ic.startNonterminal("AndExpr", Vl), Fn(); + (ic.startNonterminal("AndExpr", Vl), Fn()); for (;;) { if ($l != 76) break; - Pl(76), Il(266), jl(), Fn(); + (Pl(76), Il(266), jl(), Fn()); } ic.endNonterminal("AndExpr", Vl); } @@ -16799,22 +16818,22 @@ In(); for (;;) { if ($l != 76) break; - Hl(76), Il(266), In(); + (Hl(76), Il(266), In()); } } function Fn() { - ic.startNonterminal("NotExpr", Vl), + (ic.startNonterminal("NotExpr", Vl), $l == 196 && Pl(196), Il(265), jl(), qn(), - ic.endNonterminal("NotExpr", Vl); + ic.endNonterminal("NotExpr", Vl)); } function In() { - $l == 196 && Hl(196), Il(265), Rn(); + ($l == 196 && Hl(196), Il(265), Rn()); } function qn() { - ic.startNonterminal("ComparisonExpr", Vl), Un(); + (ic.startNonterminal("ComparisonExpr", Vl), Un()); if ( $l == 27 || $l == 55 || @@ -16839,17 +16858,17 @@ case 175: case 181: case 189: - jl(), yr(); + (jl(), yr()); break; case 58: case 64: case 166: - jl(), wr(); + (jl(), wr()); break; default: - jl(), mr(); + (jl(), mr()); } - Il(265), jl(), Un(); + (Il(265), jl(), Un()); } ic.endNonterminal("ComparisonExpr", Vl); } @@ -16889,11 +16908,11 @@ default: gr(); } - Il(265), zn(); + (Il(265), zn()); } } function Un() { - ic.startNonterminal("FTContainsExpr", Vl), + (ic.startNonterminal("FTContainsExpr", Vl), Wn(), $l == 100 && (Pl(100), @@ -16903,23 +16922,23 @@ jl(), ou(), $l == 277 && (jl(), Ta())), - ic.endNonterminal("FTContainsExpr", Vl); + ic.endNonterminal("FTContainsExpr", Vl)); } function zn() { - Xn(), + (Xn(), $l == 100 && (Hl(100), Il(79), Hl(249), Il(177), uu(), - $l == 277 && Na()); + $l == 277 && Na())); } function Wn() { - ic.startNonterminal("StringConcatExpr", Vl), Vn(); + (ic.startNonterminal("StringConcatExpr", Vl), Vn()); for (;;) { if ($l != 285) break; - Pl(285), Il(265), jl(), Vn(); + (Pl(285), Il(265), jl(), Vn()); } ic.endNonterminal("StringConcatExpr", Vl); } @@ -16927,20 +16946,20 @@ $n(); for (;;) { if ($l != 285) break; - Hl(285), Il(265), $n(); + (Hl(285), Il(265), $n()); } } function Vn() { - ic.startNonterminal("RangeExpr", Vl), + (ic.startNonterminal("RangeExpr", Vl), Jn(), $l == 253 && (Pl(253), Il(265), jl(), Jn()), - ic.endNonterminal("RangeExpr", Vl); + ic.endNonterminal("RangeExpr", Vl)); } function $n() { - Kn(), $l == 253 && (Hl(253), Il(265), Kn()); + (Kn(), $l == 253 && (Hl(253), Il(265), Kn())); } function Jn() { - ic.startNonterminal("AdditiveExpr", Vl), Qn(); + (ic.startNonterminal("AdditiveExpr", Vl), Qn()); for (;;) { if ($l != 41 && $l != 43) break; switch ($l) { @@ -16950,7 +16969,7 @@ default: Pl(43); } - Il(265), jl(), Qn(); + (Il(265), jl(), Qn()); } ic.endNonterminal("AdditiveExpr", Vl); } @@ -16965,11 +16984,11 @@ default: Hl(43); } - Il(265), Gn(); + (Il(265), Gn()); } } function Qn() { - ic.startNonterminal("MultiplicativeExpr", Vl), Yn(); + (ic.startNonterminal("MultiplicativeExpr", Vl), Yn()); for (;;) { if ($l != 39 && $l != 119 && $l != 153 && $l != 183) break; switch ($l) { @@ -16985,7 +17004,7 @@ default: Pl(183); } - Il(265), jl(), Yn(); + (Il(265), jl(), Yn()); } ic.endNonterminal("MultiplicativeExpr", Vl); } @@ -17006,11 +17025,11 @@ default: Hl(183); } - Il(265), Zn(); + (Il(265), Zn()); } } function Yn() { - ic.startNonterminal("UnionExpr", Vl), er(); + (ic.startNonterminal("UnionExpr", Vl), er()); for (;;) { if ($l != 260 && $l != 284) break; switch ($l) { @@ -17020,7 +17039,7 @@ default: Pl(284); } - Il(265), jl(), er(); + (Il(265), jl(), er()); } ic.endNonterminal("UnionExpr", Vl); } @@ -17035,11 +17054,11 @@ default: Hl(284); } - Il(265), tr(); + (Il(265), tr()); } } function er() { - ic.startNonterminal("IntersectExceptExpr", Vl), nr(); + (ic.startNonterminal("IntersectExceptExpr", Vl), nr()); for (;;) { Il(221); if ($l != 132 && $l != 164) break; @@ -17050,7 +17069,7 @@ default: Pl(132); } - Il(265), jl(), nr(); + (Il(265), jl(), nr()); } ic.endNonterminal("IntersectExceptExpr", Vl); } @@ -17066,52 +17085,56 @@ default: Hl(132); } - Il(265), rr(); + (Il(265), rr()); } } function nr() { - ic.startNonterminal("InstanceofExpr", Vl), + (ic.startNonterminal("InstanceofExpr", Vl), ir(), Il(222), $l == 162 && (Pl(162), Il(67), Pl(200), Il(253), jl(), Ls()), - ic.endNonterminal("InstanceofExpr", Vl); + ic.endNonterminal("InstanceofExpr", Vl)); } function rr() { - sr(), + (sr(), Il(222), - $l == 162 && (Hl(162), Il(67), Hl(200), Il(253), As()); + $l == 162 && (Hl(162), Il(67), Hl(200), Il(253), As())); } function ir() { - ic.startNonterminal("TreatExpr", Vl), + (ic.startNonterminal("TreatExpr", Vl), or(), Il(223), $l == 254 && (Pl(254), Il(33), Pl(80), Il(253), jl(), Ls()), - ic.endNonterminal("TreatExpr", Vl); + ic.endNonterminal("TreatExpr", Vl)); } function sr() { - ur(), + (ur(), Il(223), - $l == 254 && (Hl(254), Il(33), Hl(80), Il(253), As()); + $l == 254 && (Hl(254), Il(33), Hl(80), Il(253), As())); } function or() { - ic.startNonterminal("CastableExpr", Vl), + (ic.startNonterminal("CastableExpr", Vl), ar(), Il(224), $l == 91 && (Pl(91), Il(33), Pl(80), Il(245), jl(), Ts()), - ic.endNonterminal("CastableExpr", Vl); + ic.endNonterminal("CastableExpr", Vl)); } function ur() { - fr(), Il(224), $l == 91 && (Hl(91), Il(33), Hl(80), Il(245), Ns()); + (fr(), + Il(224), + $l == 91 && (Hl(91), Il(33), Hl(80), Il(245), Ns())); } function ar() { - ic.startNonterminal("CastExpr", Vl), + (ic.startNonterminal("CastExpr", Vl), lr(), Il(226), $l == 90 && (Pl(90), Il(33), Pl(80), Il(245), jl(), Ts()), - ic.endNonterminal("CastExpr", Vl); + ic.endNonterminal("CastExpr", Vl)); } function fr() { - cr(), Il(226), $l == 90 && (Hl(90), Il(33), Hl(80), Il(245), Ns()); + (cr(), + Il(226), + $l == 90 && (Hl(90), Il(33), Hl(80), Il(245), Ns())); } function lr() { ic.startNonterminal("UnaryExpr", Vl); @@ -17126,7 +17149,7 @@ Pl(41); } } - jl(), hr(), ic.endNonterminal("UnaryExpr", Vl); + (jl(), hr(), ic.endNonterminal("UnaryExpr", Vl)); } function cr() { for (;;) { @@ -17189,10 +17212,10 @@ } } function dr() { - ic.startNonterminal("SimpleMapExpr", Vl), Or(); + (ic.startNonterminal("SimpleMapExpr", Vl), Or()); for (;;) { if ($l != 26) break; - Pl(26), Il(262), jl(), Or(); + (Pl(26), Il(262), jl(), Or()); } ic.endNonterminal("SimpleMapExpr", Vl); } @@ -17200,7 +17223,7 @@ Mr(); for (;;) { if ($l != 26) break; - Hl(26), Il(262), Mr(); + (Hl(26), Il(262), Mr()); } } function mr() { @@ -17318,34 +17341,34 @@ } } function Sr() { - ic.startNonterminal("ValidateExpr", Vl), Pl(266), Il(175); + (ic.startNonterminal("ValidateExpr", Vl), Pl(266), Il(175)); if ($l != 281) switch ($l) { case 258: - Pl(258), Il(245), jl(), Ao(); + (Pl(258), Il(245), jl(), Ao()); break; default: - jl(), Tr(); + (jl(), Tr()); } - Il(90), + (Il(90), Pl(281), Il(266), jl(), G(), Pl(287), - ic.endNonterminal("ValidateExpr", Vl); + ic.endNonterminal("ValidateExpr", Vl)); } function xr() { - Hl(266), Il(175); + (Hl(266), Il(175)); if ($l != 281) switch ($l) { case 258: - Hl(258), Il(245), Oo(); + (Hl(258), Il(245), Oo()); break; default: Nr(); } - Il(90), Hl(281), Il(266), Y(), Hl(287); + (Il(90), Hl(281), Il(266), Y(), Hl(287)); } function Tr() { ic.startNonterminal("ValidationMode", Vl); @@ -17370,24 +17393,24 @@ function Cr() { ic.startNonterminal("ExtensionExpr", Vl); for (;;) { - jl(), Lr(), Il(104); + (jl(), Lr(), Il(104)); if ($l != 36) break; } - Pl(281), + (Pl(281), Il(274), $l != 287 && (jl(), G()), Pl(287), - ic.endNonterminal("ExtensionExpr", Vl); + ic.endNonterminal("ExtensionExpr", Vl)); } function kr() { for (;;) { - Ar(), Il(104); + (Ar(), Il(104)); if ($l != 36) break; } - Hl(281), Il(274), $l != 287 && Y(), Hl(287); + (Hl(281), Il(274), $l != 287 && Y(), Hl(287)); } function Lr() { - ic.startNonterminal("Pragma", Vl), + (ic.startNonterminal("Pragma", Vl), Pl(36), Rl(242), $l == 21 && Pl(21), @@ -17396,23 +17419,23 @@ $l == 21 && (Pl(21), Rl(0), Pl(1)), Rl(5), Pl(30), - ic.endNonterminal("Pragma", Vl); + ic.endNonterminal("Pragma", Vl)); } function Ar() { - Hl(36), + (Hl(36), Rl(242), $l == 21 && Hl(21), Ja(), Rl(10), $l == 21 && (Hl(21), Rl(0), Hl(1)), Rl(5), - Hl(30); + Hl(30)); } function Or() { ic.startNonterminal("PathExpr", Vl); switch ($l) { case 47: - Pl(47), Il(288); + (Pl(47), Il(288)); switch ($l) { case 25: case 26: @@ -17443,11 +17466,11 @@ case 287: break; default: - jl(), _r(); + (jl(), _r()); } break; case 48: - Pl(48), Il(259), jl(), _r(); + (Pl(48), Il(259), jl(), _r()); break; default: _r(); @@ -17457,7 +17480,7 @@ function Mr() { switch ($l) { case 47: - Hl(47), Il(288); + (Hl(47), Il(288)); switch ($l) { case 25: case 26: @@ -17492,14 +17515,14 @@ } break; case 48: - Hl(48), Il(259), Dr(); + (Hl(48), Il(259), Dr()); break; default: Dr(); } } function _r() { - ic.startNonterminal("RelativePathExpr", Vl), ei(); + (ic.startNonterminal("RelativePathExpr", Vl), ei()); for (;;) { switch ($l) { case 26: @@ -17611,11 +17634,11 @@ default: Hl(26); } - Il(263), Hr(), (Wl = -1); + (Il(263), Hr(), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -17626,7 +17649,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(3, Vl, Wl); + oc(3, Vl, Wl)); } } if ( @@ -17648,7 +17671,7 @@ default: Pl(26); } - Il(263), jl(), Pr(); + (Il(263), jl(), Pr()); } ic.endNonterminal("RelativePathExpr", Vl); } @@ -17765,10 +17788,10 @@ default: Hl(26); } - Il(263), Hr(), oc(3, t, -1); + (Il(263), Hr(), oc(3, t, -1)); continue; } catch (a) { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -17779,7 +17802,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(3, t, -2); + oc(3, t, -2)); break; } } @@ -17803,7 +17826,7 @@ default: Hl(26); } - Il(263), Hr(); + (Il(263), Hr()); } } function Pr() { @@ -18396,11 +18419,11 @@ o = Gl, u = Yl; try { - ti(), (Wl = -1); + (ti(), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -18411,7 +18434,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(4, Vl, Wl); + oc(4, Vl, Wl)); } } switch (Wl) { @@ -19670,9 +19693,9 @@ o = Gl, u = Yl; try { - ti(), oc(4, t, -1), (Wl = -3); + (ti(), oc(4, t, -1), (Wl = -3)); } catch (a) { - (Wl = -2), + ((Wl = -2), (Xl = e), (Vl = t), ($l = n), @@ -19684,7 +19707,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(4, t, -2); + oc(4, t, -2)); } } } @@ -20381,7 +20404,7 @@ default: Fr(); } - Il(227), jl(), li(), ic.endNonterminal("AxisStep", Vl); + (Il(227), jl(), li(), ic.endNonterminal("AxisStep", Vl)); } function jr() { switch ($l) { @@ -20407,7 +20430,7 @@ default: Ir(); } - Il(227), ci(); + (Il(227), ci()); } function Fr() { ic.startNonterminal("ForwardStep", Vl); @@ -20434,7 +20457,7 @@ case 26761: case 26762: case 26858: - qr(), Il(248), jl(), Qr(); + (qr(), Il(248), jl(), Qr()); break; default: Ur(); @@ -20465,7 +20488,7 @@ case 26761: case 26762: case 26858: - Rr(), Il(248), Gr(); + (Rr(), Il(248), Gr()); break; default: zr(); @@ -20475,62 +20498,62 @@ ic.startNonterminal("ForwardAxis", Vl); switch ($l) { case 94: - Pl(94), Il(27), Pl(52); + (Pl(94), Il(27), Pl(52)); break; case 112: - Pl(112), Il(27), Pl(52); + (Pl(112), Il(27), Pl(52)); break; case 83: - Pl(83), Il(27), Pl(52); + (Pl(83), Il(27), Pl(52)); break; case 234: - Pl(234), Il(27), Pl(52); + (Pl(234), Il(27), Pl(52)); break; case 113: - Pl(113), Il(27), Pl(52); + (Pl(113), Il(27), Pl(52)); break; case 138: - Pl(138), Il(27), Pl(52); + (Pl(138), Il(27), Pl(52)); break; default: - Pl(137), Il(27), Pl(52); + (Pl(137), Il(27), Pl(52)); } ic.endNonterminal("ForwardAxis", Vl); } function Rr() { switch ($l) { case 94: - Hl(94), Il(27), Hl(52); + (Hl(94), Il(27), Hl(52)); break; case 112: - Hl(112), Il(27), Hl(52); + (Hl(112), Il(27), Hl(52)); break; case 83: - Hl(83), Il(27), Hl(52); + (Hl(83), Il(27), Hl(52)); break; case 234: - Hl(234), Il(27), Hl(52); + (Hl(234), Il(27), Hl(52)); break; case 113: - Hl(113), Il(27), Hl(52); + (Hl(113), Il(27), Hl(52)); break; case 138: - Hl(138), Il(27), Hl(52); + (Hl(138), Il(27), Hl(52)); break; default: - Hl(137), Il(27), Hl(52); + (Hl(137), Il(27), Hl(52)); } } function Ur() { - ic.startNonterminal("AbbrevForwardStep", Vl), + (ic.startNonterminal("AbbrevForwardStep", Vl), $l == 67 && Pl(67), Il(248), jl(), Qr(), - ic.endNonterminal("AbbrevForwardStep", Vl); + ic.endNonterminal("AbbrevForwardStep", Vl)); } function zr() { - $l == 67 && Hl(67), Il(248), Gr(); + ($l == 67 && Hl(67), Il(248), Gr()); } function Wr() { ic.startNonterminal("ReverseStep", Vl); @@ -20539,7 +20562,7 @@ Jr(); break; default: - Vr(), Il(248), jl(), Qr(); + (Vr(), Il(248), jl(), Qr()); } ic.endNonterminal("ReverseStep", Vl); } @@ -20549,51 +20572,51 @@ Kr(); break; default: - $r(), Il(248), Gr(); + ($r(), Il(248), Gr()); } } function Vr() { ic.startNonterminal("ReverseAxis", Vl); switch ($l) { case 210: - Pl(210), Il(27), Pl(52); + (Pl(210), Il(27), Pl(52)); break; case 74: - Pl(74), Il(27), Pl(52); + (Pl(74), Il(27), Pl(52)); break; case 217: - Pl(217), Il(27), Pl(52); + (Pl(217), Il(27), Pl(52)); break; case 216: - Pl(216), Il(27), Pl(52); + (Pl(216), Il(27), Pl(52)); break; default: - Pl(75), Il(27), Pl(52); + (Pl(75), Il(27), Pl(52)); } ic.endNonterminal("ReverseAxis", Vl); } function $r() { switch ($l) { case 210: - Hl(210), Il(27), Hl(52); + (Hl(210), Il(27), Hl(52)); break; case 74: - Hl(74), Il(27), Hl(52); + (Hl(74), Il(27), Hl(52)); break; case 217: - Hl(217), Il(27), Hl(52); + (Hl(217), Il(27), Hl(52)); break; case 216: - Hl(216), Il(27), Hl(52); + (Hl(216), Il(27), Hl(52)); break; default: - Hl(75), Il(27), Hl(52); + (Hl(75), Il(27), Hl(52)); } } function Jr() { - ic.startNonterminal("AbbrevReverseStep", Vl), + (ic.startNonterminal("AbbrevReverseStep", Vl), Pl(46), - ic.endNonterminal("AbbrevReverseStep", Vl); + ic.endNonterminal("AbbrevReverseStep", Vl)); } function Kr() { Hl(46); @@ -20689,7 +20712,7 @@ } } function ei() { - ic.startNonterminal("PostfixExpr", Vl), yl(); + (ic.startNonterminal("PostfixExpr", Vl), yl()); for (;;) { Il(234); if ($l != 35 && $l != 45 && $l != 69) break; @@ -20712,11 +20735,11 @@ o = Gl, u = Yl; try { - pi(), (Wl = -1); + (pi(), (Wl = -1)); } catch (a) { Wl = -4; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -20727,24 +20750,24 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(5, Vl, Wl); + oc(5, Vl, Wl)); } } switch (Wl) { case 35: - jl(), ai(); + (jl(), ai()); break; case 45: - jl(), ni(); + (jl(), ni()); break; case -4: - jl(), ii(); + (jl(), ii()); break; case 35909: - jl(), oi(); + (jl(), oi()); break; default: - jl(), hi(); + (jl(), hi()); } } ic.endNonterminal("PostfixExpr", Vl); @@ -20773,9 +20796,9 @@ o = Gl, u = Yl; try { - pi(), oc(5, t, -1), (Wl = -6); + (pi(), oc(5, t, -1), (Wl = -6)); } catch (a) { - (Wl = -4), + ((Wl = -4), (Xl = e), (Vl = t), ($l = n), @@ -20787,7 +20810,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(5, t, -4); + oc(5, t, -4)); } } } @@ -20812,27 +20835,27 @@ } } function ni() { - ic.startNonterminal("ObjectLookup", Vl), Pl(45), Il(250); + (ic.startNonterminal("ObjectLookup", Vl), Pl(45), Il(250)); switch ($l) { case 11: Pl(11); break; case 35: - jl(), Ci(); + (jl(), Ci()); break; case 31: - jl(), Si(); + (jl(), Si()); break; case 32: - jl(), Li(); + (jl(), Li()); break; default: - jl(), Ga(); + (jl(), Ga()); } ic.endNonterminal("ObjectLookup", Vl); } function ri() { - Hl(45), Il(250); + (Hl(45), Il(250)); switch ($l) { case 11: Hl(11); @@ -20851,7 +20874,7 @@ } } function ii() { - ic.startNonterminal("ArrayLookup", Vl), + (ic.startNonterminal("ArrayLookup", Vl), Pl(69), Il(31), Pl(69), @@ -20861,41 +20884,41 @@ Pl(70), Il(32), Pl(70), - ic.endNonterminal("ArrayLookup", Vl); + ic.endNonterminal("ArrayLookup", Vl)); } function si() { - Hl(69), Il(31), Hl(69), Il(266), Y(), Hl(70), Il(32), Hl(70); + (Hl(69), Il(31), Hl(69), Il(266), Y(), Hl(70), Il(32), Hl(70)); } function oi() { - ic.startNonterminal("ArrayUnboxing", Vl), + (ic.startNonterminal("ArrayUnboxing", Vl), Pl(69), Il(32), Pl(70), - ic.endNonterminal("ArrayUnboxing", Vl); + ic.endNonterminal("ArrayUnboxing", Vl)); } function ui() { - Hl(69), Il(32), Hl(70); + (Hl(69), Il(32), Hl(70)); } function ai() { - ic.startNonterminal("ArgumentList", Vl), Pl(35), Il(279); + (ic.startNonterminal("ArgumentList", Vl), Pl(35), Il(279)); if ($l != 38) { - jl(), Bi(); + (jl(), Bi()); for (;;) { Il(105); if ($l != 42) break; - Pl(42), Il(271), jl(), Bi(); + (Pl(42), Il(271), jl(), Bi()); } } - Pl(38), ic.endNonterminal("ArgumentList", Vl); + (Pl(38), ic.endNonterminal("ArgumentList", Vl)); } function fi() { - Hl(35), Il(279); + (Hl(35), Il(279)); if ($l != 38) { ji(); for (;;) { Il(105); if ($l != 42) break; - Hl(42), Il(271), ji(); + (Hl(42), Il(271), ji()); } } Hl(38); @@ -20905,7 +20928,7 @@ for (;;) { Il(227); if ($l != 69) break; - jl(), hi(); + (jl(), hi()); } ic.endNonterminal("PredicateList", Vl); } @@ -20917,16 +20940,16 @@ } } function hi() { - ic.startNonterminal("Predicate", Vl), + (ic.startNonterminal("Predicate", Vl), Pl(69), Il(266), jl(), G(), Pl(70), - ic.endNonterminal("Predicate", Vl); + ic.endNonterminal("Predicate", Vl)); } function pi() { - Hl(69), Il(266), Y(), Hl(70); + (Hl(69), Il(266), Y(), Hl(70)); } function di() { ic.startNonterminal("Literal", Vl); @@ -20983,9 +21006,9 @@ } } function yi() { - ic.startNonterminal("NullLiteral", Vl), + (ic.startNonterminal("NullLiteral", Vl), Pl(197), - ic.endNonterminal("NullLiteral", Vl); + ic.endNonterminal("NullLiteral", Vl)); } function bi() { Hl(197); @@ -21017,45 +21040,45 @@ } } function Si() { - ic.startNonterminal("VarRef", Vl), + (ic.startNonterminal("VarRef", Vl), Pl(31), Il(245), jl(), Ti(), - ic.endNonterminal("VarRef", Vl); + ic.endNonterminal("VarRef", Vl)); } function xi() { - Hl(31), Il(245), Ni(); + (Hl(31), Il(245), Ni()); } function Ti() { - ic.startNonterminal("VarName", Vl), + (ic.startNonterminal("VarName", Vl), $a(), - ic.endNonterminal("VarName", Vl); + ic.endNonterminal("VarName", Vl)); } function Ni() { Ja(); } function Ci() { - ic.startNonterminal("ParenthesizedExpr", Vl), + (ic.startNonterminal("ParenthesizedExpr", Vl), Pl(35), Il(269), $l != 38 && (jl(), G()), Pl(38), - ic.endNonterminal("ParenthesizedExpr", Vl); + ic.endNonterminal("ParenthesizedExpr", Vl)); } function ki() { - Hl(35), Il(269), $l != 38 && Y(), Hl(38); + (Hl(35), Il(269), $l != 38 && Y(), Hl(38)); } function Li() { - ic.startNonterminal("ContextItemExpr", Vl), + (ic.startNonterminal("ContextItemExpr", Vl), Pl(32), - ic.endNonterminal("ContextItemExpr", Vl); + ic.endNonterminal("ContextItemExpr", Vl)); } function Ai() { Hl(32); } function Oi() { - ic.startNonterminal("OrderedExpr", Vl), + (ic.startNonterminal("OrderedExpr", Vl), Pl(206), Il(90), Pl(281), @@ -21063,13 +21086,13 @@ jl(), G(), Pl(287), - ic.endNonterminal("OrderedExpr", Vl); + ic.endNonterminal("OrderedExpr", Vl)); } function Mi() { - Hl(206), Il(90), Hl(281), Il(266), Y(), Hl(287); + (Hl(206), Il(90), Hl(281), Il(266), Y(), Hl(287)); } function _i() { - ic.startNonterminal("UnorderedExpr", Vl), + (ic.startNonterminal("UnorderedExpr", Vl), Pl(262), Il(90), Pl(281), @@ -21077,21 +21100,21 @@ jl(), G(), Pl(287), - ic.endNonterminal("UnorderedExpr", Vl); + ic.endNonterminal("UnorderedExpr", Vl)); } function Di() { - Hl(262), Il(90), Hl(281), Il(266), Y(), Hl(287); + (Hl(262), Il(90), Hl(281), Il(266), Y(), Hl(287)); } function Pi() { - ic.startNonterminal("FunctionCall", Vl), + (ic.startNonterminal("FunctionCall", Vl), Ka(), Il(22), jl(), ai(), - ic.endNonterminal("FunctionCall", Vl); + ic.endNonterminal("FunctionCall", Vl)); } function Hi() { - Qa(), Il(22), fi(); + (Qa(), Il(22), fi()); } function Bi() { ic.startNonterminal("Argument", Vl); @@ -21114,9 +21137,9 @@ } } function Fi() { - ic.startNonterminal("ArgumentPlaceholder", Vl), + (ic.startNonterminal("ArgumentPlaceholder", Vl), Pl(65), - ic.endNonterminal("ArgumentPlaceholder", Vl); + ic.endNonterminal("ArgumentPlaceholder", Vl)); } function Ii() { Hl(65); @@ -21172,11 +21195,11 @@ } } function Wi() { - ic.startNonterminal("DirElemConstructor", Vl), + (ic.startNonterminal("DirElemConstructor", Vl), Pl(55), Rl(4), Pl(20), - Vi(); + Vi()); switch ($l) { case 49: Pl(49); @@ -21188,18 +21211,18 @@ if ($l == 57) break; es(); } - Pl(57), + (Pl(57), Rl(4), Pl(20), Rl(12), $l == 21 && Pl(21), Rl(8), - Pl(62); + Pl(62)); } ic.endNonterminal("DirElemConstructor", Vl); } function Xi() { - Hl(55), Rl(4), Hl(20), $i(); + (Hl(55), Rl(4), Hl(20), $i()); switch ($l) { case 49: Hl(49); @@ -21211,13 +21234,13 @@ if ($l == 57) break; ts(); } - Hl(57), + (Hl(57), Rl(4), Hl(20), Rl(12), $l == 21 && Hl(21), Rl(8), - Hl(62); + Hl(62)); } } function Vi() { @@ -21225,7 +21248,7 @@ for (;;) { Rl(19); if ($l != 21) break; - Pl(21), + (Pl(21), Rl(94), $l == 20 && (Pl(20), @@ -21235,7 +21258,7 @@ Pl(61), Rl(18), $l == 21 && Pl(21), - Ji()); + Ji())); } ic.endNonterminal("DirAttributeList", Vl); } @@ -21243,7 +21266,7 @@ for (;;) { Rl(19); if ($l != 21) break; - Hl(21), + (Hl(21), Rl(94), $l == 20 && (Hl(20), @@ -21253,11 +21276,11 @@ Hl(61), Rl(18), $l == 21 && Hl(21), - Ki()); + Ki())); } } function Ji() { - ic.startNonterminal("DirAttributeValue", Vl), Rl(14); + (ic.startNonterminal("DirAttributeValue", Vl), Rl(14)); switch ($l) { case 28: Pl(28); @@ -21402,19 +21425,19 @@ } } function ns() { - ic.startNonterminal("DirCommentConstructor", Vl), + (ic.startNonterminal("DirCommentConstructor", Vl), Pl(56), Rl(1), Pl(2), Rl(6), Pl(44), - ic.endNonterminal("DirCommentConstructor", Vl); + ic.endNonterminal("DirCommentConstructor", Vl)); } function rs() { - Hl(56), Rl(1), Hl(2), Rl(6), Hl(44); + (Hl(56), Rl(1), Hl(2), Rl(6), Hl(44)); } function is() { - ic.startNonterminal("DirPIConstructor", Vl), + (ic.startNonterminal("DirPIConstructor", Vl), Pl(60), Rl(3), Pl(18), @@ -21422,16 +21445,16 @@ $l == 21 && (Pl(21), Rl(2), Pl(3)), Rl(9), Pl(66), - ic.endNonterminal("DirPIConstructor", Vl); + ic.endNonterminal("DirPIConstructor", Vl)); } function ss() { - Hl(60), + (Hl(60), Rl(3), Hl(18), Rl(13), $l == 21 && (Hl(21), Rl(2), Hl(3)), Rl(9), - Hl(66); + Hl(66)); } function os() { ic.startNonterminal("ComputedConstructor", Vl); @@ -21484,82 +21507,82 @@ } } function as() { - ic.startNonterminal("CompElemConstructor", Vl), Pl(122), Il(249); + (ic.startNonterminal("CompElemConstructor", Vl), Pl(122), Il(249)); switch ($l) { case 281: - Pl(281), Il(266), jl(), G(), Pl(287); + (Pl(281), Il(266), jl(), G(), Pl(287)); break; default: - jl(), $a(); + (jl(), $a()); } - Il(90), + (Il(90), Pl(281), Il(280), $l != 287 && (jl(), ol()), Pl(287), - ic.endNonterminal("CompElemConstructor", Vl); + ic.endNonterminal("CompElemConstructor", Vl)); } function fs() { - Hl(122), Il(249); + (Hl(122), Il(249)); switch ($l) { case 281: - Hl(281), Il(266), Y(), Hl(287); + (Hl(281), Il(266), Y(), Hl(287)); break; default: Ja(); } - Il(90), Hl(281), Il(280), $l != 287 && ul(), Hl(287); + (Il(90), Hl(281), Il(280), $l != 287 && ul(), Hl(287)); } function ls() { - ic.startNonterminal("CompNamespaceConstructor", Vl), + (ic.startNonterminal("CompNamespaceConstructor", Vl), Pl(187), - Il(241); + Il(241)); switch ($l) { case 281: - Pl(281), Il(266), jl(), ds(), Pl(287); + (Pl(281), Il(266), jl(), ds(), Pl(287)); break; default: - jl(), hs(); + (jl(), hs()); } - Il(90), + (Il(90), Pl(281), Il(266), jl(), ms(), Pl(287), - ic.endNonterminal("CompNamespaceConstructor", Vl); + ic.endNonterminal("CompNamespaceConstructor", Vl)); } function cs() { - Hl(187), Il(241); + (Hl(187), Il(241)); switch ($l) { case 281: - Hl(281), Il(266), vs(), Hl(287); + (Hl(281), Il(266), vs(), Hl(287)); break; default: ps(); } - Il(90), Hl(281), Il(266), gs(), Hl(287); + (Il(90), Hl(281), Il(266), gs(), Hl(287)); } function hs() { - ic.startNonterminal("Prefix", Vl), + (ic.startNonterminal("Prefix", Vl), Ga(), - ic.endNonterminal("Prefix", Vl); + ic.endNonterminal("Prefix", Vl)); } function ps() { Ya(); } function ds() { - ic.startNonterminal("PrefixExpr", Vl), + (ic.startNonterminal("PrefixExpr", Vl), G(), - ic.endNonterminal("PrefixExpr", Vl); + ic.endNonterminal("PrefixExpr", Vl)); } function vs() { Y(); } function ms() { - ic.startNonterminal("URIExpr", Vl), + (ic.startNonterminal("URIExpr", Vl), G(), - ic.endNonterminal("URIExpr", Vl); + ic.endNonterminal("URIExpr", Vl)); } function gs() { Y(); @@ -21601,25 +21624,25 @@ } } function ws() { - ic.startNonterminal("NamedFunctionRef", Vl), + (ic.startNonterminal("NamedFunctionRef", Vl), $a(), Il(20), Pl(29), Il(16), Pl(8), - ic.endNonterminal("NamedFunctionRef", Vl); + ic.endNonterminal("NamedFunctionRef", Vl)); } function Es() { - Ja(), Il(20), Hl(29), Il(16), Hl(8); + (Ja(), Il(20), Hl(29), Il(16), Hl(8)); } function Ss() { ic.startNonterminal("InlineFunctionExpr", Vl); for (;;) { Il(101); if ($l != 33) break; - jl(), B(); + (jl(), B()); } - Pl(147), + (Pl(147), Il(22), Pl(35), Il(98), @@ -21630,7 +21653,7 @@ Il(90), jl(), V(), - ic.endNonterminal("InlineFunctionExpr", Vl); + ic.endNonterminal("InlineFunctionExpr", Vl)); } function xs() { for (;;) { @@ -21638,7 +21661,7 @@ if ($l != 33) break; j(); } - Hl(147), + (Hl(147), Il(22), Hl(35), Il(98), @@ -21647,28 +21670,28 @@ Il(115), $l == 80 && (Hl(80), Il(253), As()), Il(90), - $(); + $()); } function Ts() { - ic.startNonterminal("SingleType", Vl), + (ic.startNonterminal("SingleType", Vl), ko(), Il(225), $l == 65 && Pl(65), - ic.endNonterminal("SingleType", Vl); + ic.endNonterminal("SingleType", Vl)); } function Ns() { - Lo(), Il(225), $l == 65 && Hl(65); + (Lo(), Il(225), $l == 65 && Hl(65)); } function Cs() { - ic.startNonterminal("TypeDeclaration", Vl), + (ic.startNonterminal("TypeDeclaration", Vl), Pl(80), Il(253), jl(), Ls(), - ic.endNonterminal("TypeDeclaration", Vl); + ic.endNonterminal("TypeDeclaration", Vl)); } function ks() { - Hl(80), Il(253), As(); + (Hl(80), Il(253), As()); } function Ls() { ic.startNonterminal("SequenceType", Vl); @@ -21685,15 +21708,15 @@ switch (Wl) { case 18045: case 19491: - $l == 125 && Pl(125), Il(22), Pl(35), Il(23), Pl(38); + ($l == 125 && Pl(125), Il(22), Pl(35), Il(23), Pl(38)); break; default: - _s(), Il(228); + (_s(), Il(228)); switch ($l) { case 40: case 41: case 65: - jl(), Os(); + (jl(), Os()); break; default: } @@ -21714,10 +21737,10 @@ switch (Wl) { case 18045: case 19491: - $l == 125 && Hl(125), Il(22), Hl(35), Il(23), Hl(38); + ($l == 125 && Hl(125), Il(22), Hl(35), Il(23), Hl(38)); break; default: - Ds(), Il(228); + (Ds(), Il(228)); switch ($l) { case 40: case 41: @@ -22099,10 +22122,10 @@ o = Gl, u = Yl; try { - Xs(), (Wl = -4); + (Xs(), (Wl = -4)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -22114,12 +22137,12 @@ ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), Hs(), - (Wl = -6); + (Wl = -6)); } catch (f) { Wl = -7; } } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -22130,7 +22153,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(6, Vl, Wl); + oc(6, Vl, Wl)); } } switch (Wl) { @@ -22147,7 +22170,7 @@ Vs(); break; case 18087: - Pl(167), Il(22), Pl(35), Il(23), Pl(38); + (Pl(167), Il(22), Pl(35), Il(23), Pl(38)); break; case 33: case 18067: @@ -22515,10 +22538,10 @@ o = Gl, u = Yl; try { - Xs(), oc(6, t, -4), (Wl = -8); + (Xs(), oc(6, t, -4), (Wl = -8)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -22531,9 +22554,9 @@ : ((Gl = o), (Yl = u), (cc = u))), Hs(), oc(6, t, -6), - (Wl = -8); + (Wl = -8)); } catch (f) { - (Wl = -7), + ((Wl = -7), (Xl = e), (Vl = t), ($l = n), @@ -22545,7 +22568,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(6, t, -7); + oc(6, t, -7)); } } } @@ -22564,7 +22587,7 @@ $s(); break; case 18087: - Hl(167), Il(22), Hl(35), Il(23), Hl(38); + (Hl(167), Il(22), Hl(35), Il(23), Hl(38)); break; case 33: case 18067: @@ -22616,49 +22639,49 @@ } } function Bs() { - ic.startNonterminal("StructuredItemTest", Vl), + (ic.startNonterminal("StructuredItemTest", Vl), Pl(247), Il(232), $l == 35 && (Pl(35), Il(23), Pl(38)), - ic.endNonterminal("StructuredItemTest", Vl); + ic.endNonterminal("StructuredItemTest", Vl)); } function js() { - Hl(247), Il(232), $l == 35 && (Hl(35), Il(23), Hl(38)); + (Hl(247), Il(232), $l == 35 && (Hl(35), Il(23), Hl(38))); } function Fs() { - ic.startNonterminal("JSONItemTest", Vl), + (ic.startNonterminal("JSONItemTest", Vl), Pl(169), Il(232), $l == 35 && (Pl(35), Il(23), Pl(38)), - ic.endNonterminal("JSONItemTest", Vl); + ic.endNonterminal("JSONItemTest", Vl)); } function Is() { - Hl(169), Il(232), $l == 35 && (Hl(35), Il(23), Hl(38)); + (Hl(169), Il(232), $l == 35 && (Hl(35), Il(23), Hl(38))); } function qs() { - ic.startNonterminal("JSONObjectTest", Vl), + (ic.startNonterminal("JSONObjectTest", Vl), Pl(198), Il(232), $l == 35 && (Pl(35), Il(23), Pl(38)), - ic.endNonterminal("JSONObjectTest", Vl); + ic.endNonterminal("JSONObjectTest", Vl)); } function Rs() { - Hl(198), Il(232), $l == 35 && (Hl(35), Il(23), Hl(38)); + (Hl(198), Il(232), $l == 35 && (Hl(35), Il(23), Hl(38))); } function Us() { - ic.startNonterminal("JSONArrayTest", Vl), + (ic.startNonterminal("JSONArrayTest", Vl), Pl(79), Il(232), $l == 35 && (Pl(35), Il(23), Pl(38)), - ic.endNonterminal("JSONArrayTest", Vl); + ic.endNonterminal("JSONArrayTest", Vl)); } function zs() { - Hl(79), Il(232), $l == 35 && (Hl(35), Il(23), Hl(38)); + (Hl(79), Il(232), $l == 35 && (Hl(35), Il(23), Hl(38))); } function Ws() { - ic.startNonterminal("AtomicOrUnionType", Vl), + (ic.startNonterminal("AtomicOrUnionType", Vl), $a(), - ic.endNonterminal("AtomicOrUnionType", Vl); + ic.endNonterminal("AtomicOrUnionType", Vl)); } function Xs() { Ja(); @@ -22732,35 +22755,35 @@ } } function Js() { - ic.startNonterminal("AnyKindTest", Vl), + (ic.startNonterminal("AnyKindTest", Vl), Pl(194), Il(22), Pl(35), Il(23), Pl(38), - ic.endNonterminal("AnyKindTest", Vl); + ic.endNonterminal("AnyKindTest", Vl)); } function Ks() { - Hl(194), Il(22), Hl(35), Il(23), Hl(38); + (Hl(194), Il(22), Hl(35), Il(23), Hl(38)); } function Qs() { - ic.startNonterminal("DocumentTest", Vl), + (ic.startNonterminal("DocumentTest", Vl), Pl(121), Il(22), Pl(35), - Il(154); + Il(154)); if ($l != 38) switch ($l) { case 122: - jl(), vo(); + (jl(), vo()); break; default: - jl(), bo(); + (jl(), bo()); } - Il(23), Pl(38), ic.endNonterminal("DocumentTest", Vl); + (Il(23), Pl(38), ic.endNonterminal("DocumentTest", Vl)); } function Gs() { - Hl(121), Il(22), Hl(35), Il(154); + (Hl(121), Il(22), Hl(35), Il(154)); if ($l != 38) switch ($l) { case 122: @@ -22769,58 +22792,62 @@ default: wo(); } - Il(23), Hl(38); + (Il(23), Hl(38)); } function Ys() { - ic.startNonterminal("TextTest", Vl), + (ic.startNonterminal("TextTest", Vl), Pl(249), Il(22), Pl(35), Il(23), Pl(38), - ic.endNonterminal("TextTest", Vl); + ic.endNonterminal("TextTest", Vl)); } function Zs() { - Hl(249), Il(22), Hl(35), Il(23), Hl(38); + (Hl(249), Il(22), Hl(35), Il(23), Hl(38)); } function eo() { - ic.startNonterminal("CommentTest", Vl), + (ic.startNonterminal("CommentTest", Vl), Pl(97), Il(22), Pl(35), Il(23), Pl(38), - ic.endNonterminal("CommentTest", Vl); + ic.endNonterminal("CommentTest", Vl)); } function to() { - Hl(97), Il(22), Hl(35), Il(23), Hl(38); + (Hl(97), Il(22), Hl(35), Il(23), Hl(38)); } function no() { - ic.startNonterminal("NamespaceNodeTest", Vl), + (ic.startNonterminal("NamespaceNodeTest", Vl), Pl(188), Il(22), Pl(35), Il(23), Pl(38), - ic.endNonterminal("NamespaceNodeTest", Vl); + ic.endNonterminal("NamespaceNodeTest", Vl)); } function ro() { - Hl(188), Il(22), Hl(35), Il(23), Hl(38); + (Hl(188), Il(22), Hl(35), Il(23), Hl(38)); } function io() { - ic.startNonterminal("PITest", Vl), Pl(220), Il(22), Pl(35), Il(243); + (ic.startNonterminal("PITest", Vl), + Pl(220), + Il(22), + Pl(35), + Il(243)); if ($l != 38) switch ($l) { case 11: Pl(11); break; default: - jl(), Ga(); + (jl(), Ga()); } - Il(23), Pl(38), ic.endNonterminal("PITest", Vl); + (Il(23), Pl(38), ic.endNonterminal("PITest", Vl)); } function so() { - Hl(220), Il(22), Hl(35), Il(243); + (Hl(220), Il(22), Hl(35), Il(243)); if ($l != 38) switch ($l) { case 11: @@ -22829,10 +22856,10 @@ default: Ya(); } - Il(23), Hl(38); + (Il(23), Hl(38)); } function oo() { - ic.startNonterminal("AttributeTest", Vl), + (ic.startNonterminal("AttributeTest", Vl), Pl(83), Il(22), Pl(35), @@ -22844,17 +22871,17 @@ $l == 42 && (Pl(42), Il(245), jl(), Ao())), Il(23), Pl(38), - ic.endNonterminal("AttributeTest", Vl); + ic.endNonterminal("AttributeTest", Vl)); } function uo() { - Hl(83), + (Hl(83), Il(22), Hl(35), Il(254), $l != 38 && (fo(), Il(105), $l == 42 && (Hl(42), Il(245), Oo())), Il(23), - Hl(38); + Hl(38)); } function ao() { ic.startNonterminal("AttribNameOrWildcard", Vl); @@ -22877,7 +22904,7 @@ } } function lo() { - ic.startNonterminal("SchemaAttributeTest", Vl), + (ic.startNonterminal("SchemaAttributeTest", Vl), Pl(230), Il(22), Pl(35), @@ -22886,21 +22913,21 @@ ho(), Il(23), Pl(38), - ic.endNonterminal("SchemaAttributeTest", Vl); + ic.endNonterminal("SchemaAttributeTest", Vl)); } function co() { - Hl(230), Il(22), Hl(35), Il(245), po(), Il(23), Hl(38); + (Hl(230), Il(22), Hl(35), Il(245), po(), Il(23), Hl(38)); } function ho() { - ic.startNonterminal("AttributeDeclaration", Vl), + (ic.startNonterminal("AttributeDeclaration", Vl), xo(), - ic.endNonterminal("AttributeDeclaration", Vl); + ic.endNonterminal("AttributeDeclaration", Vl)); } function po() { To(); } function vo() { - ic.startNonterminal("ElementTest", Vl), + (ic.startNonterminal("ElementTest", Vl), Pl(122), Il(22), Pl(35), @@ -22918,10 +22945,10 @@ $l == 65 && Pl(65))), Il(23), Pl(38), - ic.endNonterminal("ElementTest", Vl); + ic.endNonterminal("ElementTest", Vl)); } function mo() { - Hl(122), + (Hl(122), Il(22), Hl(35), Il(254), @@ -22931,7 +22958,7 @@ $l == 42 && (Hl(42), Il(245), Oo(), Il(106), $l == 65 && Hl(65))), Il(23), - Hl(38); + Hl(38)); } function go() { ic.startNonterminal("ElementNameOrWildcard", Vl); @@ -22954,7 +22981,7 @@ } } function bo() { - ic.startNonterminal("SchemaElementTest", Vl), + (ic.startNonterminal("SchemaElementTest", Vl), Pl(231), Il(22), Pl(35), @@ -22963,47 +22990,47 @@ Eo(), Il(23), Pl(38), - ic.endNonterminal("SchemaElementTest", Vl); + ic.endNonterminal("SchemaElementTest", Vl)); } function wo() { - Hl(231), Il(22), Hl(35), Il(245), So(), Il(23), Hl(38); + (Hl(231), Il(22), Hl(35), Il(245), So(), Il(23), Hl(38)); } function Eo() { - ic.startNonterminal("ElementDeclaration", Vl), + (ic.startNonterminal("ElementDeclaration", Vl), No(), - ic.endNonterminal("ElementDeclaration", Vl); + ic.endNonterminal("ElementDeclaration", Vl)); } function So() { Co(); } function xo() { - ic.startNonterminal("AttributeName", Vl), + (ic.startNonterminal("AttributeName", Vl), $a(), - ic.endNonterminal("AttributeName", Vl); + ic.endNonterminal("AttributeName", Vl)); } function To() { Ja(); } function No() { - ic.startNonterminal("ElementName", Vl), + (ic.startNonterminal("ElementName", Vl), $a(), - ic.endNonterminal("ElementName", Vl); + ic.endNonterminal("ElementName", Vl)); } function Co() { Ja(); } function ko() { - ic.startNonterminal("SimpleTypeName", Vl), + (ic.startNonterminal("SimpleTypeName", Vl), Ao(), - ic.endNonterminal("SimpleTypeName", Vl); + ic.endNonterminal("SimpleTypeName", Vl)); } function Lo() { Oo(); } function Ao() { - ic.startNonterminal("TypeName", Vl), + (ic.startNonterminal("TypeName", Vl), $a(), - ic.endNonterminal("TypeName", Vl); + ic.endNonterminal("TypeName", Vl)); } function Oo() { Ja(); @@ -23013,7 +23040,7 @@ for (;;) { Il(101); if ($l != 33) break; - jl(), B(); + (jl(), B()); } switch ($l) { case 147: @@ -23033,11 +23060,11 @@ o = Gl, u = Yl; try { - Po(), (Wl = -1); + (Po(), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -23046,14 +23073,14 @@ (Kl = i), (Ql = s), Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(7, Vl, Wl); + oc(7, Vl, Wl)); } switch (Wl) { case -1: - jl(), Do(); + (jl(), Do()); break; default: - jl(), Ho(); + (jl(), Ho()); } ic.endNonterminal("FunctionTest", Vl); } @@ -23081,9 +23108,9 @@ o = Gl, u = Yl; try { - Po(), oc(7, t, -1), (Wl = -3); + (Po(), oc(7, t, -1), (Wl = -3)); } catch (a) { - (Wl = -2), + ((Wl = -2), (Xl = e), (Vl = t), ($l = n), @@ -23095,7 +23122,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(7, t, -2); + oc(7, t, -2)); } } switch (Wl) { @@ -23109,7 +23136,7 @@ } } function Do() { - ic.startNonterminal("AnyFunctionTest", Vl), + (ic.startNonterminal("AnyFunctionTest", Vl), Pl(147), Il(22), Pl(35), @@ -23117,64 +23144,64 @@ Pl(39), Il(23), Pl(38), - ic.endNonterminal("AnyFunctionTest", Vl); + ic.endNonterminal("AnyFunctionTest", Vl)); } function Po() { - Hl(147), Il(22), Hl(35), Il(24), Hl(39), Il(23), Hl(38); + (Hl(147), Il(22), Hl(35), Il(24), Hl(39), Il(23), Hl(38)); } function Ho() { - ic.startNonterminal("TypedFunctionTest", Vl), + (ic.startNonterminal("TypedFunctionTest", Vl), Pl(147), Il(22), Pl(35), - Il(258); + Il(258)); if ($l != 38) { - jl(), Ls(); + (jl(), Ls()); for (;;) { Il(105); if ($l != 42) break; - Pl(42), Il(253), jl(), Ls(); + (Pl(42), Il(253), jl(), Ls()); } } - Pl(38), + (Pl(38), Il(33), Pl(80), Il(253), jl(), Ls(), - ic.endNonterminal("TypedFunctionTest", Vl); + ic.endNonterminal("TypedFunctionTest", Vl)); } function Bo() { - Hl(147), Il(22), Hl(35), Il(258); + (Hl(147), Il(22), Hl(35), Il(258)); if ($l != 38) { As(); for (;;) { Il(105); if ($l != 42) break; - Hl(42), Il(253), As(); + (Hl(42), Il(253), As()); } } - Hl(38), Il(33), Hl(80), Il(253), As(); + (Hl(38), Il(33), Hl(80), Il(253), As()); } function jo() { - ic.startNonterminal("ParenthesizedItemType", Vl), + (ic.startNonterminal("ParenthesizedItemType", Vl), Pl(35), Il(253), jl(), _s(), Il(23), Pl(38), - ic.endNonterminal("ParenthesizedItemType", Vl); + ic.endNonterminal("ParenthesizedItemType", Vl)); } function Fo() { - Hl(35), Il(253), Ds(), Il(23), Hl(38); + (Hl(35), Il(253), Ds(), Il(23), Hl(38)); } function Io() { - ic.startNonterminal("RevalidationDecl", Vl), + (ic.startNonterminal("RevalidationDecl", Vl), Pl(109), Il(75), Pl(226), - Il(162); + Il(162)); switch ($l) { case 245: Pl(245); @@ -23198,7 +23225,7 @@ break; default: if ($l == 80) { - Pl(80), Il(123); + (Pl(80), Il(123)); switch ($l) { case 136: Pl(136); @@ -23207,7 +23234,7 @@ Pl(173); } } - Il(57), Pl(165); + (Il(57), Pl(165)); } ic.endNonterminal("InsertExprTargetChoice", Vl); } @@ -23221,7 +23248,7 @@ break; default: if ($l == 80) { - Hl(80), Il(123); + (Hl(80), Il(123)); switch ($l) { case 136: Hl(136); @@ -23230,11 +23257,11 @@ Hl(173); } } - Il(57), Hl(165); + (Il(57), Hl(165)); } } function Uo() { - ic.startNonterminal("InsertExpr", Vl), Pl(161), Il(133); + (ic.startNonterminal("InsertExpr", Vl), Pl(161), Il(133)); switch ($l) { case 194: Pl(194); @@ -23242,7 +23269,7 @@ default: Pl(195); } - Il(266), + (Il(266), jl(), Qo(), jl(), @@ -23250,10 +23277,10 @@ Il(266), jl(), Yo(), - ic.endNonterminal("InsertExpr", Vl); + ic.endNonterminal("InsertExpr", Vl)); } function zo() { - Hl(161), Il(133); + (Hl(161), Il(133)); switch ($l) { case 194: Hl(194); @@ -23261,10 +23288,10 @@ default: Hl(195); } - Il(266), Go(), Ro(), Il(266), Zo(); + (Il(266), Go(), Ro(), Il(266), Zo()); } function Wo() { - ic.startNonterminal("DeleteExpr", Vl), Pl(111), Il(133); + (ic.startNonterminal("DeleteExpr", Vl), Pl(111), Il(133)); switch ($l) { case 194: Pl(194); @@ -23272,10 +23299,10 @@ default: Pl(195); } - Il(266), jl(), Yo(), ic.endNonterminal("DeleteExpr", Vl); + (Il(266), jl(), Yo(), ic.endNonterminal("DeleteExpr", Vl)); } function Xo() { - Hl(111), Il(133); + (Hl(111), Il(133)); switch ($l) { case 194: Hl(194); @@ -23283,10 +23310,10 @@ default: Hl(195); } - Il(266), Zo(); + (Il(266), Zo()); } function Vo() { - ic.startNonterminal("ReplaceExpr", Vl), + (ic.startNonterminal("ReplaceExpr", Vl), Pl(223), Il(134), $l == 267 && (Pl(267), Il(67), Pl(200)), @@ -23299,10 +23326,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("ReplaceExpr", Vl); + ic.endNonterminal("ReplaceExpr", Vl)); } function $o() { - Hl(223), + (Hl(223), Il(134), $l == 267 && (Hl(267), Il(67), Hl(200)), Il(65), @@ -23311,10 +23338,10 @@ Zo(), Hl(276), Il(266), - Xf(); + Xf()); } function Jo() { - ic.startNonterminal("RenameExpr", Vl), + (ic.startNonterminal("RenameExpr", Vl), Pl(222), Il(65), Pl(194), @@ -23325,46 +23352,46 @@ Il(266), jl(), eu(), - ic.endNonterminal("RenameExpr", Vl); + ic.endNonterminal("RenameExpr", Vl)); } function Ko() { - Hl(222), Il(65), Hl(194), Il(266), Zo(), Hl(80), Il(266), tu(); + (Hl(222), Il(65), Hl(194), Il(266), Zo(), Hl(80), Il(266), tu()); } function Qo() { - ic.startNonterminal("SourceExpr", Vl), + (ic.startNonterminal("SourceExpr", Vl), Wf(), - ic.endNonterminal("SourceExpr", Vl); + ic.endNonterminal("SourceExpr", Vl)); } function Go() { Xf(); } function Yo() { - ic.startNonterminal("TargetExpr", Vl), + (ic.startNonterminal("TargetExpr", Vl), Wf(), - ic.endNonterminal("TargetExpr", Vl); + ic.endNonterminal("TargetExpr", Vl)); } function Zo() { Xf(); } function eu() { - ic.startNonterminal("NewNameExpr", Vl), + (ic.startNonterminal("NewNameExpr", Vl), Wf(), - ic.endNonterminal("NewNameExpr", Vl); + ic.endNonterminal("NewNameExpr", Vl)); } function tu() { Xf(); } function nu() { - ic.startNonterminal("TransformExpr", Vl), + (ic.startNonterminal("TransformExpr", Vl), Pl(104), Il(21), jl(), - iu(); + iu()); for (;;) { if ($l != 42) break; - Pl(42), Il(21), jl(), iu(); + (Pl(42), Il(21), jl(), iu()); } - Pl(184), + (Pl(184), Il(266), jl(), Wf(), @@ -23372,18 +23399,18 @@ Il(266), jl(), Wf(), - ic.endNonterminal("TransformExpr", Vl); + ic.endNonterminal("TransformExpr", Vl)); } function ru() { - Hl(104), Il(21), su(); + (Hl(104), Il(21), su()); for (;;) { if ($l != 42) break; - Hl(42), Il(21), su(); + (Hl(42), Il(21), su()); } - Hl(184), Il(266), Xf(), Hl(224), Il(266), Xf(); + (Hl(184), Il(266), Xf(), Hl(224), Il(266), Xf()); } function iu() { - ic.startNonterminal("TransformSpec", Vl), + (ic.startNonterminal("TransformSpec", Vl), Pl(31), Il(245), jl(), @@ -23393,13 +23420,13 @@ Il(266), jl(), Wf(), - ic.endNonterminal("TransformSpec", Vl); + ic.endNonterminal("TransformSpec", Vl)); } function su() { - Hl(31), Il(245), Ni(), Il(28), Hl(53), Il(266), Xf(); + (Hl(31), Il(245), Ni(), Il(28), Hl(53), Il(266), Xf()); } function ou() { - ic.startNonterminal("FTSelection", Vl), lu(); + (ic.startNonterminal("FTSelection", Vl), lu()); for (;;) { Il(211); switch ($l) { @@ -23420,7 +23447,7 @@ Wl != 123986 ) break; - jl(), Pu(); + (jl(), Pu()); } ic.endNonterminal("FTSelection", Vl); } @@ -23450,7 +23477,7 @@ } } function au() { - ic.startNonterminal("FTWeight", Vl), + (ic.startNonterminal("FTWeight", Vl), Pl(270), Il(90), Pl(281), @@ -23458,16 +23485,16 @@ jl(), G(), Pl(287), - ic.endNonterminal("FTWeight", Vl); + ic.endNonterminal("FTWeight", Vl)); } function fu() { - Hl(270), Il(90), Hl(281), Il(266), Y(), Hl(287); + (Hl(270), Il(90), Hl(281), Il(266), Y(), Hl(287)); } function lu() { - ic.startNonterminal("FTOr", Vl), hu(); + (ic.startNonterminal("FTOr", Vl), hu()); for (;;) { if ($l != 146) break; - Pl(146), Il(177), jl(), hu(); + (Pl(146), Il(177), jl(), hu()); } ic.endNonterminal("FTOr", Vl); } @@ -23475,14 +23502,14 @@ pu(); for (;;) { if ($l != 146) break; - Hl(146), Il(177), pu(); + (Hl(146), Il(177), pu()); } } function hu() { - ic.startNonterminal("FTAnd", Vl), du(); + (ic.startNonterminal("FTAnd", Vl), du()); for (;;) { if ($l != 144) break; - Pl(144), Il(177), jl(), du(); + (Pl(144), Il(177), jl(), du()); } ic.endNonterminal("FTAnd", Vl); } @@ -23490,15 +23517,15 @@ vu(); for (;;) { if ($l != 144) break; - Hl(144), Il(177), vu(); + (Hl(144), Il(177), vu()); } } function du() { - ic.startNonterminal("FTMildNot", Vl), mu(); + (ic.startNonterminal("FTMildNot", Vl), mu()); for (;;) { Il(212); if ($l != 196) break; - Pl(196), Il(56), Pl(156), Il(177), jl(), mu(); + (Pl(196), Il(56), Pl(156), Il(177), jl(), mu()); } ic.endNonterminal("FTMildNot", Vl); } @@ -23507,64 +23534,64 @@ for (;;) { Il(212); if ($l != 196) break; - Hl(196), Il(56), Hl(156), Il(177), gu(); + (Hl(196), Il(56), Hl(156), Il(177), gu()); } } function mu() { - ic.startNonterminal("FTUnaryNot", Vl), + (ic.startNonterminal("FTUnaryNot", Vl), $l == 145 && Pl(145), Il(164), jl(), yu(), - ic.endNonterminal("FTUnaryNot", Vl); + ic.endNonterminal("FTUnaryNot", Vl)); } function gu() { - $l == 145 && Hl(145), Il(164), bu(); + ($l == 145 && Hl(145), Il(164), bu()); } function yu() { - ic.startNonterminal("FTPrimaryWithOptions", Vl), + (ic.startNonterminal("FTPrimaryWithOptions", Vl), wu(), Il(213), $l == 265 && (jl(), Qu()), $l == 270 && (jl(), au()), - ic.endNonterminal("FTPrimaryWithOptions", Vl); + ic.endNonterminal("FTPrimaryWithOptions", Vl)); } function bu() { - Eu(), Il(213), $l == 265 && Gu(), $l == 270 && fu(); + (Eu(), Il(213), $l == 265 && Gu(), $l == 270 && fu()); } function wu() { ic.startNonterminal("FTPrimary", Vl); switch ($l) { case 35: - Pl(35), Il(177), jl(), ou(), Pl(38); + (Pl(35), Il(177), jl(), ou(), Pl(38)); break; case 36: Cu(); break; default: - Su(), Il(214), $l == 199 && (jl(), Ou()); + (Su(), Il(214), $l == 199 && (jl(), Ou())); } ic.endNonterminal("FTPrimary", Vl); } function Eu() { switch ($l) { case 35: - Hl(35), Il(177), uu(), Hl(38); + (Hl(35), Il(177), uu(), Hl(38)); break; case 36: ku(); break; default: - xu(), Il(214), $l == 199 && Mu(); + (xu(), Il(214), $l == 199 && Mu()); } } function Su() { - ic.startNonterminal("FTWords", Vl), Tu(), Il(220); - if ($l == 72 || $l == 77 || $l == 214) jl(), Lu(); + (ic.startNonterminal("FTWords", Vl), Tu(), Il(220)); + if ($l == 72 || $l == 77 || $l == 214) (jl(), Lu()); ic.endNonterminal("FTWords", Vl); } function xu() { - Nu(), Il(220), ($l == 72 || $l == 77 || $l == 214) && Au(); + (Nu(), Il(220), ($l == 72 || $l == 77 || $l == 214) && Au()); } function Tu() { ic.startNonterminal("FTWordsValue", Vl); @@ -23573,7 +23600,7 @@ Pl(11); break; default: - Pl(281), Il(266), jl(), G(), Pl(287); + (Pl(281), Il(266), jl(), G(), Pl(287)); } ic.endNonterminal("FTWordsValue", Vl); } @@ -23583,36 +23610,36 @@ Hl(11); break; default: - Hl(281), Il(266), Y(), Hl(287); + (Hl(281), Il(266), Y(), Hl(287)); } } function Cu() { ic.startNonterminal("FTExtensionSelection", Vl); for (;;) { - jl(), Lr(), Il(104); + (jl(), Lr(), Il(104)); if ($l != 36) break; } - Pl(281), + (Pl(281), Il(184), $l != 287 && (jl(), ou()), Pl(287), - ic.endNonterminal("FTExtensionSelection", Vl); + ic.endNonterminal("FTExtensionSelection", Vl)); } function ku() { for (;;) { - Ar(), Il(104); + (Ar(), Il(104)); if ($l != 36) break; } - Hl(281), Il(184), $l != 287 && uu(), Hl(287); + (Hl(281), Il(184), $l != 287 && uu(), Hl(287)); } function Lu() { ic.startNonterminal("FTAnyallOption", Vl); switch ($l) { case 77: - Pl(77), Il(217), $l == 278 && Pl(278); + (Pl(77), Il(217), $l == 278 && Pl(278)); break; case 72: - Pl(72), Il(218), $l == 279 && Pl(279); + (Pl(72), Il(218), $l == 279 && Pl(279)); break; default: Pl(214); @@ -23622,65 +23649,72 @@ function Au() { switch ($l) { case 77: - Hl(77), Il(217), $l == 278 && Hl(278); + (Hl(77), Il(217), $l == 278 && Hl(278)); break; case 72: - Hl(72), Il(218), $l == 279 && Hl(279); + (Hl(72), Il(218), $l == 279 && Hl(279)); break; default: Hl(214); } } function Ou() { - ic.startNonterminal("FTTimes", Vl), + (ic.startNonterminal("FTTimes", Vl), Pl(199), Il(159), jl(), _u(), Pl(252), - ic.endNonterminal("FTTimes", Vl); + ic.endNonterminal("FTTimes", Vl)); } function Mu() { - Hl(199), Il(159), Du(), Hl(252); + (Hl(199), Il(159), Du(), Hl(252)); } function _u() { ic.startNonterminal("FTRange", Vl); switch ($l) { case 131: - Pl(131), Il(265), jl(), Jn(); + (Pl(131), Il(265), jl(), Jn()); break; case 82: - Pl(82), Il(129); + (Pl(82), Il(129)); switch ($l) { case 176: - Pl(176), Il(265), jl(), Jn(); + (Pl(176), Il(265), jl(), Jn()); break; default: - Pl(186), Il(265), jl(), Jn(); + (Pl(186), Il(265), jl(), Jn()); } break; default: - Pl(142), Il(265), jl(), Jn(), Pl(253), Il(265), jl(), Jn(); + (Pl(142), + Il(265), + jl(), + Jn(), + Pl(253), + Il(265), + jl(), + Jn()); } ic.endNonterminal("FTRange", Vl); } function Du() { switch ($l) { case 131: - Hl(131), Il(265), Kn(); + (Hl(131), Il(265), Kn()); break; case 82: - Hl(82), Il(129); + (Hl(82), Il(129)); switch ($l) { case 176: - Hl(176), Il(265), Kn(); + (Hl(176), Il(265), Kn()); break; default: - Hl(186), Il(265), Kn(); + (Hl(186), Il(265), Kn()); } break; default: - Hl(142), Il(265), Kn(), Hl(253), Il(265), Kn(); + (Hl(142), Il(265), Kn(), Hl(253), Il(265), Kn()); } } function Pu() { @@ -23724,38 +23758,38 @@ } } function Bu() { - ic.startNonterminal("FTOrder", Vl), + (ic.startNonterminal("FTOrder", Vl), Pl(206), - ic.endNonterminal("FTOrder", Vl); + ic.endNonterminal("FTOrder", Vl)); } function ju() { Hl(206); } function Fu() { - ic.startNonterminal("FTWindow", Vl), + (ic.startNonterminal("FTWindow", Vl), Pl(275), Il(265), jl(), Jn(), jl(), Uu(), - ic.endNonterminal("FTWindow", Vl); + ic.endNonterminal("FTWindow", Vl)); } function Iu() { - Hl(275), Il(265), Kn(), zu(); + (Hl(275), Il(265), Kn(), zu()); } function qu() { - ic.startNonterminal("FTDistance", Vl), + (ic.startNonterminal("FTDistance", Vl), Pl(118), Il(159), jl(), _u(), jl(), Uu(), - ic.endNonterminal("FTDistance", Vl); + ic.endNonterminal("FTDistance", Vl)); } function Ru() { - Hl(118), Il(159), Du(), zu(); + (Hl(118), Il(159), Du(), zu()); } function Uu() { ic.startNonterminal("FTUnit", Vl); @@ -23792,7 +23826,7 @@ default: Pl(116); } - Il(136), jl(), Vu(), ic.endNonterminal("FTScope", Vl); + (Il(136), jl(), Vu(), ic.endNonterminal("FTScope", Vl)); } function Xu() { switch ($l) { @@ -23802,7 +23836,7 @@ default: Hl(116); } - Il(136), $u(); + (Il(136), $u()); } function Vu() { ic.startNonterminal("FTBigUnit", Vl); @@ -23828,7 +23862,7 @@ ic.startNonterminal("FTContent", Vl); switch ($l) { case 82: - Pl(82), Il(121); + (Pl(82), Il(121)); switch ($l) { case 242: Pl(242); @@ -23838,14 +23872,14 @@ } break; default: - Pl(128), Il(45), Pl(101); + (Pl(128), Il(45), Pl(101)); } ic.endNonterminal("FTContent", Vl); } function Ku() { switch ($l) { case 82: - Hl(82), Il(121); + (Hl(82), Il(121)); switch ($l) { case 242: Hl(242); @@ -23855,20 +23889,20 @@ } break; default: - Hl(128), Il(45), Hl(101); + (Hl(128), Il(45), Hl(101)); } } function Qu() { ic.startNonterminal("FTMatchOptions", Vl); for (;;) { - Pl(265), Il(204), jl(), Yu(), Il(213); + (Pl(265), Il(204), jl(), Yu(), Il(213)); if ($l != 265) break; } ic.endNonterminal("FTMatchOptions", Vl); } function Gu() { for (;;) { - Hl(265), Il(204), Zu(), Il(213); + (Hl(265), Il(204), Zu(), Il(213)); if ($l != 265) break; } } @@ -23954,7 +23988,7 @@ ic.startNonterminal("FTCaseOption", Vl); switch ($l) { case 89: - Pl(89), Il(128); + (Pl(89), Il(128)); switch ($l) { case 160: Pl(160); @@ -23974,7 +24008,7 @@ function ta() { switch ($l) { case 89: - Hl(89), Il(128); + (Hl(89), Il(128)); switch ($l) { case 160: Hl(160); @@ -23991,7 +24025,7 @@ } } function na() { - ic.startNonterminal("FTDiacriticsOption", Vl), Pl(115), Il(128); + (ic.startNonterminal("FTDiacriticsOption", Vl), Pl(115), Il(128)); switch ($l) { case 160: Pl(160); @@ -24002,7 +24036,7 @@ ic.endNonterminal("FTDiacriticsOption", Vl); } function ra() { - Hl(115), Il(128); + (Hl(115), Il(128)); switch ($l) { case 160: Hl(160); @@ -24018,7 +24052,7 @@ Pl(243); break; default: - Pl(191), Il(77), Pl(243); + (Pl(191), Il(77), Pl(243)); } ic.endNonterminal("FTStemOption", Vl); } @@ -24028,26 +24062,26 @@ Hl(243); break; default: - Hl(191), Il(77), Hl(243); + (Hl(191), Il(77), Hl(243)); } } function oa() { ic.startNonterminal("FTThesaurusOption", Vl); switch ($l) { case 251: - Pl(251), Il(152); + (Pl(251), Il(152)); switch ($l) { case 82: - jl(), aa(); + (jl(), aa()); break; case 110: Pl(110); break; default: - Pl(35), Il(116); + (Pl(35), Il(116)); switch ($l) { case 82: - jl(), aa(); + (jl(), aa()); break; default: Pl(110); @@ -24055,20 +24089,20 @@ for (;;) { Il(105); if ($l != 42) break; - Pl(42), Il(34), jl(), aa(); + (Pl(42), Il(34), jl(), aa()); } Pl(38); } break; default: - Pl(191), Il(81), Pl(251); + (Pl(191), Il(81), Pl(251)); } ic.endNonterminal("FTThesaurusOption", Vl); } function ua() { switch ($l) { case 251: - Hl(251), Il(152); + (Hl(251), Il(152)); switch ($l) { case 82: fa(); @@ -24077,7 +24111,7 @@ Hl(110); break; default: - Hl(35), Il(116); + (Hl(35), Il(116)); switch ($l) { case 82: fa(); @@ -24088,23 +24122,23 @@ for (;;) { Il(105); if ($l != 42) break; - Hl(42), Il(34), fa(); + (Hl(42), Il(34), fa()); } Hl(38); } break; default: - Hl(191), Il(81), Hl(251); + (Hl(191), Il(81), Hl(251)); } } function aa() { - ic.startNonterminal("FTThesaurusID", Vl), + (ic.startNonterminal("FTThesaurusID", Vl), Pl(82), Il(15), Pl(7), Il(219), $l == 221 && (Pl(221), Il(17), Pl(11)), - Il(215); + Il(215)); switch ($l) { case 82: ql(183); @@ -24113,16 +24147,16 @@ Wl = $l; } if (Wl == 131 || Wl == 142 || Wl == 90194 || Wl == 95314) - jl(), la(), Il(61), Pl(178); + (jl(), la(), Il(61), Pl(178)); ic.endNonterminal("FTThesaurusID", Vl); } function fa() { - Hl(82), + (Hl(82), Il(15), Hl(7), Il(219), $l == 221 && (Hl(221), Il(17), Hl(11)), - Il(215); + Il(215)); switch ($l) { case 82: ql(183); @@ -24131,80 +24165,80 @@ Wl = $l; } if (Wl == 131 || Wl == 142 || Wl == 90194 || Wl == 95314) - ca(), Il(61), Hl(178); + (ca(), Il(61), Hl(178)); } function la() { ic.startNonterminal("FTLiteralRange", Vl); switch ($l) { case 131: - Pl(131), Il(16), Pl(8); + (Pl(131), Il(16), Pl(8)); break; case 82: - Pl(82), Il(129); + (Pl(82), Il(129)); switch ($l) { case 176: - Pl(176), Il(16), Pl(8); + (Pl(176), Il(16), Pl(8)); break; default: - Pl(186), Il(16), Pl(8); + (Pl(186), Il(16), Pl(8)); } break; default: - Pl(142), Il(16), Pl(8), Il(82), Pl(253), Il(16), Pl(8); + (Pl(142), Il(16), Pl(8), Il(82), Pl(253), Il(16), Pl(8)); } ic.endNonterminal("FTLiteralRange", Vl); } function ca() { switch ($l) { case 131: - Hl(131), Il(16), Hl(8); + (Hl(131), Il(16), Hl(8)); break; case 82: - Hl(82), Il(129); + (Hl(82), Il(129)); switch ($l) { case 176: - Hl(176), Il(16), Hl(8); + (Hl(176), Il(16), Hl(8)); break; default: - Hl(186), Il(16), Hl(8); + (Hl(186), Il(16), Hl(8)); } break; default: - Hl(142), Il(16), Hl(8), Il(82), Hl(253), Il(16), Hl(8); + (Hl(142), Il(16), Hl(8), Il(82), Hl(253), Il(16), Hl(8)); } } function ha() { ic.startNonterminal("FTStopWordOption", Vl); switch ($l) { case 244: - Pl(244), Il(89), Pl(279), Il(152); + (Pl(244), Il(89), Pl(279), Il(152)); switch ($l) { case 110: Pl(110); for (;;) { Il(216); if ($l != 132 && $l != 260) break; - jl(), ma(); + (jl(), ma()); } break; default: - jl(), da(); + (jl(), da()); for (;;) { Il(216); if ($l != 132 && $l != 260) break; - jl(), ma(); + (jl(), ma()); } } break; default: - Pl(191), Il(78), Pl(244), Il(89), Pl(279); + (Pl(191), Il(78), Pl(244), Il(89), Pl(279)); } ic.endNonterminal("FTStopWordOption", Vl); } function pa() { switch ($l) { case 244: - Hl(244), Il(89), Hl(279), Il(152); + (Hl(244), Il(89), Hl(279), Il(152)); switch ($l) { case 110: Hl(110); @@ -24224,21 +24258,21 @@ } break; default: - Hl(191), Il(78), Hl(244), Il(89), Hl(279); + (Hl(191), Il(78), Hl(244), Il(89), Hl(279)); } } function da() { ic.startNonterminal("FTStopWords", Vl); switch ($l) { case 82: - Pl(82), Il(15), Pl(7); + (Pl(82), Il(15), Pl(7)); break; default: - Pl(35), Il(17), Pl(11); + (Pl(35), Il(17), Pl(11)); for (;;) { Il(105); if ($l != 42) break; - Pl(42), Il(17), Pl(11); + (Pl(42), Il(17), Pl(11)); } Pl(38); } @@ -24247,14 +24281,14 @@ function va() { switch ($l) { case 82: - Hl(82), Il(15), Hl(7); + (Hl(82), Il(15), Hl(7)); break; default: - Hl(35), Il(17), Hl(11); + (Hl(35), Il(17), Hl(11)); for (;;) { Il(105); if ($l != 42) break; - Hl(42), Il(17), Hl(11); + (Hl(42), Il(17), Hl(11)); } Hl(38); } @@ -24268,7 +24302,7 @@ default: Pl(132); } - Il(103), jl(), da(), ic.endNonterminal("FTStopWordsInclExcl", Vl); + (Il(103), jl(), da(), ic.endNonterminal("FTStopWordsInclExcl", Vl)); } function ga() { switch ($l) { @@ -24278,17 +24312,17 @@ default: Hl(132); } - Il(103), va(); + (Il(103), va()); } function ya() { - ic.startNonterminal("FTLanguageOption", Vl), + (ic.startNonterminal("FTLanguageOption", Vl), Pl(172), Il(17), Pl(11), - ic.endNonterminal("FTLanguageOption", Vl); + ic.endNonterminal("FTLanguageOption", Vl)); } function ba() { - Hl(172), Il(17), Hl(11); + (Hl(172), Il(17), Hl(11)); } function wa() { ic.startNonterminal("FTWildCardOption", Vl); @@ -24297,7 +24331,7 @@ Pl(274); break; default: - Pl(191), Il(87), Pl(274); + (Pl(191), Il(87), Pl(274)); } ic.endNonterminal("FTWildCardOption", Vl); } @@ -24307,102 +24341,102 @@ Hl(274); break; default: - Hl(191), Il(87), Hl(274); + (Hl(191), Il(87), Hl(274)); } } function Sa() { - ic.startNonterminal("FTExtensionOption", Vl), + (ic.startNonterminal("FTExtensionOption", Vl), Pl(203), Il(245), jl(), $a(), Il(17), Pl(11), - ic.endNonterminal("FTExtensionOption", Vl); + ic.endNonterminal("FTExtensionOption", Vl)); } function xa() { - Hl(203), Il(245), Ja(), Il(17), Hl(11); + (Hl(203), Il(245), Ja(), Il(17), Hl(11)); } function Ta() { - ic.startNonterminal("FTIgnoreOption", Vl), + (ic.startNonterminal("FTIgnoreOption", Vl), Pl(277), Il(45), Pl(101), Il(265), jl(), Yn(), - ic.endNonterminal("FTIgnoreOption", Vl); + ic.endNonterminal("FTIgnoreOption", Vl)); } function Na() { - Hl(277), Il(45), Hl(101), Il(265), Zn(); + (Hl(277), Il(45), Hl(101), Il(265), Zn()); } function Ca() { - ic.startNonterminal("CollectionDecl", Vl), + (ic.startNonterminal("CollectionDecl", Vl), Pl(96), Il(245), jl(), $a(), Il(111), $l == 80 && (jl(), ka()), - ic.endNonterminal("CollectionDecl", Vl); + ic.endNonterminal("CollectionDecl", Vl)); } function ka() { - ic.startNonterminal("CollectionTypeDecl", Vl), + (ic.startNonterminal("CollectionTypeDecl", Vl), Pl(80), Il(253), jl(), _s(), Il(171), $l != 54 && (jl(), Os()), - ic.endNonterminal("CollectionTypeDecl", Vl); + ic.endNonterminal("CollectionTypeDecl", Vl)); } function La() { - ic.startNonterminal("IndexName", Vl), + (ic.startNonterminal("IndexName", Vl), $a(), - ic.endNonterminal("IndexName", Vl); + ic.endNonterminal("IndexName", Vl)); } function Aa() { - ic.startNonterminal("IndexDomainExpr", Vl), + (ic.startNonterminal("IndexDomainExpr", Vl), Or(), - ic.endNonterminal("IndexDomainExpr", Vl); + ic.endNonterminal("IndexDomainExpr", Vl)); } function Oa() { - ic.startNonterminal("IndexKeySpec", Vl), + (ic.startNonterminal("IndexKeySpec", Vl), Ma(), $l == 80 && (jl(), _a()), Il(156), $l == 95 && (jl(), Pa()), - ic.endNonterminal("IndexKeySpec", Vl); + ic.endNonterminal("IndexKeySpec", Vl)); } function Ma() { - ic.startNonterminal("IndexKeyExpr", Vl), + (ic.startNonterminal("IndexKeyExpr", Vl), Or(), - ic.endNonterminal("IndexKeyExpr", Vl); + ic.endNonterminal("IndexKeyExpr", Vl)); } function _a() { - ic.startNonterminal("IndexKeyTypeDecl", Vl), + (ic.startNonterminal("IndexKeyTypeDecl", Vl), Pl(80), Il(245), jl(), Da(), - Il(189); - if ($l == 40 || $l == 41 || $l == 65) jl(), Os(); + Il(189)); + if ($l == 40 || $l == 41 || $l == 65) (jl(), Os()); ic.endNonterminal("IndexKeyTypeDecl", Vl); } function Da() { - ic.startNonterminal("AtomicType", Vl), + (ic.startNonterminal("AtomicType", Vl), $a(), - ic.endNonterminal("AtomicType", Vl); + ic.endNonterminal("AtomicType", Vl)); } function Pa() { - ic.startNonterminal("IndexKeyCollation", Vl), + (ic.startNonterminal("IndexKeyCollation", Vl), Pl(95), Il(15), Pl(7), - ic.endNonterminal("IndexKeyCollation", Vl); + ic.endNonterminal("IndexKeyCollation", Vl)); } function Ha() { - ic.startNonterminal("IndexDecl", Vl), + (ic.startNonterminal("IndexDecl", Vl), Pl(157), Il(245), jl(), @@ -24417,65 +24451,65 @@ Pl(88), Il(262), jl(), - Oa(); + Oa()); for (;;) { Il(107); if ($l != 42) break; - Pl(42), Il(262), jl(), Oa(); + (Pl(42), Il(262), jl(), Oa()); } ic.endNonterminal("IndexDecl", Vl); } function Ba() { - ic.startNonterminal("ICDecl", Vl), + (ic.startNonterminal("ICDecl", Vl), Pl(163), Il(43), Pl(98), Il(245), jl(), $a(), - Il(124); + Il(124)); switch ($l) { case 201: - jl(), ja(); + (jl(), ja()); break; default: - jl(), Ra(); + (jl(), Ra()); } ic.endNonterminal("ICDecl", Vl); } function ja() { - ic.startNonterminal("ICCollection", Vl), + (ic.startNonterminal("ICCollection", Vl), Pl(201), Il(42), Pl(96), Il(245), jl(), $a(), - Il(150); + Il(150)); switch ($l) { case 31: - jl(), Fa(); + (jl(), Fa()); break; case 194: - jl(), Ia(); + (jl(), Ia()); break; default: - jl(), qa(); + (jl(), qa()); } ic.endNonterminal("ICCollection", Vl); } function Fa() { - ic.startNonterminal("ICCollSequence", Vl), + (ic.startNonterminal("ICCollSequence", Vl), Si(), Il(40), Pl(93), Il(266), jl(), Wf(), - ic.endNonterminal("ICCollSequence", Vl); + ic.endNonterminal("ICCollSequence", Vl)); } function Ia() { - ic.startNonterminal("ICCollSequenceUnique", Vl), + (ic.startNonterminal("ICCollSequenceUnique", Vl), Pl(194), Il(21), jl(), @@ -24489,10 +24523,10 @@ Il(262), jl(), Or(), - ic.endNonterminal("ICCollSequenceUnique", Vl); + ic.endNonterminal("ICCollSequenceUnique", Vl)); } function qa() { - ic.startNonterminal("ICCollNode", Vl), + (ic.startNonterminal("ICCollNode", Vl), Pl(140), Il(65), Pl(194), @@ -24504,10 +24538,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("ICCollNode", Vl); + ic.endNonterminal("ICCollNode", Vl)); } function Ra() { - ic.startNonterminal("ICForeignKey", Vl), + (ic.startNonterminal("ICForeignKey", Vl), Pl(141), Il(60), Pl(171), @@ -24516,26 +24550,26 @@ Ua(), jl(), za(), - ic.endNonterminal("ICForeignKey", Vl); + ic.endNonterminal("ICForeignKey", Vl)); } function Ua() { - ic.startNonterminal("ICForeignKeySource", Vl), + (ic.startNonterminal("ICForeignKeySource", Vl), Pl(142), Il(42), jl(), Wa(), - ic.endNonterminal("ICForeignKeySource", Vl); + ic.endNonterminal("ICForeignKeySource", Vl)); } function za() { - ic.startNonterminal("ICForeignKeyTarget", Vl), + (ic.startNonterminal("ICForeignKeyTarget", Vl), Pl(253), Il(42), jl(), Wa(), - ic.endNonterminal("ICForeignKeyTarget", Vl); + ic.endNonterminal("ICForeignKeyTarget", Vl)); } function Wa() { - ic.startNonterminal("ICForeignKeyValues", Vl), + (ic.startNonterminal("ICForeignKeyValues", Vl), Pl(96), Il(245), jl(), @@ -24550,7 +24584,7 @@ Il(262), jl(), Or(), - ic.endNonterminal("ICForeignKeyValues", Vl); + ic.endNonterminal("ICForeignKeyValues", Vl)); } function Xa() { Hl(37); @@ -24577,7 +24611,7 @@ } } function $a() { - ic.startNonterminal("EQName", Vl), Rl(240); + (ic.startNonterminal("EQName", Vl), Rl(240)); switch ($l) { case 83: Pl(83); @@ -26270,16 +26304,16 @@ } } function Za() { - ic.startNonterminal("MainModule", Vl), + (ic.startNonterminal("MainModule", Vl), l(), jl(), ef(), - ic.endNonterminal("MainModule", Vl); + ic.endNonterminal("MainModule", Vl)); } function ef() { - ic.startNonterminal("Program", Vl), + (ic.startNonterminal("Program", Vl), of(), - ic.endNonterminal("Program", Vl); + ic.endNonterminal("Program", Vl)); } function tf() { ic.startNonterminal("Statements", Vl); @@ -26567,11 +26601,11 @@ o = Gl, u = Yl; try { - ff(), (Wl = -1); + (ff(), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -26582,7 +26616,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(8, Vl, Wl); + oc(8, Vl, Wl)); } } if ( @@ -26603,7 +26637,7 @@ Wl != 115333 ) break; - jl(), af(); + (jl(), af()); } ic.endNonterminal("Statements", Vl); } @@ -26892,10 +26926,10 @@ o = Gl, u = Yl; try { - ff(), oc(8, t, -1); + (ff(), oc(8, t, -1)); continue; } catch (a) { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -26906,7 +26940,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(8, t, -2); + oc(8, t, -2)); break; } } @@ -26933,23 +26967,23 @@ } } function rf() { - ic.startNonterminal("StatementsAndExpr", Vl), + (ic.startNonterminal("StatementsAndExpr", Vl), tf(), jl(), G(), - ic.endNonterminal("StatementsAndExpr", Vl); + ic.endNonterminal("StatementsAndExpr", Vl)); } function sf() { - nf(), Y(); + (nf(), Y()); } function of() { - ic.startNonterminal("StatementsAndOptionalExpr", Vl), + (ic.startNonterminal("StatementsAndOptionalExpr", Vl), tf(), $l != 25 && $l != 287 && (jl(), G()), - ic.endNonterminal("StatementsAndOptionalExpr", Vl); + ic.endNonterminal("StatementsAndOptionalExpr", Vl)); } function uf() { - nf(), $l != 25 && $l != 287 && Y(); + (nf(), $l != 25 && $l != 287 && Y()); } function af() { ic.startNonterminal("Statement", Vl); @@ -27182,10 +27216,10 @@ o = Gl, u = Yl; try { - cf(), (Wl = -1); + (cf(), (Wl = -1)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -27197,10 +27231,10 @@ ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), pf(), - (Wl = -2); + (Wl = -2)); } catch (f) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -27212,10 +27246,10 @@ ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), vf(), - (Wl = -3); + (Wl = -3)); } catch (l) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -27229,14 +27263,14 @@ (Yl = u), (cc = u))), If(), - (Wl = -12); + (Wl = -12)); } catch (c) { Wl = -13; } } } } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -27247,7 +27281,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(9, Vl, Wl); + oc(9, Vl, Wl)); } } switch (Wl) { @@ -27530,10 +27564,10 @@ o = Gl, u = Yl; try { - cf(), oc(9, t, -1), (Wl = -15); + (cf(), oc(9, t, -1), (Wl = -15)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -27546,10 +27580,10 @@ : ((Gl = o), (Yl = u), (cc = u))), pf(), oc(9, t, -2), - (Wl = -15); + (Wl = -15)); } catch (f) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -27562,10 +27596,10 @@ : ((Gl = o), (Yl = u), (cc = u))), vf(), oc(9, t, -3), - (Wl = -15); + (Wl = -15)); } catch (l) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -27580,9 +27614,9 @@ (cc = u))), If(), oc(9, t, -12), - (Wl = -15); + (Wl = -15)); } catch (c) { - (Wl = -13), + ((Wl = -13), (Xl = e), (Vl = t), ($l = n), @@ -27596,7 +27630,7 @@ : ((Gl = o), (Yl = u), (cc = u))), - oc(9, t, -13); + oc(9, t, -13)); } } } @@ -27655,16 +27689,16 @@ } } function lf() { - ic.startNonterminal("ApplyStatement", Vl), + (ic.startNonterminal("ApplyStatement", Vl), Vf(), Pl(54), - ic.endNonterminal("ApplyStatement", Vl); + ic.endNonterminal("ApplyStatement", Vl)); } function cf() { - $f(), Hl(54); + ($f(), Hl(54)); } function hf() { - ic.startNonterminal("AssignStatement", Vl), + (ic.startNonterminal("AssignStatement", Vl), Pl(31), Il(245), jl(), @@ -27675,13 +27709,13 @@ jl(), Wf(), Pl(54), - ic.endNonterminal("AssignStatement", Vl); + ic.endNonterminal("AssignStatement", Vl)); } function pf() { - Hl(31), Il(245), Ni(), Il(28), Hl(53), Il(266), Xf(), Hl(54); + (Hl(31), Il(245), Ni(), Il(28), Hl(53), Il(266), Xf(), Hl(54)); } function df() { - ic.startNonterminal("BlockStatement", Vl), + (ic.startNonterminal("BlockStatement", Vl), Pl(281), Il(270), jl(), @@ -27690,37 +27724,37 @@ jl(), tf(), Pl(287), - ic.endNonterminal("BlockStatement", Vl); + ic.endNonterminal("BlockStatement", Vl)); } function vf() { - Hl(281), Il(270), ff(), Il(280), nf(), Hl(287); + (Hl(281), Il(270), ff(), Il(280), nf(), Hl(287)); } function mf() { - ic.startNonterminal("BreakStatement", Vl), + (ic.startNonterminal("BreakStatement", Vl), Pl(87), Il(62), Pl(179), Il(29), Pl(54), - ic.endNonterminal("BreakStatement", Vl); + ic.endNonterminal("BreakStatement", Vl)); } function gf() { - Hl(87), Il(62), Hl(179), Il(29), Hl(54); + (Hl(87), Il(62), Hl(179), Il(29), Hl(54)); } function yf() { - ic.startNonterminal("ContinueStatement", Vl), + (ic.startNonterminal("ContinueStatement", Vl), Pl(103), Il(62), Pl(179), Il(29), Pl(54), - ic.endNonterminal("ContinueStatement", Vl); + ic.endNonterminal("ContinueStatement", Vl)); } function bf() { - Hl(103), Il(62), Hl(179), Il(29), Hl(54); + (Hl(103), Il(62), Hl(179), Il(29), Hl(54)); } function wf() { - ic.startNonterminal("ExitStatement", Vl), + (ic.startNonterminal("ExitStatement", Vl), Pl(133), Il(74), Pl(225), @@ -27728,19 +27762,19 @@ jl(), Wf(), Pl(54), - ic.endNonterminal("ExitStatement", Vl); + ic.endNonterminal("ExitStatement", Vl)); } function Ef() { - Hl(133), Il(74), Hl(225), Il(266), Xf(), Hl(54); + (Hl(133), Il(74), Hl(225), Il(266), Xf(), Hl(54)); } function Sf() { - ic.startNonterminal("FLWORStatement", Vl), tt(); + (ic.startNonterminal("FLWORStatement", Vl), tt()); for (;;) { Il(195); if ($l == 224) break; - jl(), rt(); + (jl(), rt()); } - jl(), Tf(), ic.endNonterminal("FLWORStatement", Vl); + (jl(), Tf(), ic.endNonterminal("FLWORStatement", Vl)); } function xf() { nt(); @@ -27752,18 +27786,18 @@ Nf(); } function Tf() { - ic.startNonterminal("ReturnStatement", Vl), + (ic.startNonterminal("ReturnStatement", Vl), Pl(224), Il(270), jl(), af(), - ic.endNonterminal("ReturnStatement", Vl); + ic.endNonterminal("ReturnStatement", Vl)); } function Nf() { - Hl(224), Il(270), ff(); + (Hl(224), Il(270), ff()); } function Cf() { - ic.startNonterminal("IfStatement", Vl), + (ic.startNonterminal("IfStatement", Vl), Pl(154), Il(22), Pl(35), @@ -27781,10 +27815,10 @@ Il(270), jl(), af(), - ic.endNonterminal("IfStatement", Vl); + ic.endNonterminal("IfStatement", Vl)); } function kf() { - Hl(154), + (Hl(154), Il(22), Hl(35), Il(266), @@ -27797,64 +27831,64 @@ Il(51), Hl(123), Il(270), - ff(); + ff()); } function Lf() { - ic.startNonterminal("SwitchStatement", Vl), + (ic.startNonterminal("SwitchStatement", Vl), Pl(248), Il(22), Pl(35), Il(266), jl(), G(), - Pl(38); + Pl(38)); for (;;) { - Il(38), jl(), Of(), Il(117); + (Il(38), jl(), Of(), Il(117)); if ($l != 89) break; } - Pl(110), + (Pl(110), Il(73), Pl(224), Il(270), jl(), af(), - ic.endNonterminal("SwitchStatement", Vl); + ic.endNonterminal("SwitchStatement", Vl)); } function Af() { - Hl(248), Il(22), Hl(35), Il(266), Y(), Hl(38); + (Hl(248), Il(22), Hl(35), Il(266), Y(), Hl(38)); for (;;) { - Il(38), Mf(), Il(117); + (Il(38), Mf(), Il(117)); if ($l != 89) break; } - Hl(110), Il(73), Hl(224), Il(270), ff(); + (Hl(110), Il(73), Hl(224), Il(270), ff()); } function Of() { ic.startNonterminal("SwitchCaseStatement", Vl); for (;;) { - Pl(89), Il(266), jl(), dn(); + (Pl(89), Il(266), jl(), dn()); if ($l != 89) break; } - Pl(224), + (Pl(224), Il(270), jl(), af(), - ic.endNonterminal("SwitchCaseStatement", Vl); + ic.endNonterminal("SwitchCaseStatement", Vl)); } function Mf() { for (;;) { - Hl(89), Il(266), vn(); + (Hl(89), Il(266), vn()); if ($l != 89) break; } - Hl(224), Il(270), ff(); + (Hl(224), Il(270), ff()); } function _f() { - ic.startNonterminal("TryCatchStatement", Vl), + (ic.startNonterminal("TryCatchStatement", Vl), Pl(256), Il(90), jl(), - df(); + df()); for (;;) { - Il(39), Pl(92), Il(248), jl(), _n(), jl(), df(), Il(283); + (Il(39), Pl(92), Il(248), jl(), _n(), jl(), df(), Il(283)); switch ($l) { case 92: ql(255); @@ -28010,9 +28044,9 @@ ic.endNonterminal("TryCatchStatement", Vl); } function Df() { - Hl(256), Il(90), vf(); + (Hl(256), Il(90), vf()); for (;;) { - Il(39), Hl(92), Il(248), Dn(), vf(), Il(283); + (Il(39), Hl(92), Il(248), Dn(), vf(), Il(283)); switch ($l) { case 92: ql(255); @@ -28167,19 +28201,19 @@ } } function Pf() { - ic.startNonterminal("TypeswitchStatement", Vl), + (ic.startNonterminal("TypeswitchStatement", Vl), Pl(259), Il(22), Pl(35), Il(266), jl(), G(), - Pl(38); + Pl(38)); for (;;) { - Il(38), jl(), Bf(), Il(117); + (Il(38), jl(), Bf(), Il(117)); if ($l != 89) break; } - Pl(110), + (Pl(110), Il(99), $l == 31 && (Pl(31), Il(245), jl(), Ti()), Il(73), @@ -28187,24 +28221,24 @@ Il(270), jl(), af(), - ic.endNonterminal("TypeswitchStatement", Vl); + ic.endNonterminal("TypeswitchStatement", Vl)); } function Hf() { - Hl(259), Il(22), Hl(35), Il(266), Y(), Hl(38); + (Hl(259), Il(22), Hl(35), Il(266), Y(), Hl(38)); for (;;) { - Il(38), jf(), Il(117); + (Il(38), jf(), Il(117)); if ($l != 89) break; } - Hl(110), + (Hl(110), Il(99), $l == 31 && (Hl(31), Il(245), Ni()), Il(73), Hl(224), Il(270), - ff(); + ff()); } function Bf() { - ic.startNonterminal("CaseStatement", Vl), + (ic.startNonterminal("CaseStatement", Vl), Pl(89), Il(257), $l == 31 && (Pl(31), Il(245), jl(), Ti(), Il(33), Pl(80)), @@ -28216,10 +28250,10 @@ Il(270), jl(), af(), - ic.endNonterminal("CaseStatement", Vl); + ic.endNonterminal("CaseStatement", Vl)); } function jf() { - Hl(89), + (Hl(89), Il(257), $l == 31 && (Hl(31), Il(245), Ni(), Il(33), Hl(80)), Il(253), @@ -28227,16 +28261,16 @@ Il(73), Hl(224), Il(270), - ff(); + ff()); } function Ff() { ic.startNonterminal("VarDeclStatement", Vl); for (;;) { Il(102); if ($l != 33) break; - jl(), B(); + (jl(), B()); } - Pl(268), + (Pl(268), Il(21), Pl(31), Il(245), @@ -28245,10 +28279,10 @@ Il(172), $l == 80 && (jl(), Cs()), Il(155), - $l == 53 && (Pl(53), Il(266), jl(), Wf()); + $l == 53 && (Pl(53), Il(266), jl(), Wf())); for (;;) { if ($l != 42) break; - Pl(42), + (Pl(42), Il(21), Pl(31), Il(245), @@ -28257,9 +28291,9 @@ Il(172), $l == 80 && (jl(), Cs()), Il(155), - $l == 53 && (Pl(53), Il(266), jl(), Wf()); + $l == 53 && (Pl(53), Il(266), jl(), Wf())); } - Pl(54), ic.endNonterminal("VarDeclStatement", Vl); + (Pl(54), ic.endNonterminal("VarDeclStatement", Vl)); } function If() { for (;;) { @@ -28267,7 +28301,7 @@ if ($l != 33) break; j(); } - Hl(268), + (Hl(268), Il(21), Hl(31), Il(245), @@ -28275,10 +28309,10 @@ Il(172), $l == 80 && ks(), Il(155), - $l == 53 && (Hl(53), Il(266), Xf()); + $l == 53 && (Hl(53), Il(266), Xf())); for (;;) { if ($l != 42) break; - Hl(42), + (Hl(42), Il(21), Hl(31), Il(245), @@ -28286,12 +28320,12 @@ Il(172), $l == 80 && ks(), Il(155), - $l == 53 && (Hl(53), Il(266), Xf()); + $l == 53 && (Hl(53), Il(266), Xf())); } Hl(54); } function qf() { - ic.startNonterminal("WhileStatement", Vl), + (ic.startNonterminal("WhileStatement", Vl), Pl(273), Il(22), Pl(35), @@ -28302,15 +28336,15 @@ Il(270), jl(), af(), - ic.endNonterminal("WhileStatement", Vl); + ic.endNonterminal("WhileStatement", Vl)); } function Rf() { - Hl(273), Il(22), Hl(35), Il(266), Y(), Hl(38), Il(270), ff(); + (Hl(273), Il(22), Hl(35), Il(266), Y(), Hl(38), Il(270), ff()); } function Uf() { - ic.startNonterminal("VoidStatement", Vl), + (ic.startNonterminal("VoidStatement", Vl), Pl(54), - ic.endNonterminal("VoidStatement", Vl); + ic.endNonterminal("VoidStatement", Vl)); } function zf() { Hl(54); @@ -28450,10 +28484,10 @@ o = Gl, u = Yl; try { - Hn(), (Wl = -2); + (Hn(), (Wl = -2)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28465,10 +28499,10 @@ ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), zo(), - (Wl = -3); + (Wl = -3)); } catch (f) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28480,10 +28514,10 @@ ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), Xo(), - (Wl = -4); + (Wl = -4)); } catch (l) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28497,10 +28531,10 @@ (Yl = u), (cc = u))), Ko(), - (Wl = -5); + (Wl = -5)); } catch (c) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28514,10 +28548,10 @@ (Yl = u), (cc = u))), $o(), - (Wl = -6); + (Wl = -6)); } catch (h) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28531,10 +28565,10 @@ (Yl = u), (cc = u))), Kf(), - (Wl = -8); + (Wl = -8)); } catch (p) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28548,10 +28582,10 @@ (Yl = u), (cc = u))), Gf(), - (Wl = -9); + (Wl = -9)); } catch (d) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28565,10 +28599,10 @@ (Yl = u), (cc = u))), Zf(), - (Wl = -10); + (Wl = -10)); } catch (v) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28585,7 +28619,7 @@ (cc = u))), tl(), - (Wl = -11); + (Wl = -11)); } catch (m) { Wl = -12; } @@ -28597,7 +28631,7 @@ } } } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -28608,7 +28642,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(10, Vl, Wl); + oc(10, Vl, Wl)); } } switch (Wl) { @@ -29318,10 +29352,10 @@ o = Gl, u = Yl; try { - Hn(), oc(10, t, -2), (Wl = -13); + (Hn(), oc(10, t, -2), (Wl = -13)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -29334,10 +29368,10 @@ : ((Gl = o), (Yl = u), (cc = u))), zo(), oc(10, t, -3), - (Wl = -13); + (Wl = -13)); } catch (f) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -29350,10 +29384,10 @@ : ((Gl = o), (Yl = u), (cc = u))), Xo(), oc(10, t, -4), - (Wl = -13); + (Wl = -13)); } catch (l) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -29368,10 +29402,10 @@ (cc = u))), Ko(), oc(10, t, -5), - (Wl = -13); + (Wl = -13)); } catch (c) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -29386,10 +29420,10 @@ (cc = u))), $o(), oc(10, t, -6), - (Wl = -13); + (Wl = -13)); } catch (h) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -29404,10 +29438,10 @@ (cc = u))), Kf(), oc(10, t, -8), - (Wl = -13); + (Wl = -13)); } catch (p) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -29422,10 +29456,10 @@ (cc = u))), Gf(), oc(10, t, -9), - (Wl = -13); + (Wl = -13)); } catch (d) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -29440,10 +29474,10 @@ (cc = u))), Zf(), oc(10, t, -10), - (Wl = -13); + (Wl = -13)); } catch (v) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -29461,9 +29495,9 @@ u))), tl(), oc(10, t, -11), - (Wl = -13); + (Wl = -13)); } catch (m) { - (Wl = -12), + ((Wl = -12), (Xl = e), (Vl = t), ($l = n), @@ -29480,7 +29514,7 @@ u), (cc = u))), - oc(10, t, -12); + oc(10, t, -12)); } } } @@ -30155,7 +30189,7 @@ } } function Jf() { - ic.startNonterminal("JSONDeleteExpr", Vl), Pl(111), Il(259); + (ic.startNonterminal("JSONDeleteExpr", Vl), Pl(111), Il(259)); switch ($l) { case 168: ql(260); @@ -30175,11 +30209,11 @@ o = Gl, u = Yl; try { - Hl(168), (Wl = -1); + (Hl(168), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -30190,10 +30224,10 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(11, Vl, Wl); + oc(11, Vl, Wl)); } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -30351,10 +30385,10 @@ Il(259), jl(), ei(), - ic.endNonterminal("JSONDeleteExpr", Vl); + ic.endNonterminal("JSONDeleteExpr", Vl)); } function Kf() { - Hl(111), Il(259); + (Hl(111), Il(259)); switch ($l) { case 168: ql(260); @@ -30374,9 +30408,9 @@ o = Gl, u = Yl; try { - Hl(168), oc(11, t, -1); + (Hl(168), oc(11, t, -1)); } catch (a) { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -30387,12 +30421,12 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(11, t, -2); + oc(11, t, -2)); } Wl = -2; } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -30548,7 +30582,7 @@ Wl == 145064) && Hl(168), Il(259), - ti(); + ti()); } function Qf() { ic.startNonterminal("JSONInsertExpr", Vl); @@ -30571,7 +30605,7 @@ o = Gl, u = Yl; try { - Hl(161), Il(266); + (Hl(161), Il(266)); switch ($l) { case 168: ql(268); @@ -30591,9 +30625,9 @@ d = Gl, v = Yl; try { - Hl(168), oc(13, f, -1); + (Hl(168), oc(13, f, -1)); } catch (m) { - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -30606,12 +30640,12 @@ : ((Gl = d), (Yl = v), (cc = v))), - oc(13, f, -2); + oc(13, f, -2)); } Wl = -2; } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -30776,7 +30810,7 @@ Xf(), Hl(165), Il(266), - Xf(); + Xf()); switch ($l) { case 82: ql(72); @@ -30796,14 +30830,14 @@ d = Gl, v = Yl; try { - Hl(82), + (Hl(82), Il(72), Hl(215), Il(266), Xf(), - oc(14, f, -1); + oc(14, f, -1)); } catch (m) { - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -30816,17 +30850,17 @@ : ((Gl = d), (Yl = v), (cc = v))), - oc(14, f, -2); + oc(14, f, -2)); } Wl = -2; } } - Wl == -1 && (Hl(82), Il(72), Hl(215), Il(266), Xf()), - (Wl = -1); + (Wl == -1 && (Hl(82), Il(72), Hl(215), Il(266), Xf()), + (Wl = -1)); } catch (g) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -30837,12 +30871,12 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(12, Vl, Wl); + oc(12, Vl, Wl)); } } switch (Wl) { case -1: - Pl(161), Il(266); + (Pl(161), Il(266)); switch ($l) { case 168: ql(268); @@ -30862,11 +30896,11 @@ d = Gl, v = Yl; try { - Hl(168), (Wl = -1); + (Hl(168), (Wl = -1)); } catch (m) { Wl = -2; } - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -30877,10 +30911,10 @@ Ql == 0 ? (cc = h) : ((Gl = d), (Yl = v), (cc = v))), - oc(13, Vl, Wl); + oc(13, Vl, Wl)); } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -31047,7 +31081,7 @@ Pl(165), Il(266), jl(), - Wf(); + Wf()); switch ($l) { case 82: ql(72); @@ -31067,16 +31101,16 @@ d = Gl, v = Yl; try { - Hl(82), + (Hl(82), Il(72), Hl(215), Il(266), Xf(), - (Wl = -1); + (Wl = -1)); } catch (m) { Wl = -2; } - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -31087,13 +31121,13 @@ Ql == 0 ? (cc = h) : ((Gl = d), (Yl = v), (cc = v))), - oc(14, Vl, Wl); + oc(14, Vl, Wl)); } } Wl == -1 && (Pl(82), Il(72), Pl(215), Il(266), jl(), Wf()); break; default: - Pl(161), Il(267); + (Pl(161), Il(267)); switch ($l) { case 168: ql(281); @@ -31113,11 +31147,11 @@ d = Gl, v = Yl; try { - Hl(168), (Wl = -1); + (Hl(168), (Wl = -1)); } catch (m) { Wl = -2; } - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -31128,10 +31162,10 @@ Ql == 0 ? (cc = h) : ((Gl = d), (Yl = v), (cc = v))), - oc(15, Vl, Wl); + oc(15, Vl, Wl)); } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -31299,7 +31333,7 @@ Pl(165), Il(266), jl(), - Wf(); + Wf()); } ic.endNonterminal("JSONInsertExpr", Vl); } @@ -31323,7 +31357,7 @@ o = Gl, u = Yl; try { - Hl(161), Il(266); + (Hl(161), Il(266)); switch ($l) { case 168: ql(268); @@ -31343,9 +31377,9 @@ d = Gl, v = Yl; try { - Hl(168), oc(13, f, -1); + (Hl(168), oc(13, f, -1)); } catch (m) { - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -31358,12 +31392,12 @@ : ((Gl = d), (Yl = v), (cc = v))), - oc(13, f, -2); + oc(13, f, -2)); } Wl = -2; } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -31528,7 +31562,7 @@ Xf(), Hl(165), Il(266), - Xf(); + Xf()); switch ($l) { case 82: ql(72); @@ -31548,14 +31582,14 @@ d = Gl, v = Yl; try { - Hl(82), + (Hl(82), Il(72), Hl(215), Il(266), Xf(), - oc(14, f, -1); + oc(14, f, -1)); } catch (m) { - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -31568,16 +31602,16 @@ : ((Gl = d), (Yl = v), (cc = v))), - oc(14, f, -2); + oc(14, f, -2)); } Wl = -2; } } - Wl == -1 && (Hl(82), Il(72), Hl(215), Il(266), Xf()), + (Wl == -1 && (Hl(82), Il(72), Hl(215), Il(266), Xf()), oc(12, t, -1), - (Wl = -3); + (Wl = -3)); } catch (g) { - (Wl = -2), + ((Wl = -2), (Xl = e), (Vl = t), ($l = n), @@ -31589,13 +31623,13 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(12, t, -2); + oc(12, t, -2)); } } } switch (Wl) { case -1: - Hl(161), Il(266); + (Hl(161), Il(266)); switch ($l) { case 168: ql(268); @@ -31615,9 +31649,9 @@ d = Gl, v = Yl; try { - Hl(168), oc(13, f, -1); + (Hl(168), oc(13, f, -1)); } catch (m) { - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -31628,12 +31662,12 @@ Ql == 0 ? (cc = h) : ((Gl = d), (Yl = v), (cc = v))), - oc(13, f, -2); + oc(13, f, -2)); } Wl = -2; } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -31798,7 +31832,7 @@ Xf(), Hl(165), Il(266), - Xf(); + Xf()); switch ($l) { case 82: ql(72); @@ -31818,14 +31852,14 @@ d = Gl, v = Yl; try { - Hl(82), + (Hl(82), Il(72), Hl(215), Il(266), Xf(), - oc(14, f, -1); + oc(14, f, -1)); } catch (m) { - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -31836,7 +31870,7 @@ Ql == 0 ? (cc = h) : ((Gl = d), (Yl = v), (cc = v))), - oc(14, f, -2); + oc(14, f, -2)); } Wl = -2; } @@ -31846,7 +31880,7 @@ case -3: break; default: - Hl(161), Il(267); + (Hl(161), Il(267)); switch ($l) { case 168: ql(281); @@ -31866,9 +31900,9 @@ d = Gl, v = Yl; try { - Hl(168), oc(15, f, -1); + (Hl(168), oc(15, f, -1)); } catch (m) { - (Xl = a), + ((Xl = a), (Vl = f), ($l = l), $l == 0 @@ -31879,12 +31913,12 @@ Ql == 0 ? (cc = h) : ((Gl = d), (Yl = v), (cc = v))), - oc(15, f, -2); + oc(15, f, -2)); } Wl = -2; } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -32050,11 +32084,11 @@ Nl(), Hl(165), Il(266), - Xf(); + Xf()); } } function Yf() { - ic.startNonterminal("JSONRenameExpr", Vl), Pl(222), Il(259); + (ic.startNonterminal("JSONRenameExpr", Vl), Pl(222), Il(259)); switch ($l) { case 168: ql(260); @@ -32074,11 +32108,11 @@ o = Gl, u = Yl; try { - Hl(168), (Wl = -1); + (Hl(168), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -32089,10 +32123,10 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(16, Vl, Wl); + oc(16, Vl, Wl)); } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -32254,10 +32288,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("JSONRenameExpr", Vl); + ic.endNonterminal("JSONRenameExpr", Vl)); } function Zf() { - Hl(222), Il(259); + (Hl(222), Il(259)); switch ($l) { case 168: ql(260); @@ -32277,9 +32311,9 @@ o = Gl, u = Yl; try { - Hl(168), oc(16, t, -1); + (Hl(168), oc(16, t, -1)); } catch (a) { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -32290,12 +32324,12 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(16, t, -2); + oc(16, t, -2)); } Wl = -2; } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -32454,10 +32488,10 @@ ti(), Hl(80), Il(266), - Xf(); + Xf()); } function el() { - ic.startNonterminal("JSONReplaceExpr", Vl), + (ic.startNonterminal("JSONReplaceExpr", Vl), Pl(223), Il(85), Pl(267), @@ -32472,10 +32506,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("JSONReplaceExpr", Vl); + ic.endNonterminal("JSONReplaceExpr", Vl)); } function tl() { - Hl(223), + (Hl(223), Il(85), Hl(267), Il(67), @@ -32486,10 +32520,10 @@ ti(), Hl(276), Il(266), - Xf(); + Xf()); } function nl() { - ic.startNonterminal("JSONAppendExpr", Vl), Pl(78), Il(266); + (ic.startNonterminal("JSONAppendExpr", Vl), Pl(78), Il(266)); switch ($l) { case 168: ql(268); @@ -32509,11 +32543,11 @@ o = Gl, u = Yl; try { - Hl(168), (Wl = -1); + (Hl(168), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -32524,10 +32558,10 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(17, Vl, Wl); + oc(17, Vl, Wl)); } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -32695,10 +32729,10 @@ Il(266), jl(), Wf(), - ic.endNonterminal("JSONAppendExpr", Vl); + ic.endNonterminal("JSONAppendExpr", Vl)); } function rl() { - Hl(78), Il(266); + (Hl(78), Il(266)); switch ($l) { case 168: ql(268); @@ -32718,9 +32752,9 @@ o = Gl, u = Yl; try { - Hl(168), oc(17, t, -1); + (Hl(168), oc(17, t, -1)); } catch (a) { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -32731,12 +32765,12 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(17, t, -2); + oc(17, t, -2)); } Wl = -2; } } - (Wl == -1 || + ((Wl == -1 || Wl == 3240 || Wl == 4264 || Wl == 4776 || @@ -32901,7 +32935,7 @@ Xf(), Hl(165), Il(266), - Xf(); + Xf()); } function il() { ic.startNonterminal("CommonContent", Vl); @@ -32942,32 +32976,32 @@ } } function ol() { - ic.startNonterminal("ContentExpr", Vl), + (ic.startNonterminal("ContentExpr", Vl), rf(), - ic.endNonterminal("ContentExpr", Vl); + ic.endNonterminal("ContentExpr", Vl)); } function ul() { sf(); } function al() { - ic.startNonterminal("CompDocConstructor", Vl), + (ic.startNonterminal("CompDocConstructor", Vl), Pl(120), Il(90), jl(), Ol(), - ic.endNonterminal("CompDocConstructor", Vl); + ic.endNonterminal("CompDocConstructor", Vl)); } function fl() { - Hl(120), Il(90), Ml(); + (Hl(120), Il(90), Ml()); } function ll() { - ic.startNonterminal("CompAttrConstructor", Vl), Pl(83), Il(249); + (ic.startNonterminal("CompAttrConstructor", Vl), Pl(83), Il(249)); switch ($l) { case 281: - Pl(281), Il(266), jl(), G(), Pl(287); + (Pl(281), Il(266), jl(), G(), Pl(287)); break; default: - jl(), $a(); + (jl(), $a()); } Il(90); switch ($l) { @@ -32989,11 +33023,11 @@ o = Gl, u = Yl; try { - Hl(281), Il(91), Hl(287), (Wl = -1); + (Hl(281), Il(91), Hl(287), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -33004,23 +33038,23 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(18, Vl, Wl); + oc(18, Vl, Wl)); } } switch (Wl) { case -1: - Pl(281), Il(91), Pl(287); + (Pl(281), Il(91), Pl(287)); break; default: - jl(), Ol(); + (jl(), Ol()); } ic.endNonterminal("CompAttrConstructor", Vl); } function cl() { - Hl(83), Il(249); + (Hl(83), Il(249)); switch ($l) { case 281: - Hl(281), Il(266), Y(), Hl(287); + (Hl(281), Il(266), Y(), Hl(287)); break; default: Ja(); @@ -33045,9 +33079,9 @@ o = Gl, u = Yl; try { - Hl(281), Il(91), Hl(287), oc(18, t, -1), (Wl = -3); + (Hl(281), Il(91), Hl(287), oc(18, t, -1), (Wl = -3)); } catch (a) { - (Wl = -2), + ((Wl = -2), (Xl = e), (Vl = t), ($l = n), @@ -33059,13 +33093,13 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(18, t, -2); + oc(18, t, -2)); } } } switch (Wl) { case -1: - Hl(281), Il(91), Hl(287); + (Hl(281), Il(91), Hl(287)); break; case -3: break; @@ -33074,13 +33108,13 @@ } } function hl() { - ic.startNonterminal("CompPIConstructor", Vl), Pl(220), Il(241); + (ic.startNonterminal("CompPIConstructor", Vl), Pl(220), Il(241)); switch ($l) { case 281: - Pl(281), Il(266), jl(), G(), Pl(287); + (Pl(281), Il(266), jl(), G(), Pl(287)); break; default: - jl(), Ga(); + (jl(), Ga()); } Il(90); switch ($l) { @@ -33102,11 +33136,11 @@ o = Gl, u = Yl; try { - Hl(281), Il(91), Hl(287), (Wl = -1); + (Hl(281), Il(91), Hl(287), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -33117,23 +33151,23 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(19, Vl, Wl); + oc(19, Vl, Wl)); } } switch (Wl) { case -1: - Pl(281), Il(91), Pl(287); + (Pl(281), Il(91), Pl(287)); break; default: - jl(), Ol(); + (jl(), Ol()); } ic.endNonterminal("CompPIConstructor", Vl); } function pl() { - Hl(220), Il(241); + (Hl(220), Il(241)); switch ($l) { case 281: - Hl(281), Il(266), Y(), Hl(287); + (Hl(281), Il(266), Y(), Hl(287)); break; default: Ya(); @@ -33158,9 +33192,9 @@ o = Gl, u = Yl; try { - Hl(281), Il(91), Hl(287), oc(19, t, -1), (Wl = -3); + (Hl(281), Il(91), Hl(287), oc(19, t, -1), (Wl = -3)); } catch (a) { - (Wl = -2), + ((Wl = -2), (Xl = e), (Vl = t), ($l = n), @@ -33172,13 +33206,13 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(19, t, -2); + oc(19, t, -2)); } } } switch (Wl) { case -1: - Hl(281), Il(91), Hl(287); + (Hl(281), Il(91), Hl(287)); break; case -3: break; @@ -33187,26 +33221,26 @@ } } function dl() { - ic.startNonterminal("CompCommentConstructor", Vl), + (ic.startNonterminal("CompCommentConstructor", Vl), Pl(97), Il(90), jl(), Ol(), - ic.endNonterminal("CompCommentConstructor", Vl); + ic.endNonterminal("CompCommentConstructor", Vl)); } function vl() { - Hl(97), Il(90), Ml(); + (Hl(97), Il(90), Ml()); } function ml() { - ic.startNonterminal("CompTextConstructor", Vl), + (ic.startNonterminal("CompTextConstructor", Vl), Pl(249), Il(90), jl(), Ol(), - ic.endNonterminal("CompTextConstructor", Vl); + ic.endNonterminal("CompTextConstructor", Vl)); } function gl() { - Hl(249), Il(90), Ml(); + (Hl(249), Il(90), Ml()); } function yl() { ic.startNonterminal("PrimaryExpr", Vl); @@ -33534,10 +33568,10 @@ o = Gl, u = Yl; try { - vi(), (Wl = -1); + (vi(), (Wl = -1)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -33549,10 +33583,10 @@ ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), Hi(), - (Wl = -5); + (Wl = -5)); } catch (f) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -33564,13 +33598,13 @@ ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), Ml(), - (Wl = -10); + (Wl = -10)); } catch (l) { Wl = -11; } } } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -33581,7 +33615,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(20, Vl, Wl); + oc(20, Vl, Wl)); } } switch (Wl) { @@ -34449,10 +34483,10 @@ o = Gl, u = Yl; try { - vi(), oc(20, t, -1), (Wl = -14); + (vi(), oc(20, t, -1), (Wl = -14)); } catch (a) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -34465,10 +34499,10 @@ : ((Gl = o), (Yl = u), (cc = u))), Hi(), oc(20, t, -5), - (Wl = -14); + (Wl = -14)); } catch (f) { try { - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -34481,9 +34515,9 @@ : ((Gl = o), (Yl = u), (cc = u))), Ml(), oc(20, t, -10), - (Wl = -14); + (Wl = -14)); } catch (l) { - (Wl = -11), + ((Wl = -11), (Xl = e), (Vl = t), ($l = n), @@ -34495,7 +34529,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(20, t, -11); + oc(20, t, -11)); } } } @@ -35043,32 +35077,32 @@ } } function wl() { - ic.startNonterminal("JSONSimpleObjectUnion", Vl), + (ic.startNonterminal("JSONSimpleObjectUnion", Vl), Pl(283), Il(273), $l != 286 && (jl(), G()), Pl(286), - ic.endNonterminal("JSONSimpleObjectUnion", Vl); + ic.endNonterminal("JSONSimpleObjectUnion", Vl)); } function El() { - Hl(283), Il(273), $l != 286 && Y(), Hl(286); + (Hl(283), Il(273), $l != 286 && Y(), Hl(286)); } function Sl() { - ic.startNonterminal("ObjectConstructor", Vl), + (ic.startNonterminal("ObjectConstructor", Vl), Pl(281), Il(276), $l != 287 && (jl(), Tl()), Pl(287), - ic.endNonterminal("ObjectConstructor", Vl); + ic.endNonterminal("ObjectConstructor", Vl)); } function xl() { - Hl(281), Il(276), $l != 287 && Nl(), Hl(287); + (Hl(281), Il(276), $l != 287 && Nl(), Hl(287)); } function Tl() { - ic.startNonterminal("PairConstructorList", Vl), Cl(); + (ic.startNonterminal("PairConstructorList", Vl), Cl()); for (;;) { if ($l != 42) break; - Pl(42), Il(267), jl(), Cl(); + (Pl(42), Il(267), jl(), Cl()); } ic.endNonterminal("PairConstructorList", Vl); } @@ -35076,7 +35110,7 @@ kl(); for (;;) { if ($l != 42) break; - Hl(42), Il(267), kl(); + (Hl(42), Il(267), kl()); } } function Cl() { @@ -35265,11 +35299,11 @@ o = Gl, u = Yl; try { - Xf(), (Wl = -1); + (Xf(), (Wl = -1)); } catch (a) { Wl = -2; } - (Xl = e), + ((Xl = e), (Vl = t), ($l = n), $l == 0 @@ -35280,7 +35314,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(21, Vl, Wl); + oc(21, Vl, Wl)); } } switch (Wl) { @@ -35424,12 +35458,12 @@ default: Wf(); } - Il(26), + (Il(26), Pl(50), Il(266), jl(), Wf(), - ic.endNonterminal("PairConstructor", Vl); + ic.endNonterminal("PairConstructor", Vl)); } function kl() { switch ($l) { @@ -35616,9 +35650,9 @@ o = Gl, u = Yl; try { - Xf(), oc(21, t, -1), (Wl = -3); + (Xf(), oc(21, t, -1), (Wl = -3)); } catch (a) { - (Wl = -2), + ((Wl = -2), (Xl = e), (Vl = t), ($l = n), @@ -35630,7 +35664,7 @@ Ql == 0 ? (cc = i) : ((Gl = o), (Yl = u), (cc = u))), - oc(21, t, -2); + oc(21, t, -2)); } } } @@ -35777,33 +35811,33 @@ default: Xf(); } - Il(26), Hl(50), Il(266), Xf(); + (Il(26), Hl(50), Il(266), Xf()); } function Ll() { - ic.startNonterminal("ArrayConstructor", Vl), + (ic.startNonterminal("ArrayConstructor", Vl), Pl(69), Il(272), $l != 70 && (jl(), G()), Pl(70), - ic.endNonterminal("ArrayConstructor", Vl); + ic.endNonterminal("ArrayConstructor", Vl)); } function Al() { - Hl(69), Il(272), $l != 70 && Y(), Hl(70); + (Hl(69), Il(272), $l != 70 && Y(), Hl(70)); } function Ol() { - ic.startNonterminal("BlockExpr", Vl), + (ic.startNonterminal("BlockExpr", Vl), Pl(281), Il(280), jl(), of(), Pl(287), - ic.endNonterminal("BlockExpr", Vl); + ic.endNonterminal("BlockExpr", Vl)); } function Ml() { - Hl(281), Il(280), uf(), Hl(287); + (Hl(281), Il(280), uf(), Hl(287)); } function _l() { - ic.startNonterminal("FunctionDecl", Vl), + (ic.startNonterminal("FunctionDecl", Vl), Pl(147), Il(245), jl(), @@ -35815,10 +35849,10 @@ Pl(38), Il(158), $l == 80 && (jl(), Dl()), - Il(122); + Il(122)); switch ($l) { case 281: - Pl(281), Il(280), jl(), of(), Pl(287); + (Pl(281), Il(280), jl(), of(), Pl(287)); break; default: Pl(134); @@ -35826,12 +35860,12 @@ ic.endNonterminal("FunctionDecl", Vl); } function Dl() { - ic.startNonterminal("ReturnType", Vl), + (ic.startNonterminal("ReturnType", Vl), Pl(80), Il(253), jl(), Ls(), - ic.endNonterminal("ReturnType", Vl); + ic.endNonterminal("ReturnType", Vl)); } function Pl(e) { $l == e @@ -35857,7 +35891,7 @@ r = $l, i = Jl, s = Kl; - ($l = e), + (($l = e), (Jl = lc), (Kl = cc), (Ql = 0), @@ -35865,7 +35899,7 @@ (Xl = t), (Vl = n), ($l = r), - $l != 0 && ((Jl = i), (Kl = s)); + $l != 0 && ((Jl = i), (Kl = s))); } function jl() { Vl != Jl && (ic.whitespace(Vl, Jl), (Vl = Jl)); @@ -35885,20 +35919,20 @@ $l == 0 && (($l = Fl(e)), (Jl = lc), (Kl = cc)); } function ql(e) { - Ql == 0 && ((Ql = Fl(e)), (Gl = lc), (Yl = cc)), - (Wl = (Ql << 9) | $l); + (Ql == 0 && ((Ql = Fl(e)), (Gl = lc), (Yl = cc)), + (Wl = (Ql << 9) | $l)); } function Rl(e) { $l == 0 && (($l = hc(e)), (Jl = lc), (Kl = cc)); } function Ul(e) { - Ql == 0 && ((Ql = hc(e)), (Gl = lc), (Yl = cc)), - (Wl = (Ql << 9) | $l); + (Ql == 0 && ((Ql = hc(e)), (Gl = lc), (Yl = cc)), + (Wl = (Ql << 9) | $l)); } function zl(e, t, r, i, s) { throw ( - (t >= ec && ((Zl = e), (ec = t), (tc = r), (nc = i), (rc = s)), - new n.ParseException(Zl, ec, tc, nc, rc)) + t >= ec && ((Zl = e), (ec = t), (tc = r), (nc = i), (rc = s)), + new n.ParseException(Zl, ec, tc, nc, rc) ); } function oc(e, t, n) { @@ -35950,14 +35984,14 @@ } s = o; var p = (u << 13) + o - 1; - (o = i.TRANSITION[(p & 31) + i.TRANSITION[p >> 5]]), - o > 8191 && ((r = o), (o &= 8191), (cc = n)); + ((o = i.TRANSITION[(p & 31) + i.TRANSITION[p >> 5]]), + o > 8191 && ((r = o), (o &= 8191), (cc = n))); } r >>= 13; if (r == 0) { cc = n - 1; var f = cc < fc ? ac.charCodeAt(cc) : 0; - return f >= 56320 && f < 57344 && --cc, zl(lc, cc, s, -1, -1); + return (f >= 56320 && f < 57344 && --cc, zl(lc, cc, s, -1, -1)); } if (t) for (var d = r >> 9; d > 0; --d) { @@ -35970,13 +36004,13 @@ } r(e, t); var n = this; - (this.ParseException = function (e, t, n, r, i) { + ((this.ParseException = function (e, t, n, r, i) { var s = e, o = t, u = n, a = r, f = i; - (this.getBegin = function () { + ((this.getBegin = function () { return s; }), (this.getEnd = function () { @@ -35993,7 +36027,7 @@ }), (this.getMessage = function () { return a < 0 ? "lexical analysis failed" : "syntax error"; - }); + })); }), (this.getInput = function () { return ac; @@ -36043,13 +36077,13 @@ ); }), (this.parse_XQuery = function () { - ic.startNonterminal("XQuery", Vl), + (ic.startNonterminal("XQuery", Vl), Il(277), jl(), o(), Pl(25), - ic.endNonterminal("XQuery", Vl); - }); + ic.endNonterminal("XQuery", Vl)); + })); var Wl, Xl, Vl, @@ -36071,7 +36105,7 @@ lc, cc; }); - (r.getTokenSet = function (e) { + ((r.getTokenSet = function (e) { var t = [], n = e < 0 ? -e : r.INITIAL[e] & 8191; for (var i = 0; i < 289; i += 32) { @@ -43766,7 +43800,7 @@ "'|}'", "'}'", "'}}'", - ]); + ])); }, {}, ], @@ -43774,10 +43808,10 @@ function (e, t, n) { var r = (n.XQueryParser = function i(e, t) { function r(e, t) { - (Vl = t), (Ql = e), (Gl = e.length), s(0, 0, 0); + ((Vl = t), (Ql = e), (Gl = e.length), s(0, 0, 0)); } function s(e, t, n) { - (Dl = t), + ((Dl = t), (Pl = t), (Hl = e), (Bl = t), @@ -43786,7 +43820,7 @@ (Zl = n), (Ul = -1), ($l = {}), - Vl.reset(Ql); + Vl.reset(Ql)); } function o() { Vl.startNonterminal("Module", Pl); @@ -43797,7 +43831,7 @@ default: _l = Hl; } - (_l == 64274 || _l == 134930) && u(), kl(274); + ((_l == 64274 || _l == 134930) && u(), kl(274)); switch (Hl) { case 182: Ll(193); @@ -43807,38 +43841,38 @@ } switch (_l) { case 94390: - Nl(), a(); + (Nl(), a()); break; default: - Nl(), Ra(); + (Nl(), Ra()); } Vl.endNonterminal("Module", Pl); } function u() { - Vl.startNonterminal("VersionDecl", Pl), Sl(274), kl(116); + (Vl.startNonterminal("VersionDecl", Pl), Sl(274), kl(116)); switch (Hl) { case 125: - Sl(125), kl(17), Sl(11); + (Sl(125), kl(17), Sl(11)); break; default: - Sl(263), + (Sl(263), kl(17), Sl(11), kl(109), - Hl == 125 && (Sl(125), kl(17), Sl(11)); + Hl == 125 && (Sl(125), kl(17), Sl(11))); } - kl(28), Nl(), c(), Vl.endNonterminal("VersionDecl", Pl); + (kl(28), Nl(), c(), Vl.endNonterminal("VersionDecl", Pl)); } function a() { - Vl.startNonterminal("LibraryModule", Pl), + (Vl.startNonterminal("LibraryModule", Pl), f(), kl(138), Nl(), l(), - Vl.endNonterminal("LibraryModule", Pl); + Vl.endNonterminal("LibraryModule", Pl)); } function f() { - Vl.startNonterminal("ModuleDecl", Pl), + (Vl.startNonterminal("ModuleDecl", Pl), Sl(182), kl(61), Sl(184), @@ -43852,7 +43886,7 @@ kl(28), Nl(), c(), - Vl.endNonterminal("ModuleDecl", Pl); + Vl.endNonterminal("ModuleDecl", Pl)); } function l() { Vl.startNonterminal("Prolog", Pl); @@ -43902,11 +43936,11 @@ o = Il, u = ql; try { - _(), (_l = -1); + (_(), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -43917,26 +43951,26 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(0, Pl, _l); + Jl(0, Pl, _l)); } } switch (_l) { case -1: - Nl(), M(); + (Nl(), M()); break; case 94316: - Nl(), O(); + (Nl(), O()); break; case 153: - Nl(), C(); + (Nl(), C()); break; case 72300: - Nl(), D(); + (Nl(), D()); break; default: - Nl(), h(); + (Nl(), h()); } - kl(28), Nl(), c(); + (kl(28), Nl(), c()); } for (;;) { kl(274); @@ -43968,22 +44002,22 @@ } switch (_l) { case 51820: - Nl(), R(); + (Nl(), R()); break; case 101996: - Nl(), Q(); + (Nl(), Q()); break; default: - Nl(), P(); + (Nl(), P()); } - kl(28), Nl(), c(); + (kl(28), Nl(), c()); } Vl.endNonterminal("Prolog", Pl); } function c() { - Vl.startNonterminal("Separator", Pl), + (Vl.startNonterminal("Separator", Pl), Sl(53), - Vl.endNonterminal("Separator", Pl); + Vl.endNonterminal("Separator", Pl)); } function h() { Vl.startNonterminal("Setter", Pl); @@ -44006,10 +44040,10 @@ o = Il, u = ql; try { - v(), (_l = -2); + (v(), (_l = -2)); } catch (a) { try { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -44021,12 +44055,12 @@ ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), w(), - (_l = -6); + (_l = -6)); } catch (f) { _l = -9; } } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -44037,7 +44071,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(1, Pl, _l); + Jl(1, Pl, _l)); } } switch (_l) { @@ -44071,11 +44105,11 @@ Vl.endNonterminal("Setter", Pl); } function p() { - Vl.startNonterminal("BoundarySpaceDecl", Pl), + (Vl.startNonterminal("BoundarySpaceDecl", Pl), Sl(108), kl(33), Sl(85), - kl(133); + kl(133)); switch (Hl) { case 214: Sl(214); @@ -44086,7 +44120,7 @@ Vl.endNonterminal("BoundarySpaceDecl", Pl); } function d() { - Vl.startNonterminal("DefaultCollationDecl", Pl), + (Vl.startNonterminal("DefaultCollationDecl", Pl), Sl(108), kl(46), Sl(109), @@ -44094,26 +44128,26 @@ Sl(94), kl(15), Sl(7), - Vl.endNonterminal("DefaultCollationDecl", Pl); + Vl.endNonterminal("DefaultCollationDecl", Pl)); } function v() { - xl(108), kl(46), xl(109), kl(38), xl(94), kl(15), xl(7); + (xl(108), kl(46), xl(109), kl(38), xl(94), kl(15), xl(7)); } function m() { - Vl.startNonterminal("BaseURIDecl", Pl), + (Vl.startNonterminal("BaseURIDecl", Pl), Sl(108), kl(32), Sl(83), kl(15), Sl(7), - Vl.endNonterminal("BaseURIDecl", Pl); + Vl.endNonterminal("BaseURIDecl", Pl)); } function g() { - Vl.startNonterminal("ConstructionDecl", Pl), + (Vl.startNonterminal("ConstructionDecl", Pl), Sl(108), kl(41), Sl(98), - kl(133); + kl(133)); switch (Hl) { case 241: Sl(241); @@ -44124,11 +44158,11 @@ Vl.endNonterminal("ConstructionDecl", Pl); } function y() { - Vl.startNonterminal("OrderingModeDecl", Pl), + (Vl.startNonterminal("OrderingModeDecl", Pl), Sl(108), kl(68), Sl(203), - kl(131); + kl(131)); switch (Hl) { case 202: Sl(202); @@ -44139,7 +44173,7 @@ Vl.endNonterminal("OrderingModeDecl", Pl); } function b() { - Vl.startNonterminal("EmptyOrderDecl", Pl), + (Vl.startNonterminal("EmptyOrderDecl", Pl), Sl(108), kl(46), Sl(109), @@ -44147,7 +44181,7 @@ Sl(201), kl(49), Sl(123), - kl(121); + kl(121)); switch (Hl) { case 147: Sl(147); @@ -44158,7 +44192,14 @@ Vl.endNonterminal("EmptyOrderDecl", Pl); } function w() { - xl(108), kl(46), xl(109), kl(67), xl(201), kl(49), xl(123), kl(121); + (xl(108), + kl(46), + xl(109), + kl(67), + xl(201), + kl(49), + xl(123), + kl(121)); switch (Hl) { case 147: xl(147); @@ -44168,7 +44209,7 @@ } } function E() { - Vl.startNonterminal("CopyNamespacesDecl", Pl), + (Vl.startNonterminal("CopyNamespacesDecl", Pl), Sl(108), kl(44), Sl(104), @@ -44180,7 +44221,7 @@ kl(123), Nl(), x(), - Vl.endNonterminal("CopyNamespacesDecl", Pl); + Vl.endNonterminal("CopyNamespacesDecl", Pl)); } function S() { Vl.startNonterminal("PreserveMode", Pl); @@ -44205,18 +44246,18 @@ Vl.endNonterminal("InheritMode", Pl); } function T() { - Vl.startNonterminal("DecimalFormatDecl", Pl), Sl(108), kl(114); + (Vl.startNonterminal("DecimalFormatDecl", Pl), Sl(108), kl(114)); switch (Hl) { case 106: - Sl(106), kl(254), Nl(), Ha(); + (Sl(106), kl(254), Nl(), Ha()); break; default: - Sl(109), kl(45), Sl(106); + (Sl(109), kl(45), Sl(106)); } for (;;) { kl(180); if (Hl == 53) break; - Nl(), N(), kl(29), Sl(60), kl(17), Sl(11); + (Nl(), N(), kl(29), Sl(60), kl(17), Sl(11)); } Vl.endNonterminal("DecimalFormatDecl", Pl); } @@ -44274,7 +44315,7 @@ Vl.endNonterminal("Import", Pl); } function k() { - Vl.startNonterminal("SchemaImport", Pl), + (Vl.startNonterminal("SchemaImport", Pl), Sl(153), kl(73), Sl(225), @@ -44282,13 +44323,13 @@ Hl != 7 && (Nl(), L()), kl(15), Sl(7), - kl(108); + kl(108)); if (Hl == 81) { - Sl(81), kl(15), Sl(7); + (Sl(81), kl(15), Sl(7)); for (;;) { kl(103); if (Hl != 41) break; - Sl(41), kl(15), Sl(7); + (Sl(41), kl(15), Sl(7)); } } Vl.endNonterminal("SchemaImport", Pl); @@ -44297,15 +44338,15 @@ Vl.startNonterminal("SchemaPrefix", Pl); switch (Hl) { case 184: - Sl(184), kl(248), Nl(), Ia(), kl(29), Sl(60); + (Sl(184), kl(248), Nl(), Ia(), kl(29), Sl(60)); break; default: - Sl(109), kl(47), Sl(121), kl(61), Sl(184); + (Sl(109), kl(47), Sl(121), kl(61), Sl(184)); } Vl.endNonterminal("SchemaPrefix", Pl); } function A() { - Vl.startNonterminal("ModuleImport", Pl), + (Vl.startNonterminal("ModuleImport", Pl), Sl(153), kl(60), Sl(182), @@ -44313,19 +44354,19 @@ Hl == 184 && (Sl(184), kl(248), Nl(), Ia(), kl(29), Sl(60)), kl(15), Sl(7), - kl(108); + kl(108)); if (Hl == 81) { - Sl(81), kl(15), Sl(7); + (Sl(81), kl(15), Sl(7)); for (;;) { kl(103); if (Hl != 41) break; - Sl(41), kl(15), Sl(7); + (Sl(41), kl(15), Sl(7)); } } Vl.endNonterminal("ModuleImport", Pl); } function O() { - Vl.startNonterminal("NamespaceDecl", Pl), + (Vl.startNonterminal("NamespaceDecl", Pl), Sl(108), kl(61), Sl(184), @@ -44336,14 +44377,14 @@ Sl(60), kl(15), Sl(7), - Vl.endNonterminal("NamespaceDecl", Pl); + Vl.endNonterminal("NamespaceDecl", Pl)); } function M() { - Vl.startNonterminal("DefaultNamespaceDecl", Pl), + (Vl.startNonterminal("DefaultNamespaceDecl", Pl), Sl(108), kl(46), Sl(109), - kl(115); + kl(115)); switch (Hl) { case 121: Sl(121); @@ -44351,14 +44392,14 @@ default: Sl(145); } - kl(61), + (kl(61), Sl(184), kl(15), Sl(7), - Vl.endNonterminal("DefaultNamespaceDecl", Pl); + Vl.endNonterminal("DefaultNamespaceDecl", Pl)); } function _() { - xl(108), kl(46), xl(109), kl(115); + (xl(108), kl(46), xl(109), kl(115)); switch (Hl) { case 121: xl(121); @@ -44366,86 +44407,86 @@ default: xl(145); } - kl(61), xl(184), kl(15), xl(7); + (kl(61), xl(184), kl(15), xl(7)); } function D() { - Vl.startNonterminal("FTOptionDecl", Pl), + (Vl.startNonterminal("FTOptionDecl", Pl), Sl(108), kl(52), Sl(141), kl(81), Nl(), Fu(), - Vl.endNonterminal("FTOptionDecl", Pl); + Vl.endNonterminal("FTOptionDecl", Pl)); } function P() { - Vl.startNonterminal("AnnotatedDecl", Pl), Sl(108); + (Vl.startNonterminal("AnnotatedDecl", Pl), Sl(108)); for (;;) { kl(170); if (Hl != 32 && Hl != 257) break; switch (Hl) { case 257: - Nl(), H(); + (Nl(), H()); break; default: - Nl(), B(); + (Nl(), B()); } } switch (Hl) { case 262: - Nl(), F(); + (Nl(), F()); break; case 145: - Nl(), wl(); + (Nl(), wl()); break; case 95: - Nl(), da(); + (Nl(), da()); break; case 155: - Nl(), xa(); + (Nl(), xa()); break; default: - Nl(), Ta(); + (Nl(), Ta()); } Vl.endNonterminal("AnnotatedDecl", Pl); } function H() { - Vl.startNonterminal("CompatibilityAnnotation", Pl), + (Vl.startNonterminal("CompatibilityAnnotation", Pl), Sl(257), - Vl.endNonterminal("CompatibilityAnnotation", Pl); + Vl.endNonterminal("CompatibilityAnnotation", Pl)); } function B() { - Vl.startNonterminal("Annotation", Pl), + (Vl.startNonterminal("Annotation", Pl), Sl(32), kl(254), Nl(), Ha(), - kl(171); + kl(171)); if (Hl == 34) { - Sl(34), kl(154), Nl(), oi(); + (Sl(34), kl(154), Nl(), oi()); for (;;) { kl(101); if (Hl != 41) break; - Sl(41), kl(154), Nl(), oi(); + (Sl(41), kl(154), Nl(), oi()); } Sl(37); } Vl.endNonterminal("Annotation", Pl); } function j() { - xl(32), kl(254), Ba(), kl(171); + (xl(32), kl(254), Ba(), kl(171)); if (Hl == 34) { - xl(34), kl(154), ui(); + (xl(34), kl(154), ui()); for (;;) { kl(101); if (Hl != 41) break; - xl(41), kl(154), ui(); + (xl(41), kl(154), ui()); } xl(37); } } function F() { - Vl.startNonterminal("VarDecl", Pl), + (Vl.startNonterminal("VarDecl", Pl), Sl(262), kl(21), Sl(31), @@ -44454,28 +44495,30 @@ hi(), kl(147), Hl == 79 && (Nl(), ds()), - kl(106); + kl(106)); switch (Hl) { case 52: - Sl(52), kl(266), Nl(), I(); + (Sl(52), kl(266), Nl(), I()); break; default: - Sl(133), kl(104), Hl == 52 && (Sl(52), kl(266), Nl(), q()); + (Sl(133), + kl(104), + Hl == 52 && (Sl(52), kl(266), Nl(), q())); } Vl.endNonterminal("VarDecl", Pl); } function I() { - Vl.startNonterminal("VarValue", Pl), + (Vl.startNonterminal("VarValue", Pl), _f(), - Vl.endNonterminal("VarValue", Pl); + Vl.endNonterminal("VarValue", Pl)); } function q() { - Vl.startNonterminal("VarDefaultValue", Pl), + (Vl.startNonterminal("VarDefaultValue", Pl), _f(), - Vl.endNonterminal("VarDefaultValue", Pl); + Vl.endNonterminal("VarDefaultValue", Pl)); } function R() { - Vl.startNonterminal("ContextItemDecl", Pl), + (Vl.startNonterminal("ContextItemDecl", Pl), Sl(108), kl(43), Sl(101), @@ -44483,22 +44526,24 @@ Sl(165), kl(147), Hl == 79 && (Sl(79), kl(259), Nl(), ws()), - kl(106); + kl(106)); switch (Hl) { case 52: - Sl(52), kl(266), Nl(), I(); + (Sl(52), kl(266), Nl(), I()); break; default: - Sl(133), kl(104), Hl == 52 && (Sl(52), kl(266), Nl(), q()); + (Sl(133), + kl(104), + Hl == 52 && (Sl(52), kl(266), Nl(), q())); } Vl.endNonterminal("ContextItemDecl", Pl); } function U() { - Vl.startNonterminal("ParamList", Pl), W(); + (Vl.startNonterminal("ParamList", Pl), W()); for (;;) { kl(101); if (Hl != 41) break; - Sl(41), kl(21), Nl(), W(); + (Sl(41), kl(21), Nl(), W()); } Vl.endNonterminal("ParamList", Pl); } @@ -44507,44 +44552,44 @@ for (;;) { kl(101); if (Hl != 41) break; - xl(41), kl(21), X(); + (xl(41), kl(21), X()); } } function W() { - Vl.startNonterminal("Param", Pl), + (Vl.startNonterminal("Param", Pl), Sl(31), kl(254), Nl(), Ha(), kl(143), Hl == 79 && (Nl(), ds()), - Vl.endNonterminal("Param", Pl); + Vl.endNonterminal("Param", Pl)); } function X() { - xl(31), kl(254), Ba(), kl(143), Hl == 79 && vs(); + (xl(31), kl(254), Ba(), kl(143), Hl == 79 && vs()); } function V() { - Vl.startNonterminal("FunctionBody", Pl), + (Vl.startNonterminal("FunctionBody", Pl), J(), - Vl.endNonterminal("FunctionBody", Pl); + Vl.endNonterminal("FunctionBody", Pl)); } function $() { K(); } function J() { - Vl.startNonterminal("EnclosedExpr", Pl), + (Vl.startNonterminal("EnclosedExpr", Pl), Sl(276), kl(266), Nl(), G(), Sl(282), - Vl.endNonterminal("EnclosedExpr", Pl); + Vl.endNonterminal("EnclosedExpr", Pl)); } function K() { - xl(276), kl(266), Y(), xl(282); + (xl(276), kl(266), Y(), xl(282)); } function Q() { - Vl.startNonterminal("OptionDecl", Pl), + (Vl.startNonterminal("OptionDecl", Pl), Sl(108), kl(66), Sl(199), @@ -44553,13 +44598,13 @@ Ha(), kl(17), Sl(11), - Vl.endNonterminal("OptionDecl", Pl); + Vl.endNonterminal("OptionDecl", Pl)); } function G() { - Vl.startNonterminal("Expr", Pl), _f(); + (Vl.startNonterminal("Expr", Pl), _f()); for (;;) { if (Hl != 41) break; - Sl(41), kl(266), Nl(), _f(); + (Sl(41), kl(266), Nl(), _f()); } Vl.endNonterminal("Expr", Pl); } @@ -44567,17 +44612,17 @@ Df(); for (;;) { if (Hl != 41) break; - xl(41), kl(266), Df(); + (xl(41), kl(266), Df()); } } function Z() { - Vl.startNonterminal("FLWORExpr", Pl), tt(); + (Vl.startNonterminal("FLWORExpr", Pl), tt()); for (;;) { kl(173); if (Hl == 220) break; - Nl(), rt(); + (Nl(), rt()); } - Nl(), rn(), Vl.endNonterminal("FLWORExpr", Pl); + (Nl(), rn(), Vl.endNonterminal("FLWORExpr", Pl)); } function et() { nt(); @@ -44669,22 +44714,22 @@ } } function st() { - Vl.startNonterminal("ForClause", Pl), Sl(137), kl(21), Nl(), ut(); + (Vl.startNonterminal("ForClause", Pl), Sl(137), kl(21), Nl(), ut()); for (;;) { if (Hl != 41) break; - Sl(41), kl(21), Nl(), ut(); + (Sl(41), kl(21), Nl(), ut()); } Vl.endNonterminal("ForClause", Pl); } function ot() { - xl(137), kl(21), at(); + (xl(137), kl(21), at()); for (;;) { if (Hl != 41) break; - xl(41), kl(21), at(); + (xl(41), kl(21), at()); } } function ut() { - Vl.startNonterminal("ForBinding", Pl), + (Vl.startNonterminal("ForBinding", Pl), Sl(31), kl(254), Nl(), @@ -44702,10 +44747,10 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("ForBinding", Pl); + Vl.endNonterminal("ForBinding", Pl)); } function at() { - xl(31), + (xl(31), kl(254), pi(), kl(164), @@ -44719,103 +44764,103 @@ kl(53), xl(154), kl(266), - Df(); + Df()); } function ft() { - Vl.startNonterminal("AllowingEmpty", Pl), + (Vl.startNonterminal("AllowingEmpty", Pl), Sl(72), kl(49), Sl(123), - Vl.endNonterminal("AllowingEmpty", Pl); + Vl.endNonterminal("AllowingEmpty", Pl)); } function lt() { - xl(72), kl(49), xl(123); + (xl(72), kl(49), xl(123)); } function ct() { - Vl.startNonterminal("PositionalVar", Pl), + (Vl.startNonterminal("PositionalVar", Pl), Sl(81), kl(21), Sl(31), kl(254), Nl(), hi(), - Vl.endNonterminal("PositionalVar", Pl); + Vl.endNonterminal("PositionalVar", Pl)); } function ht() { - xl(81), kl(21), xl(31), kl(254), pi(); + (xl(81), kl(21), xl(31), kl(254), pi()); } function pt() { - Vl.startNonterminal("FTScoreVar", Pl), + (Vl.startNonterminal("FTScoreVar", Pl), Sl(228), kl(21), Sl(31), kl(254), Nl(), hi(), - Vl.endNonterminal("FTScoreVar", Pl); + Vl.endNonterminal("FTScoreVar", Pl)); } function dt() { - xl(228), kl(21), xl(31), kl(254), pi(); + (xl(228), kl(21), xl(31), kl(254), pi()); } function vt() { - Vl.startNonterminal("LetClause", Pl), Sl(174), kl(96), Nl(), gt(); + (Vl.startNonterminal("LetClause", Pl), Sl(174), kl(96), Nl(), gt()); for (;;) { if (Hl != 41) break; - Sl(41), kl(96), Nl(), gt(); + (Sl(41), kl(96), Nl(), gt()); } Vl.endNonterminal("LetClause", Pl); } function mt() { - xl(174), kl(96), yt(); + (xl(174), kl(96), yt()); for (;;) { if (Hl != 41) break; - xl(41), kl(96), yt(); + (xl(41), kl(96), yt()); } } function gt() { Vl.startNonterminal("LetBinding", Pl); switch (Hl) { case 31: - Sl(31), + (Sl(31), kl(254), Nl(), hi(), kl(105), - Hl == 79 && (Nl(), ds()); + Hl == 79 && (Nl(), ds())); break; default: pt(); } - kl(27), + (kl(27), Sl(52), kl(266), Nl(), _f(), - Vl.endNonterminal("LetBinding", Pl); + Vl.endNonterminal("LetBinding", Pl)); } function yt() { switch (Hl) { case 31: - xl(31), kl(254), pi(), kl(105), Hl == 79 && vs(); + (xl(31), kl(254), pi(), kl(105), Hl == 79 && vs()); break; default: dt(); } - kl(27), xl(52), kl(266), Df(); + (kl(27), xl(52), kl(266), Df()); } function bt() { - Vl.startNonterminal("WindowClause", Pl), Sl(137), kl(135); + (Vl.startNonterminal("WindowClause", Pl), Sl(137), kl(135)); switch (Hl) { case 251: - Nl(), Et(); + (Nl(), Et()); break; default: - Nl(), xt(); + (Nl(), xt()); } Vl.endNonterminal("WindowClause", Pl); } function wt() { - xl(137), kl(135); + (xl(137), kl(135)); switch (Hl) { case 251: St(); @@ -44825,7 +44870,7 @@ } } function Et() { - Vl.startNonterminal("TumblingWindowClause", Pl), + (Vl.startNonterminal("TumblingWindowClause", Pl), Sl(251), kl(85), Sl(269), @@ -44842,12 +44887,12 @@ Nl(), _f(), Nl(), - Nt(); - if (Hl == 126 || Hl == 198) Nl(), kt(); + Nt()); + if (Hl == 126 || Hl == 198) (Nl(), kt()); Vl.endNonterminal("TumblingWindowClause", Pl); } function St() { - xl(251), + (xl(251), kl(85), xl(269), kl(21), @@ -44861,10 +44906,10 @@ kl(266), Df(), Ct(), - (Hl == 126 || Hl == 198) && Lt(); + (Hl == 126 || Hl == 198) && Lt()); } function xt() { - Vl.startNonterminal("SlidingWindowClause", Pl), + (Vl.startNonterminal("SlidingWindowClause", Pl), Sl(234), kl(85), Sl(269), @@ -44884,10 +44929,10 @@ Nt(), Nl(), kt(), - Vl.endNonterminal("SlidingWindowClause", Pl); + Vl.endNonterminal("SlidingWindowClause", Pl)); } function Tt() { - xl(234), + (xl(234), kl(85), xl(269), kl(21), @@ -44901,10 +44946,10 @@ kl(266), Df(), Ct(), - Lt(); + Lt()); } function Nt() { - Vl.startNonterminal("WindowStartCondition", Pl), + (Vl.startNonterminal("WindowStartCondition", Pl), Sl(237), kl(163), Nl(), @@ -44914,13 +44959,13 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("WindowStartCondition", Pl); + Vl.endNonterminal("WindowStartCondition", Pl)); } function Ct() { - xl(237), kl(163), Ot(), kl(83), xl(265), kl(266), Df(); + (xl(237), kl(163), Ot(), kl(83), xl(265), kl(266), Df()); } function kt() { - Vl.startNonterminal("WindowEndCondition", Pl), + (Vl.startNonterminal("WindowEndCondition", Pl), Hl == 198 && Sl(198), kl(50), Sl(126), @@ -44932,10 +44977,10 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("WindowEndCondition", Pl); + Vl.endNonterminal("WindowEndCondition", Pl)); } function Lt() { - Hl == 198 && xl(198), + (Hl == 198 && xl(198), kl(50), xl(126), kl(163), @@ -44943,10 +44988,10 @@ kl(83), xl(265), kl(266), - Df(); + Df()); } function At() { - Vl.startNonterminal("WindowVars", Pl), + (Vl.startNonterminal("WindowVars", Pl), Hl == 31 && (Sl(31), kl(254), Nl(), Mt()), kl(159), Hl == 81 && (Nl(), ct()), @@ -44954,84 +44999,84 @@ Hl == 215 && (Sl(215), kl(21), Sl(31), kl(254), Nl(), Dt()), kl(127), Hl == 187 && (Sl(187), kl(21), Sl(31), kl(254), Nl(), Ht()), - Vl.endNonterminal("WindowVars", Pl); + Vl.endNonterminal("WindowVars", Pl)); } function Ot() { - Hl == 31 && (xl(31), kl(254), _t()), + (Hl == 31 && (xl(31), kl(254), _t()), kl(159), Hl == 81 && ht(), kl(153), Hl == 215 && (xl(215), kl(21), xl(31), kl(254), Pt()), kl(127), - Hl == 187 && (xl(187), kl(21), xl(31), kl(254), Bt()); + Hl == 187 && (xl(187), kl(21), xl(31), kl(254), Bt())); } function Mt() { - Vl.startNonterminal("CurrentItem", Pl), + (Vl.startNonterminal("CurrentItem", Pl), Ha(), - Vl.endNonterminal("CurrentItem", Pl); + Vl.endNonterminal("CurrentItem", Pl)); } function _t() { Ba(); } function Dt() { - Vl.startNonterminal("PreviousItem", Pl), + (Vl.startNonterminal("PreviousItem", Pl), Ha(), - Vl.endNonterminal("PreviousItem", Pl); + Vl.endNonterminal("PreviousItem", Pl)); } function Pt() { Ba(); } function Ht() { - Vl.startNonterminal("NextItem", Pl), + (Vl.startNonterminal("NextItem", Pl), Ha(), - Vl.endNonterminal("NextItem", Pl); + Vl.endNonterminal("NextItem", Pl)); } function Bt() { Ba(); } function jt() { - Vl.startNonterminal("CountClause", Pl), + (Vl.startNonterminal("CountClause", Pl), Sl(105), kl(21), Sl(31), kl(254), Nl(), hi(), - Vl.endNonterminal("CountClause", Pl); + Vl.endNonterminal("CountClause", Pl)); } function Ft() { - xl(105), kl(21), xl(31), kl(254), pi(); + (xl(105), kl(21), xl(31), kl(254), pi()); } function It() { - Vl.startNonterminal("WhereClause", Pl), + (Vl.startNonterminal("WhereClause", Pl), Sl(266), kl(266), Nl(), _f(), - Vl.endNonterminal("WhereClause", Pl); + Vl.endNonterminal("WhereClause", Pl)); } function qt() { - xl(266), kl(266), Df(); + (xl(266), kl(266), Df()); } function Rt() { - Vl.startNonterminal("GroupByClause", Pl), + (Vl.startNonterminal("GroupByClause", Pl), Sl(148), kl(34), Sl(87), kl(266), Nl(), zt(), - Vl.endNonterminal("GroupByClause", Pl); + Vl.endNonterminal("GroupByClause", Pl)); } function Ut() { - xl(148), kl(34), xl(87), kl(266), Wt(); + (xl(148), kl(34), xl(87), kl(266), Wt()); } function zt() { - Vl.startNonterminal("GroupingSpecList", Pl), Xt(); + (Vl.startNonterminal("GroupingSpecList", Pl), Xt()); for (;;) { kl(176); if (Hl != 41) break; - Sl(41), kl(266), Nl(), Xt(); + (Sl(41), kl(266), Nl(), Xt()); } Vl.endNonterminal("GroupingSpecList", Pl); } @@ -45040,7 +45085,7 @@ for (;;) { kl(176); if (Hl != 41) break; - xl(41), kl(266), Vt(); + (xl(41), kl(266), Vt()); } } function Xt() { @@ -45200,14 +45245,14 @@ o = Il, u = ql; try { - Jt(), kl(182); + (Jt(), kl(182)); if (Hl == 52 || Hl == 79) - Hl == 79 && vs(), kl(27), xl(52), kl(266), Df(); - Hl == 94 && (xl(94), kl(15), xl(7)), (_l = -1); + (Hl == 79 && vs(), kl(27), xl(52), kl(266), Df()); + (Hl == 94 && (xl(94), kl(15), xl(7)), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -45218,19 +45263,19 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(2, Pl, _l); + Jl(2, Pl, _l)); } } switch (_l) { case -1: - $t(), kl(182); + ($t(), kl(182)); if (Hl == 52 || Hl == 79) - Hl == 79 && (Nl(), ds()), + (Hl == 79 && (Nl(), ds()), kl(27), Sl(52), kl(266), Nl(), - _f(); + _f()); Hl == 94 && (Sl(94), kl(15), Sl(7)); break; default: @@ -45394,14 +45439,14 @@ o = Il, u = ql; try { - Jt(), kl(182); + (Jt(), kl(182)); if (Hl == 52 || Hl == 79) - Hl == 79 && vs(), kl(27), xl(52), kl(266), Df(); - Hl == 94 && (xl(94), kl(15), xl(7)), + (Hl == 79 && vs(), kl(27), xl(52), kl(266), Df()); + (Hl == 94 && (xl(94), kl(15), xl(7)), Jl(2, t, -1), - (_l = -3); + (_l = -3)); } catch (a) { - (_l = -2), + ((_l = -2), (Dl = e), (Pl = t), (Hl = n), @@ -45413,15 +45458,15 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(2, t, -2); + Jl(2, t, -2)); } } } switch (_l) { case -1: - Jt(), kl(182); + (Jt(), kl(182)); if (Hl == 52 || Hl == 79) - Hl == 79 && vs(), kl(27), xl(52), kl(266), Df(); + (Hl == 79 && vs(), kl(27), xl(52), kl(266), Df()); Hl == 94 && (xl(94), kl(15), xl(7)); break; case -3: @@ -45431,43 +45476,43 @@ } } function $t() { - Vl.startNonterminal("GroupingVariable", Pl), + (Vl.startNonterminal("GroupingVariable", Pl), Sl(31), kl(254), Nl(), hi(), - Vl.endNonterminal("GroupingVariable", Pl); + Vl.endNonterminal("GroupingVariable", Pl)); } function Jt() { - xl(31), kl(254), pi(); + (xl(31), kl(254), pi()); } function Kt() { Vl.startNonterminal("OrderByClause", Pl); switch (Hl) { case 201: - Sl(201), kl(34), Sl(87); + (Sl(201), kl(34), Sl(87)); break; default: - Sl(236), kl(67), Sl(201), kl(34), Sl(87); + (Sl(236), kl(67), Sl(201), kl(34), Sl(87)); } - kl(266), Nl(), Gt(), Vl.endNonterminal("OrderByClause", Pl); + (kl(266), Nl(), Gt(), Vl.endNonterminal("OrderByClause", Pl)); } function Qt() { switch (Hl) { case 201: - xl(201), kl(34), xl(87); + (xl(201), kl(34), xl(87)); break; default: - xl(236), kl(67), xl(201), kl(34), xl(87); + (xl(236), kl(67), xl(201), kl(34), xl(87)); } - kl(266), Yt(); + (kl(266), Yt()); } function Gt() { - Vl.startNonterminal("OrderSpecList", Pl), Zt(); + (Vl.startNonterminal("OrderSpecList", Pl), Zt()); for (;;) { kl(176); if (Hl != 41) break; - Sl(41), kl(266), Nl(), Zt(); + (Sl(41), kl(266), Nl(), Zt()); } Vl.endNonterminal("OrderSpecList", Pl); } @@ -45476,18 +45521,18 @@ for (;;) { kl(176); if (Hl != 41) break; - xl(41), kl(266), en(); + (xl(41), kl(266), en()); } } function Zt() { - Vl.startNonterminal("OrderSpec", Pl), + (Vl.startNonterminal("OrderSpec", Pl), _f(), Nl(), tn(), - Vl.endNonterminal("OrderSpec", Pl); + Vl.endNonterminal("OrderSpec", Pl)); } function en() { - Df(), nn(); + (Df(), nn()); } function tn() { Vl.startNonterminal("OrderModifier", Pl); @@ -45501,7 +45546,7 @@ } kl(179); if (Hl == 123) { - Sl(123), kl(121); + (Sl(123), kl(121)); switch (Hl) { case 147: Sl(147); @@ -45510,9 +45555,9 @@ Sl(173); } } - kl(177), + (kl(177), Hl == 94 && (Sl(94), kl(15), Sl(7)), - Vl.endNonterminal("OrderModifier", Pl); + Vl.endNonterminal("OrderModifier", Pl)); } function nn() { if (Hl == 80 || Hl == 113) @@ -45525,7 +45570,7 @@ } kl(179); if (Hl == 123) { - xl(123), kl(121); + (xl(123), kl(121)); switch (Hl) { case 147: xl(147); @@ -45534,18 +45579,18 @@ xl(173); } } - kl(177), Hl == 94 && (xl(94), kl(15), xl(7)); + (kl(177), Hl == 94 && (xl(94), kl(15), xl(7))); } function rn() { - Vl.startNonterminal("ReturnClause", Pl), + (Vl.startNonterminal("ReturnClause", Pl), Sl(220), kl(266), Nl(), _f(), - Vl.endNonterminal("ReturnClause", Pl); + Vl.endNonterminal("ReturnClause", Pl)); } function sn() { - xl(220), kl(266), Df(); + (xl(220), kl(266), Df()); } function on() { Vl.startNonterminal("QuantifiedExpr", Pl); @@ -45556,16 +45601,16 @@ default: Sl(129); } - kl(21), Nl(), an(); + (kl(21), Nl(), an()); for (;;) { if (Hl != 41) break; - Sl(41), kl(21), Nl(), an(); + (Sl(41), kl(21), Nl(), an()); } - Sl(224), + (Sl(224), kl(266), Nl(), _f(), - Vl.endNonterminal("QuantifiedExpr", Pl); + Vl.endNonterminal("QuantifiedExpr", Pl)); } function un() { switch (Hl) { @@ -45575,15 +45620,15 @@ default: xl(129); } - kl(21), fn(); + (kl(21), fn()); for (;;) { if (Hl != 41) break; - xl(41), kl(21), fn(); + (xl(41), kl(21), fn()); } - xl(224), kl(266), Df(); + (xl(224), kl(266), Df()); } function an() { - Vl.startNonterminal("QuantifiedVarDecl", Pl), + (Vl.startNonterminal("QuantifiedVarDecl", Pl), Sl(31), kl(254), Nl(), @@ -45595,10 +45640,10 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("QuantifiedVarDecl", Pl); + Vl.endNonterminal("QuantifiedVarDecl", Pl)); } function fn() { - xl(31), + (xl(31), kl(254), pi(), kl(110), @@ -45606,78 +45651,78 @@ kl(53), xl(154), kl(266), - Df(); + Df()); } function ln() { - Vl.startNonterminal("SwitchExpr", Pl), + (Vl.startNonterminal("SwitchExpr", Pl), Sl(243), kl(22), Sl(34), kl(266), Nl(), G(), - Sl(37); + Sl(37)); for (;;) { - kl(35), Nl(), hn(); + (kl(35), Nl(), hn()); if (Hl != 88) break; } - Sl(109), + (Sl(109), kl(70), Sl(220), kl(266), Nl(), _f(), - Vl.endNonterminal("SwitchExpr", Pl); + Vl.endNonterminal("SwitchExpr", Pl)); } function cn() { - xl(243), kl(22), xl(34), kl(266), Y(), xl(37); + (xl(243), kl(22), xl(34), kl(266), Y(), xl(37)); for (;;) { - kl(35), pn(); + (kl(35), pn()); if (Hl != 88) break; } - xl(109), kl(70), xl(220), kl(266), Df(); + (xl(109), kl(70), xl(220), kl(266), Df()); } function hn() { Vl.startNonterminal("SwitchCaseClause", Pl); for (;;) { - Sl(88), kl(266), Nl(), dn(); + (Sl(88), kl(266), Nl(), dn()); if (Hl != 88) break; } - Sl(220), + (Sl(220), kl(266), Nl(), _f(), - Vl.endNonterminal("SwitchCaseClause", Pl); + Vl.endNonterminal("SwitchCaseClause", Pl)); } function pn() { for (;;) { - xl(88), kl(266), vn(); + (xl(88), kl(266), vn()); if (Hl != 88) break; } - xl(220), kl(266), Df(); + (xl(220), kl(266), Df()); } function dn() { - Vl.startNonterminal("SwitchCaseOperand", Pl), + (Vl.startNonterminal("SwitchCaseOperand", Pl), _f(), - Vl.endNonterminal("SwitchCaseOperand", Pl); + Vl.endNonterminal("SwitchCaseOperand", Pl)); } function vn() { Df(); } function mn() { - Vl.startNonterminal("TypeswitchExpr", Pl), + (Vl.startNonterminal("TypeswitchExpr", Pl), Sl(253), kl(22), Sl(34), kl(266), Nl(), G(), - Sl(37); + Sl(37)); for (;;) { - kl(35), Nl(), yn(); + (kl(35), Nl(), yn()); if (Hl != 88) break; } - Sl(109), + (Sl(109), kl(95), Hl == 31 && (Sl(31), kl(254), Nl(), hi()), kl(70), @@ -45685,24 +45730,24 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("TypeswitchExpr", Pl); + Vl.endNonterminal("TypeswitchExpr", Pl)); } function gn() { - xl(253), kl(22), xl(34), kl(266), Y(), xl(37); + (xl(253), kl(22), xl(34), kl(266), Y(), xl(37)); for (;;) { - kl(35), bn(); + (kl(35), bn()); if (Hl != 88) break; } - xl(109), + (xl(109), kl(95), Hl == 31 && (xl(31), kl(254), pi()), kl(70), xl(220), kl(266), - Df(); + Df()); } function yn() { - Vl.startNonterminal("CaseClause", Pl), + (Vl.startNonterminal("CaseClause", Pl), Sl(88), kl(261), Hl == 31 && (Sl(31), kl(254), Nl(), hi(), kl(30), Sl(79)), @@ -45713,24 +45758,24 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("CaseClause", Pl); + Vl.endNonterminal("CaseClause", Pl)); } function bn() { - xl(88), + (xl(88), kl(261), Hl == 31 && (xl(31), kl(254), pi(), kl(30), xl(79)), kl(259), En(), xl(220), kl(266), - Df(); + Df()); } function wn() { - Vl.startNonterminal("SequenceTypeUnion", Pl), ms(); + (Vl.startNonterminal("SequenceTypeUnion", Pl), ms()); for (;;) { kl(134); if (Hl != 279) break; - Sl(279), kl(259), Nl(), ms(); + (Sl(279), kl(259), Nl(), ms()); } Vl.endNonterminal("SequenceTypeUnion", Pl); } @@ -45739,11 +45784,11 @@ for (;;) { kl(134); if (Hl != 279) break; - xl(279), kl(259), gs(); + (xl(279), kl(259), gs()); } } function Sn() { - Vl.startNonterminal("IfExpr", Pl), + (Vl.startNonterminal("IfExpr", Pl), Sl(152), kl(22), Sl(34), @@ -45760,10 +45805,10 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("IfExpr", Pl); + Vl.endNonterminal("IfExpr", Pl)); } function xn() { - xl(152), + (xl(152), kl(22), xl(34), kl(266), @@ -45775,12 +45820,12 @@ Df(), xl(122), kl(266), - Df(); + Df()); } function Tn() { - Vl.startNonterminal("TryCatchExpr", Pl), Cn(); + (Vl.startNonterminal("TryCatchExpr", Pl), Cn()); for (;;) { - kl(36), Nl(), On(), kl(183); + (kl(36), Nl(), On(), kl(183)); if (Hl != 91) break; } Vl.endNonterminal("TryCatchExpr", Pl); @@ -45788,12 +45833,12 @@ function Nn() { kn(); for (;;) { - kl(36), Mn(), kl(183); + (kl(36), Mn(), kl(183)); if (Hl != 91) break; } } function Cn() { - Vl.startNonterminal("TryClause", Pl), + (Vl.startNonterminal("TryClause", Pl), Sl(250), kl(87), Sl(276), @@ -45801,21 +45846,21 @@ Nl(), Ln(), Sl(282), - Vl.endNonterminal("TryClause", Pl); + Vl.endNonterminal("TryClause", Pl)); } function kn() { - xl(250), kl(87), xl(276), kl(266), An(), xl(282); + (xl(250), kl(87), xl(276), kl(266), An(), xl(282)); } function Ln() { - Vl.startNonterminal("TryTargetExpr", Pl), + (Vl.startNonterminal("TryTargetExpr", Pl), G(), - Vl.endNonterminal("TryTargetExpr", Pl); + Vl.endNonterminal("TryTargetExpr", Pl)); } function An() { Y(); } function On() { - Vl.startNonterminal("CatchClause", Pl), + (Vl.startNonterminal("CatchClause", Pl), Sl(91), kl(256), Nl(), @@ -45825,17 +45870,17 @@ Nl(), G(), Sl(282), - Vl.endNonterminal("CatchClause", Pl); + Vl.endNonterminal("CatchClause", Pl)); } function Mn() { - xl(91), kl(256), Dn(), xl(276), kl(266), Y(), xl(282); + (xl(91), kl(256), Dn(), xl(276), kl(266), Y(), xl(282)); } function _n() { - Vl.startNonterminal("CatchErrorList", Pl), Qr(); + (Vl.startNonterminal("CatchErrorList", Pl), Qr()); for (;;) { kl(136); if (Hl != 279) break; - Sl(279), kl(256), Nl(), Qr(); + (Sl(279), kl(256), Nl(), Qr()); } Vl.endNonterminal("CatchErrorList", Pl); } @@ -45844,14 +45889,14 @@ for (;;) { kl(136); if (Hl != 279) break; - xl(279), kl(256), Gr(); + (xl(279), kl(256), Gr()); } } function Pn() { - Vl.startNonterminal("OrExpr", Pl), Bn(); + (Vl.startNonterminal("OrExpr", Pl), Bn()); for (;;) { if (Hl != 200) break; - Sl(200), kl(266), Nl(), Bn(); + (Sl(200), kl(266), Nl(), Bn()); } Vl.endNonterminal("OrExpr", Pl); } @@ -45859,14 +45904,14 @@ jn(); for (;;) { if (Hl != 200) break; - xl(200), kl(266), jn(); + (xl(200), kl(266), jn()); } } function Bn() { - Vl.startNonterminal("AndExpr", Pl), Fn(); + (Vl.startNonterminal("AndExpr", Pl), Fn()); for (;;) { if (Hl != 75) break; - Sl(75), kl(266), Nl(), Fn(); + (Sl(75), kl(266), Nl(), Fn()); } Vl.endNonterminal("AndExpr", Pl); } @@ -45874,11 +45919,11 @@ In(); for (;;) { if (Hl != 75) break; - xl(75), kl(266), In(); + (xl(75), kl(266), In()); } } function Fn() { - Vl.startNonterminal("ComparisonExpr", Pl), qn(); + (Vl.startNonterminal("ComparisonExpr", Pl), qn()); if ( Hl == 27 || Hl == 54 || @@ -45903,17 +45948,17 @@ case 172: case 178: case 186: - Nl(), mr(); + (Nl(), mr()); break; case 57: case 63: case 164: - Nl(), yr(); + (Nl(), yr()); break; default: - Nl(), dr(); + (Nl(), dr()); } - kl(266), Nl(), qn(); + (kl(266), Nl(), qn()); } Vl.endNonterminal("ComparisonExpr", Pl); } @@ -45953,11 +45998,11 @@ default: vr(); } - kl(266), Rn(); + (kl(266), Rn()); } } function qn() { - Vl.startNonterminal("FTContainsExpr", Pl), + (Vl.startNonterminal("FTContainsExpr", Pl), Un(), Hl == 99 && (Sl(99), @@ -45967,18 +46012,23 @@ Nl(), Jo(), Hl == 271 && (Nl(), ha())), - Vl.endNonterminal("FTContainsExpr", Pl); + Vl.endNonterminal("FTContainsExpr", Pl)); } function Rn() { - zn(), + (zn(), Hl == 99 && - (xl(99), kl(76), xl(244), kl(162), Ko(), Hl == 271 && pa()); + (xl(99), + kl(76), + xl(244), + kl(162), + Ko(), + Hl == 271 && pa())); } function Un() { - Vl.startNonterminal("StringConcatExpr", Pl), Wn(); + (Vl.startNonterminal("StringConcatExpr", Pl), Wn()); for (;;) { if (Hl != 280) break; - Sl(280), kl(266), Nl(), Wn(); + (Sl(280), kl(266), Nl(), Wn()); } Vl.endNonterminal("StringConcatExpr", Pl); } @@ -45986,20 +46036,20 @@ Xn(); for (;;) { if (Hl != 280) break; - xl(280), kl(266), Xn(); + (xl(280), kl(266), Xn()); } } function Wn() { - Vl.startNonterminal("RangeExpr", Pl), + (Vl.startNonterminal("RangeExpr", Pl), Vn(), Hl == 248 && (Sl(248), kl(266), Nl(), Vn()), - Vl.endNonterminal("RangeExpr", Pl); + Vl.endNonterminal("RangeExpr", Pl)); } function Xn() { - $n(), Hl == 248 && (xl(248), kl(266), $n()); + ($n(), Hl == 248 && (xl(248), kl(266), $n())); } function Vn() { - Vl.startNonterminal("AdditiveExpr", Pl), Jn(); + (Vl.startNonterminal("AdditiveExpr", Pl), Jn()); for (;;) { if (Hl != 40 && Hl != 42) break; switch (Hl) { @@ -46009,7 +46059,7 @@ default: Sl(42); } - kl(266), Nl(), Jn(); + (kl(266), Nl(), Jn()); } Vl.endNonterminal("AdditiveExpr", Pl); } @@ -46024,11 +46074,11 @@ default: xl(42); } - kl(266), Kn(); + (kl(266), Kn()); } } function Jn() { - Vl.startNonterminal("MultiplicativeExpr", Pl), Qn(); + (Vl.startNonterminal("MultiplicativeExpr", Pl), Qn()); for (;;) { if (Hl != 38 && Hl != 118 && Hl != 151 && Hl != 180) break; switch (Hl) { @@ -46044,7 +46094,7 @@ default: Sl(180); } - kl(266), Nl(), Qn(); + (kl(266), Nl(), Qn()); } Vl.endNonterminal("MultiplicativeExpr", Pl); } @@ -46065,11 +46115,11 @@ default: xl(180); } - kl(266), Gn(); + (kl(266), Gn()); } } function Qn() { - Vl.startNonterminal("UnionExpr", Pl), Yn(); + (Vl.startNonterminal("UnionExpr", Pl), Yn()); for (;;) { if (Hl != 254 && Hl != 279) break; switch (Hl) { @@ -46079,7 +46129,7 @@ default: Sl(279); } - kl(266), Nl(), Yn(); + (kl(266), Nl(), Yn()); } Vl.endNonterminal("UnionExpr", Pl); } @@ -46094,11 +46144,11 @@ default: xl(279); } - kl(266), Zn(); + (kl(266), Zn()); } } function Yn() { - Vl.startNonterminal("IntersectExceptExpr", Pl), er(); + (Vl.startNonterminal("IntersectExceptExpr", Pl), er()); for (;;) { kl(222); if (Hl != 131 && Hl != 162) break; @@ -46109,7 +46159,7 @@ default: Sl(131); } - kl(266), Nl(), er(); + (kl(266), Nl(), er()); } Vl.endNonterminal("IntersectExceptExpr", Pl); } @@ -46125,52 +46175,56 @@ default: xl(131); } - kl(266), tr(); + (kl(266), tr()); } } function er() { - Vl.startNonterminal("InstanceofExpr", Pl), + (Vl.startNonterminal("InstanceofExpr", Pl), nr(), kl(223), Hl == 160 && (Sl(160), kl(64), Sl(196), kl(259), Nl(), ms()), - Vl.endNonterminal("InstanceofExpr", Pl); + Vl.endNonterminal("InstanceofExpr", Pl)); } function tr() { - rr(), + (rr(), kl(223), - Hl == 160 && (xl(160), kl(64), xl(196), kl(259), gs()); + Hl == 160 && (xl(160), kl(64), xl(196), kl(259), gs())); } function nr() { - Vl.startNonterminal("TreatExpr", Pl), + (Vl.startNonterminal("TreatExpr", Pl), ir(), kl(224), Hl == 249 && (Sl(249), kl(30), Sl(79), kl(259), Nl(), ms()), - Vl.endNonterminal("TreatExpr", Pl); + Vl.endNonterminal("TreatExpr", Pl)); } function rr() { - sr(), + (sr(), kl(224), - Hl == 249 && (xl(249), kl(30), xl(79), kl(259), gs()); + Hl == 249 && (xl(249), kl(30), xl(79), kl(259), gs())); } function ir() { - Vl.startNonterminal("CastableExpr", Pl), + (Vl.startNonterminal("CastableExpr", Pl), or(), kl(225), Hl == 90 && (Sl(90), kl(30), Sl(79), kl(254), Nl(), hs()), - Vl.endNonterminal("CastableExpr", Pl); + Vl.endNonterminal("CastableExpr", Pl)); } function sr() { - ur(), kl(225), Hl == 90 && (xl(90), kl(30), xl(79), kl(254), ps()); + (ur(), + kl(225), + Hl == 90 && (xl(90), kl(30), xl(79), kl(254), ps())); } function or() { - Vl.startNonterminal("CastExpr", Pl), + (Vl.startNonterminal("CastExpr", Pl), ar(), kl(227), Hl == 89 && (Sl(89), kl(30), Sl(79), kl(254), Nl(), hs()), - Vl.endNonterminal("CastExpr", Pl); + Vl.endNonterminal("CastExpr", Pl)); } function ur() { - fr(), kl(227), Hl == 89 && (xl(89), kl(30), xl(79), kl(254), ps()); + (fr(), + kl(227), + Hl == 89 && (xl(89), kl(30), xl(79), kl(254), ps())); } function ar() { Vl.startNonterminal("UnaryExpr", Pl); @@ -46185,7 +46239,7 @@ Sl(40); } } - Nl(), lr(), Vl.endNonterminal("UnaryExpr", Pl); + (Nl(), lr(), Vl.endNonterminal("UnaryExpr", Pl)); } function fr() { for (;;) { @@ -46248,10 +46302,10 @@ } } function hr() { - Vl.startNonterminal("SimpleMapExpr", Pl), Lr(); + (Vl.startNonterminal("SimpleMapExpr", Pl), Lr()); for (;;) { if (Hl != 26) break; - Sl(26), kl(265), Nl(), Lr(); + (Sl(26), kl(265), Nl(), Lr()); } Vl.endNonterminal("SimpleMapExpr", Pl); } @@ -46259,7 +46313,7 @@ Ar(); for (;;) { if (Hl != 26) break; - xl(26), kl(265), Ar(); + (xl(26), kl(265), Ar()); } } function dr() { @@ -46377,34 +46431,34 @@ } } function wr() { - Vl.startNonterminal("ValidateExpr", Pl), Sl(260), kl(160); + (Vl.startNonterminal("ValidateExpr", Pl), Sl(260), kl(160)); if (Hl != 276) switch (Hl) { case 252: - Sl(252), kl(254), Nl(), go(); + (Sl(252), kl(254), Nl(), go()); break; default: - Nl(), Sr(); + (Nl(), Sr()); } - kl(87), + (kl(87), Sl(276), kl(266), Nl(), G(), Sl(282), - Vl.endNonterminal("ValidateExpr", Pl); + Vl.endNonterminal("ValidateExpr", Pl)); } function Er() { - xl(260), kl(160); + (xl(260), kl(160)); if (Hl != 276) switch (Hl) { case 252: - xl(252), kl(254), yo(); + (xl(252), kl(254), yo()); break; default: xr(); } - kl(87), xl(276), kl(266), Y(), xl(282); + (kl(87), xl(276), kl(266), Y(), xl(282)); } function Sr() { Vl.startNonterminal("ValidationMode", Pl); @@ -46429,24 +46483,24 @@ function Tr() { Vl.startNonterminal("ExtensionExpr", Pl); for (;;) { - Nl(), Cr(), kl(100); + (Nl(), Cr(), kl(100)); if (Hl != 35) break; } - Sl(276), + (Sl(276), kl(273), Hl != 282 && (Nl(), G()), Sl(282), - Vl.endNonterminal("ExtensionExpr", Pl); + Vl.endNonterminal("ExtensionExpr", Pl)); } function Nr() { for (;;) { - kr(), kl(100); + (kr(), kl(100)); if (Hl != 35) break; } - xl(276), kl(273), Hl != 282 && Y(), xl(282); + (xl(276), kl(273), Hl != 282 && Y(), xl(282)); } function Cr() { - Vl.startNonterminal("Pragma", Pl), + (Vl.startNonterminal("Pragma", Pl), Sl(35), Al(251), Hl == 21 && Sl(21), @@ -46455,23 +46509,23 @@ Hl == 21 && (Sl(21), Al(0), Sl(1)), Al(5), Sl(30), - Vl.endNonterminal("Pragma", Pl); + Vl.endNonterminal("Pragma", Pl)); } function kr() { - xl(35), + (xl(35), Al(251), Hl == 21 && xl(21), Ba(), Al(10), Hl == 21 && (xl(21), Al(0), xl(1)), Al(5), - xl(30); + xl(30)); } function Lr() { Vl.startNonterminal("PathExpr", Pl); switch (Hl) { case 46: - Sl(46), kl(285); + (Sl(46), kl(285)); switch (Hl) { case 25: case 26: @@ -46502,11 +46556,11 @@ case 282: break; default: - Nl(), Or(); + (Nl(), Or()); } break; case 47: - Sl(47), kl(264), Nl(), Or(); + (Sl(47), kl(264), Nl(), Or()); break; default: Or(); @@ -46516,7 +46570,7 @@ function Ar() { switch (Hl) { case 46: - xl(46), kl(285); + (xl(46), kl(285)); switch (Hl) { case 25: case 26: @@ -46551,14 +46605,14 @@ } break; case 47: - xl(47), kl(264), Mr(); + (xl(47), kl(264), Mr()); break; default: Mr(); } } function Or() { - Vl.startNonterminal("RelativePathExpr", Pl), _r(); + (Vl.startNonterminal("RelativePathExpr", Pl), _r()); for (;;) { switch (Hl) { case 26: @@ -46667,11 +46721,11 @@ default: xl(26); } - kl(264), Dr(), (_l = -1); + (kl(264), Dr(), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -46682,7 +46736,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(3, Pl, _l); + Jl(3, Pl, _l)); } } if (_l != -1 && _l != 46 && _l != 47) break; @@ -46696,7 +46750,7 @@ default: Sl(26); } - kl(264), Nl(), _r(); + (kl(264), Nl(), _r()); } Vl.endNonterminal("RelativePathExpr", Pl); } @@ -46810,10 +46864,10 @@ default: xl(26); } - kl(264), Dr(), Jl(3, t, -1); + (kl(264), Dr(), Jl(3, t, -1)); continue; } catch (a) { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -46824,7 +46878,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(3, t, -2); + Jl(3, t, -2)); break; } } @@ -46840,7 +46894,7 @@ default: xl(26); } - kl(264), Dr(); + (kl(264), Dr()); } } function _r() { @@ -47195,11 +47249,11 @@ o = Il, u = ql; try { - Zr(), (_l = -1); + (Zr(), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -47210,7 +47264,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(4, Pl, _l); + Jl(4, Pl, _l)); } } switch (_l) { @@ -48198,9 +48252,9 @@ o = Il, u = ql; try { - Zr(), Jl(4, t, -1), (_l = -3); + (Zr(), Jl(4, t, -1), (_l = -3)); } catch (a) { - (_l = -2), + ((_l = -2), (Dl = e), (Pl = t), (Hl = n), @@ -48212,7 +48266,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(4, t, -2); + Jl(4, t, -2)); } } } @@ -48876,7 +48930,7 @@ default: Br(); } - kl(237), Nl(), ni(), Vl.endNonterminal("AxisStep", Pl); + (kl(237), Nl(), ni(), Vl.endNonterminal("AxisStep", Pl)); } function Hr() { switch (Hl) { @@ -48902,7 +48956,7 @@ default: jr(); } - kl(237), ri(); + (kl(237), ri()); } function Br() { Vl.startNonterminal("ForwardStep", Pl); @@ -48929,7 +48983,7 @@ case 26247: case 26248: case 26341: - Fr(), kl(256), Nl(), Jr(); + (Fr(), kl(256), Nl(), Jr()); break; default: qr(); @@ -48960,7 +49014,7 @@ case 26247: case 26248: case 26341: - Ir(), kl(256), Kr(); + (Ir(), kl(256), Kr()); break; default: Rr(); @@ -48970,62 +49024,62 @@ Vl.startNonterminal("ForwardAxis", Pl); switch (Hl) { case 93: - Sl(93), kl(26), Sl(51); + (Sl(93), kl(26), Sl(51)); break; case 111: - Sl(111), kl(26), Sl(51); + (Sl(111), kl(26), Sl(51)); break; case 82: - Sl(82), kl(26), Sl(51); + (Sl(82), kl(26), Sl(51)); break; case 229: - Sl(229), kl(26), Sl(51); + (Sl(229), kl(26), Sl(51)); break; case 112: - Sl(112), kl(26), Sl(51); + (Sl(112), kl(26), Sl(51)); break; case 136: - Sl(136), kl(26), Sl(51); + (Sl(136), kl(26), Sl(51)); break; default: - Sl(135), kl(26), Sl(51); + (Sl(135), kl(26), Sl(51)); } Vl.endNonterminal("ForwardAxis", Pl); } function Ir() { switch (Hl) { case 93: - xl(93), kl(26), xl(51); + (xl(93), kl(26), xl(51)); break; case 111: - xl(111), kl(26), xl(51); + (xl(111), kl(26), xl(51)); break; case 82: - xl(82), kl(26), xl(51); + (xl(82), kl(26), xl(51)); break; case 229: - xl(229), kl(26), xl(51); + (xl(229), kl(26), xl(51)); break; case 112: - xl(112), kl(26), xl(51); + (xl(112), kl(26), xl(51)); break; case 136: - xl(136), kl(26), xl(51); + (xl(136), kl(26), xl(51)); break; default: - xl(135), kl(26), xl(51); + (xl(135), kl(26), xl(51)); } } function qr() { - Vl.startNonterminal("AbbrevForwardStep", Pl), + (Vl.startNonterminal("AbbrevForwardStep", Pl), Hl == 66 && Sl(66), kl(256), Nl(), Jr(), - Vl.endNonterminal("AbbrevForwardStep", Pl); + Vl.endNonterminal("AbbrevForwardStep", Pl)); } function Rr() { - Hl == 66 && xl(66), kl(256), Kr(); + (Hl == 66 && xl(66), kl(256), Kr()); } function Ur() { Vl.startNonterminal("ReverseStep", Pl); @@ -49034,7 +49088,7 @@ Vr(); break; default: - Wr(), kl(256), Nl(), Jr(); + (Wr(), kl(256), Nl(), Jr()); } Vl.endNonterminal("ReverseStep", Pl); } @@ -49044,51 +49098,51 @@ $r(); break; default: - Xr(), kl(256), Kr(); + (Xr(), kl(256), Kr()); } } function Wr() { Vl.startNonterminal("ReverseAxis", Pl); switch (Hl) { case 206: - Sl(206), kl(26), Sl(51); + (Sl(206), kl(26), Sl(51)); break; case 73: - Sl(73), kl(26), Sl(51); + (Sl(73), kl(26), Sl(51)); break; case 213: - Sl(213), kl(26), Sl(51); + (Sl(213), kl(26), Sl(51)); break; case 212: - Sl(212), kl(26), Sl(51); + (Sl(212), kl(26), Sl(51)); break; default: - Sl(74), kl(26), Sl(51); + (Sl(74), kl(26), Sl(51)); } Vl.endNonterminal("ReverseAxis", Pl); } function Xr() { switch (Hl) { case 206: - xl(206), kl(26), xl(51); + (xl(206), kl(26), xl(51)); break; case 73: - xl(73), kl(26), xl(51); + (xl(73), kl(26), xl(51)); break; case 213: - xl(213), kl(26), xl(51); + (xl(213), kl(26), xl(51)); break; case 212: - xl(212), kl(26), xl(51); + (xl(212), kl(26), xl(51)); break; default: - xl(74), kl(26), xl(51); + (xl(74), kl(26), xl(51)); } } function Vr() { - Vl.startNonterminal("AbbrevReverseStep", Pl), + (Vl.startNonterminal("AbbrevReverseStep", Pl), Sl(45), - Vl.endNonterminal("AbbrevReverseStep", Pl); + Vl.endNonterminal("AbbrevReverseStep", Pl)); } function $r() { xl(45); @@ -49184,16 +49238,16 @@ } } function Yr() { - Vl.startNonterminal("PostfixExpr", Pl), ol(); + (Vl.startNonterminal("PostfixExpr", Pl), ol()); for (;;) { kl(240); if (Hl != 34 && Hl != 68) break; switch (Hl) { case 68: - Nl(), ii(); + (Nl(), ii()); break; default: - Nl(), ei(); + (Nl(), ei()); } } Vl.endNonterminal("PostfixExpr", Pl); @@ -49213,25 +49267,25 @@ } } function ei() { - Vl.startNonterminal("ArgumentList", Pl), Sl(34), kl(275); + (Vl.startNonterminal("ArgumentList", Pl), Sl(34), kl(275)); if (Hl != 37) { - Nl(), Ti(); + (Nl(), Ti()); for (;;) { kl(101); if (Hl != 41) break; - Sl(41), kl(270), Nl(), Ti(); + (Sl(41), kl(270), Nl(), Ti()); } } - Sl(37), Vl.endNonterminal("ArgumentList", Pl); + (Sl(37), Vl.endNonterminal("ArgumentList", Pl)); } function ti() { - xl(34), kl(275); + (xl(34), kl(275)); if (Hl != 37) { Ni(); for (;;) { kl(101); if (Hl != 41) break; - xl(41), kl(270), Ni(); + (xl(41), kl(270), Ni()); } } xl(37); @@ -49241,7 +49295,7 @@ for (;;) { kl(237); if (Hl != 68) break; - Nl(), ii(); + (Nl(), ii()); } Vl.endNonterminal("PredicateList", Pl); } @@ -49253,16 +49307,16 @@ } } function ii() { - Vl.startNonterminal("Predicate", Pl), + (Vl.startNonterminal("Predicate", Pl), Sl(68), kl(266), Nl(), G(), Sl(69), - Vl.endNonterminal("Predicate", Pl); + Vl.endNonterminal("Predicate", Pl)); } function si() { - xl(68), kl(266), Y(), xl(69); + (xl(68), kl(266), Y(), xl(69)); } function oi() { Vl.startNonterminal("Literal", Pl); @@ -49311,45 +49365,45 @@ } } function li() { - Vl.startNonterminal("VarRef", Pl), + (Vl.startNonterminal("VarRef", Pl), Sl(31), kl(254), Nl(), hi(), - Vl.endNonterminal("VarRef", Pl); + Vl.endNonterminal("VarRef", Pl)); } function ci() { - xl(31), kl(254), pi(); + (xl(31), kl(254), pi()); } function hi() { - Vl.startNonterminal("VarName", Pl), + (Vl.startNonterminal("VarName", Pl), Ha(), - Vl.endNonterminal("VarName", Pl); + Vl.endNonterminal("VarName", Pl)); } function pi() { Ba(); } function di() { - Vl.startNonterminal("ParenthesizedExpr", Pl), + (Vl.startNonterminal("ParenthesizedExpr", Pl), Sl(34), kl(268), Hl != 37 && (Nl(), G()), Sl(37), - Vl.endNonterminal("ParenthesizedExpr", Pl); + Vl.endNonterminal("ParenthesizedExpr", Pl)); } function vi() { - xl(34), kl(268), Hl != 37 && Y(), xl(37); + (xl(34), kl(268), Hl != 37 && Y(), xl(37)); } function mi() { - Vl.startNonterminal("ContextItemExpr", Pl), + (Vl.startNonterminal("ContextItemExpr", Pl), Sl(44), - Vl.endNonterminal("ContextItemExpr", Pl); + Vl.endNonterminal("ContextItemExpr", Pl)); } function gi() { xl(44); } function yi() { - Vl.startNonterminal("OrderedExpr", Pl), + (Vl.startNonterminal("OrderedExpr", Pl), Sl(202), kl(87), Sl(276), @@ -49357,13 +49411,13 @@ Nl(), G(), Sl(282), - Vl.endNonterminal("OrderedExpr", Pl); + Vl.endNonterminal("OrderedExpr", Pl)); } function bi() { - xl(202), kl(87), xl(276), kl(266), Y(), xl(282); + (xl(202), kl(87), xl(276), kl(266), Y(), xl(282)); } function wi() { - Vl.startNonterminal("UnorderedExpr", Pl), + (Vl.startNonterminal("UnorderedExpr", Pl), Sl(256), kl(87), Sl(276), @@ -49371,21 +49425,21 @@ Nl(), G(), Sl(282), - Vl.endNonterminal("UnorderedExpr", Pl); + Vl.endNonterminal("UnorderedExpr", Pl)); } function Ei() { - xl(256), kl(87), xl(276), kl(266), Y(), xl(282); + (xl(256), kl(87), xl(276), kl(266), Y(), xl(282)); } function Si() { - Vl.startNonterminal("FunctionCall", Pl), + (Vl.startNonterminal("FunctionCall", Pl), ja(), kl(22), Nl(), ei(), - Vl.endNonterminal("FunctionCall", Pl); + Vl.endNonterminal("FunctionCall", Pl)); } function xi() { - Fa(), kl(22), ti(); + (Fa(), kl(22), ti()); } function Ti() { Vl.startNonterminal("Argument", Pl); @@ -49408,9 +49462,9 @@ } } function Ci() { - Vl.startNonterminal("ArgumentPlaceholder", Pl), + (Vl.startNonterminal("ArgumentPlaceholder", Pl), Sl(64), - Vl.endNonterminal("ArgumentPlaceholder", Pl); + Vl.endNonterminal("ArgumentPlaceholder", Pl)); } function ki() { xl(64); @@ -49466,11 +49520,11 @@ } } function _i() { - Vl.startNonterminal("DirElemConstructor", Pl), + (Vl.startNonterminal("DirElemConstructor", Pl), Sl(54), Al(4), Sl(20), - Pi(); + Pi()); switch (Hl) { case 48: Sl(48); @@ -49482,18 +49536,18 @@ if (Hl == 56) break; Ui(); } - Sl(56), + (Sl(56), Al(4), Sl(20), Al(12), Hl == 21 && Sl(21), Al(8), - Sl(61); + Sl(61)); } Vl.endNonterminal("DirElemConstructor", Pl); } function Di() { - xl(54), Al(4), xl(20), Hi(); + (xl(54), Al(4), xl(20), Hi()); switch (Hl) { case 48: xl(48); @@ -49505,13 +49559,13 @@ if (Hl == 56) break; zi(); } - xl(56), + (xl(56), Al(4), xl(20), Al(12), Hl == 21 && xl(21), Al(8), - xl(61); + xl(61)); } } function Pi() { @@ -49519,7 +49573,7 @@ for (;;) { Al(19); if (Hl != 21) break; - Sl(21), + (Sl(21), Al(91), Hl == 20 && (Sl(20), @@ -49529,7 +49583,7 @@ Sl(60), Al(18), Hl == 21 && Sl(21), - Bi()); + Bi())); } Vl.endNonterminal("DirAttributeList", Pl); } @@ -49537,7 +49591,7 @@ for (;;) { Al(19); if (Hl != 21) break; - xl(21), + (xl(21), Al(91), Hl == 20 && (xl(20), @@ -49547,11 +49601,11 @@ xl(60), Al(18), Hl == 21 && xl(21), - ji()); + ji())); } } function Bi() { - Vl.startNonterminal("DirAttributeValue", Pl), Al(14); + (Vl.startNonterminal("DirAttributeValue", Pl), Al(14)); switch (Hl) { case 28: Sl(28); @@ -49696,19 +49750,19 @@ } } function Wi() { - Vl.startNonterminal("DirCommentConstructor", Pl), + (Vl.startNonterminal("DirCommentConstructor", Pl), Sl(55), Al(1), Sl(2), Al(6), Sl(43), - Vl.endNonterminal("DirCommentConstructor", Pl); + Vl.endNonterminal("DirCommentConstructor", Pl)); } function Xi() { - xl(55), Al(1), xl(2), Al(6), xl(43); + (xl(55), Al(1), xl(2), Al(6), xl(43)); } function Vi() { - Vl.startNonterminal("DirPIConstructor", Pl), + (Vl.startNonterminal("DirPIConstructor", Pl), Sl(59), Al(3), Sl(18), @@ -49716,16 +49770,16 @@ Hl == 21 && (Sl(21), Al(2), Sl(3)), Al(9), Sl(65), - Vl.endNonterminal("DirPIConstructor", Pl); + Vl.endNonterminal("DirPIConstructor", Pl)); } function $i() { - xl(59), + (xl(59), Al(3), xl(18), Al(13), Hl == 21 && (xl(21), Al(2), xl(3)), Al(9), - xl(65); + xl(65)); } function Ji() { Vl.startNonterminal("ComputedConstructor", Pl); @@ -49778,82 +49832,82 @@ } } function Qi() { - Vl.startNonterminal("CompElemConstructor", Pl), Sl(121), kl(257); + (Vl.startNonterminal("CompElemConstructor", Pl), Sl(121), kl(257)); switch (Hl) { case 276: - Sl(276), kl(266), Nl(), G(), Sl(282); + (Sl(276), kl(266), Nl(), G(), Sl(282)); break; default: - Nl(), Ha(); + (Nl(), Ha()); } - kl(87), + (kl(87), Sl(276), kl(276), Hl != 282 && (Nl(), Jf()), Sl(282), - Vl.endNonterminal("CompElemConstructor", Pl); + Vl.endNonterminal("CompElemConstructor", Pl)); } function Gi() { - xl(121), kl(257); + (xl(121), kl(257)); switch (Hl) { case 276: - xl(276), kl(266), Y(), xl(282); + (xl(276), kl(266), Y(), xl(282)); break; default: Ba(); } - kl(87), xl(276), kl(276), Hl != 282 && Kf(), xl(282); + (kl(87), xl(276), kl(276), Hl != 282 && Kf(), xl(282)); } function Yi() { - Vl.startNonterminal("CompNamespaceConstructor", Pl), + (Vl.startNonterminal("CompNamespaceConstructor", Pl), Sl(184), - kl(250); + kl(250)); switch (Hl) { case 276: - Sl(276), kl(266), Nl(), ns(), Sl(282); + (Sl(276), kl(266), Nl(), ns(), Sl(282)); break; default: - Nl(), es(); + (Nl(), es()); } - kl(87), + (kl(87), Sl(276), kl(266), Nl(), is(), Sl(282), - Vl.endNonterminal("CompNamespaceConstructor", Pl); + Vl.endNonterminal("CompNamespaceConstructor", Pl)); } function Zi() { - xl(184), kl(250); + (xl(184), kl(250)); switch (Hl) { case 276: - xl(276), kl(266), rs(), xl(282); + (xl(276), kl(266), rs(), xl(282)); break; default: ts(); } - kl(87), xl(276), kl(266), ss(), xl(282); + (kl(87), xl(276), kl(266), ss(), xl(282)); } function es() { - Vl.startNonterminal("Prefix", Pl), + (Vl.startNonterminal("Prefix", Pl), Ia(), - Vl.endNonterminal("Prefix", Pl); + Vl.endNonterminal("Prefix", Pl)); } function ts() { qa(); } function ns() { - Vl.startNonterminal("PrefixExpr", Pl), + (Vl.startNonterminal("PrefixExpr", Pl), G(), - Vl.endNonterminal("PrefixExpr", Pl); + Vl.endNonterminal("PrefixExpr", Pl)); } function rs() { Y(); } function is() { - Vl.startNonterminal("URIExpr", Pl), + (Vl.startNonterminal("URIExpr", Pl), G(), - Vl.endNonterminal("URIExpr", Pl); + Vl.endNonterminal("URIExpr", Pl)); } function ss() { Y(); @@ -49895,25 +49949,25 @@ } } function as() { - Vl.startNonterminal("NamedFunctionRef", Pl), + (Vl.startNonterminal("NamedFunctionRef", Pl), Ha(), kl(20), Sl(29), kl(16), Sl(8), - Vl.endNonterminal("NamedFunctionRef", Pl); + Vl.endNonterminal("NamedFunctionRef", Pl)); } function fs() { - Ba(), kl(20), xl(29), kl(16), xl(8); + (Ba(), kl(20), xl(29), kl(16), xl(8)); } function ls() { Vl.startNonterminal("InlineFunctionExpr", Pl); for (;;) { kl(97); if (Hl != 32) break; - Nl(), B(); + (Nl(), B()); } - Sl(145), + (Sl(145), kl(22), Sl(34), kl(94), @@ -49924,7 +49978,7 @@ kl(87), Nl(), V(), - Vl.endNonterminal("InlineFunctionExpr", Pl); + Vl.endNonterminal("InlineFunctionExpr", Pl)); } function cs() { for (;;) { @@ -49932,7 +49986,7 @@ if (Hl != 32) break; j(); } - xl(145), + (xl(145), kl(22), xl(34), kl(94), @@ -49941,28 +49995,28 @@ kl(111), Hl == 79 && (xl(79), kl(259), gs()), kl(87), - $(); + $()); } function hs() { - Vl.startNonterminal("SingleType", Pl), + (Vl.startNonterminal("SingleType", Pl), vo(), kl(226), Hl == 64 && Sl(64), - Vl.endNonterminal("SingleType", Pl); + Vl.endNonterminal("SingleType", Pl)); } function ps() { - mo(), kl(226), Hl == 64 && xl(64); + (mo(), kl(226), Hl == 64 && xl(64)); } function ds() { - Vl.startNonterminal("TypeDeclaration", Pl), + (Vl.startNonterminal("TypeDeclaration", Pl), Sl(79), kl(259), Nl(), ms(), - Vl.endNonterminal("TypeDeclaration", Pl); + Vl.endNonterminal("TypeDeclaration", Pl)); } function vs() { - xl(79), kl(259), gs(); + (xl(79), kl(259), gs()); } function ms() { Vl.startNonterminal("SequenceType", Pl); @@ -49975,15 +50029,15 @@ } switch (_l) { case 17532: - Sl(124), kl(22), Sl(34), kl(23), Sl(37); + (Sl(124), kl(22), Sl(34), kl(23), Sl(37)); break; default: - ws(), kl(238); + (ws(), kl(238)); switch (Hl) { case 39: case 40: case 64: - Nl(), ys(); + (Nl(), ys()); break; default: } @@ -50000,10 +50054,10 @@ } switch (_l) { case 17532: - xl(124), kl(22), xl(34), kl(23), xl(37); + (xl(124), kl(22), xl(34), kl(23), xl(37)); break; default: - Es(), kl(238); + (Es(), kl(238)); switch (Hl) { case 39: case 40: @@ -50078,7 +50132,7 @@ Ps(); break; case 17573: - Sl(165), kl(22), Sl(34), kl(23), Sl(37); + (Sl(165), kl(22), Sl(34), kl(23), Sl(37)); break; case 32: case 17553: @@ -50137,7 +50191,7 @@ Hs(); break; case 17573: - xl(165), kl(22), xl(34), kl(23), xl(37); + (xl(165), kl(22), xl(34), kl(23), xl(37)); break; case 32: case 17553: @@ -50185,57 +50239,57 @@ } } function Ts() { - Vl.startNonterminal("StructuredItemTest", Pl), + (Vl.startNonterminal("StructuredItemTest", Pl), Sl(242), kl(22), Sl(34), kl(23), Sl(37), - Vl.endNonterminal("StructuredItemTest", Pl); + Vl.endNonterminal("StructuredItemTest", Pl)); } function Ns() { - xl(242), kl(22), xl(34), kl(23), xl(37); + (xl(242), kl(22), xl(34), kl(23), xl(37)); } function Cs() { - Vl.startNonterminal("JSONItemTest", Pl), + (Vl.startNonterminal("JSONItemTest", Pl), Sl(167), kl(22), Sl(34), kl(23), Sl(37), - Vl.endNonterminal("JSONItemTest", Pl); + Vl.endNonterminal("JSONItemTest", Pl)); } function ks() { - xl(167), kl(22), xl(34), kl(23), xl(37); + (xl(167), kl(22), xl(34), kl(23), xl(37)); } function Ls() { - Vl.startNonterminal("JSONObjectTest", Pl), + (Vl.startNonterminal("JSONObjectTest", Pl), Sl(194), kl(22), Sl(34), kl(23), Sl(37), - Vl.endNonterminal("JSONObjectTest", Pl); + Vl.endNonterminal("JSONObjectTest", Pl)); } function As() { - xl(194), kl(22), xl(34), kl(23), xl(37); + (xl(194), kl(22), xl(34), kl(23), xl(37)); } function Os() { - Vl.startNonterminal("JSONArrayTest", Pl), + (Vl.startNonterminal("JSONArrayTest", Pl), Sl(78), kl(22), Sl(34), kl(23), Sl(37), - Vl.endNonterminal("JSONArrayTest", Pl); + Vl.endNonterminal("JSONArrayTest", Pl)); } function Ms() { - xl(78), kl(22), xl(34), kl(23), xl(37); + (xl(78), kl(22), xl(34), kl(23), xl(37)); } function _s() { - Vl.startNonterminal("AtomicOrUnionType", Pl), + (Vl.startNonterminal("AtomicOrUnionType", Pl), Ha(), - Vl.endNonterminal("AtomicOrUnionType", Pl); + Vl.endNonterminal("AtomicOrUnionType", Pl)); } function Ds() { Ba(); @@ -50309,35 +50363,35 @@ } } function Bs() { - Vl.startNonterminal("AnyKindTest", Pl), + (Vl.startNonterminal("AnyKindTest", Pl), Sl(191), kl(22), Sl(34), kl(23), Sl(37), - Vl.endNonterminal("AnyKindTest", Pl); + Vl.endNonterminal("AnyKindTest", Pl)); } function js() { - xl(191), kl(22), xl(34), kl(23), xl(37); + (xl(191), kl(22), xl(34), kl(23), xl(37)); } function Fs() { - Vl.startNonterminal("DocumentTest", Pl), + (Vl.startNonterminal("DocumentTest", Pl), Sl(120), kl(22), Sl(34), - kl(144); + kl(144)); if (Hl != 37) switch (Hl) { case 121: - Nl(), no(); + (Nl(), no()); break; default: - Nl(), oo(); + (Nl(), oo()); } - kl(23), Sl(37), Vl.endNonterminal("DocumentTest", Pl); + (kl(23), Sl(37), Vl.endNonterminal("DocumentTest", Pl)); } function Is() { - xl(120), kl(22), xl(34), kl(144); + (xl(120), kl(22), xl(34), kl(144)); if (Hl != 37) switch (Hl) { case 121: @@ -50346,58 +50400,62 @@ default: uo(); } - kl(23), xl(37); + (kl(23), xl(37)); } function qs() { - Vl.startNonterminal("TextTest", Pl), + (Vl.startNonterminal("TextTest", Pl), Sl(244), kl(22), Sl(34), kl(23), Sl(37), - Vl.endNonterminal("TextTest", Pl); + Vl.endNonterminal("TextTest", Pl)); } function Rs() { - xl(244), kl(22), xl(34), kl(23), xl(37); + (xl(244), kl(22), xl(34), kl(23), xl(37)); } function Us() { - Vl.startNonterminal("CommentTest", Pl), + (Vl.startNonterminal("CommentTest", Pl), Sl(96), kl(22), Sl(34), kl(23), Sl(37), - Vl.endNonterminal("CommentTest", Pl); + Vl.endNonterminal("CommentTest", Pl)); } function zs() { - xl(96), kl(22), xl(34), kl(23), xl(37); + (xl(96), kl(22), xl(34), kl(23), xl(37)); } function Ws() { - Vl.startNonterminal("NamespaceNodeTest", Pl), + (Vl.startNonterminal("NamespaceNodeTest", Pl), Sl(185), kl(22), Sl(34), kl(23), Sl(37), - Vl.endNonterminal("NamespaceNodeTest", Pl); + Vl.endNonterminal("NamespaceNodeTest", Pl)); } function Xs() { - xl(185), kl(22), xl(34), kl(23), xl(37); + (xl(185), kl(22), xl(34), kl(23), xl(37)); } function Vs() { - Vl.startNonterminal("PITest", Pl), Sl(216), kl(22), Sl(34), kl(252); + (Vl.startNonterminal("PITest", Pl), + Sl(216), + kl(22), + Sl(34), + kl(252)); if (Hl != 37) switch (Hl) { case 11: Sl(11); break; default: - Nl(), Ia(); + (Nl(), Ia()); } - kl(23), Sl(37), Vl.endNonterminal("PITest", Pl); + (kl(23), Sl(37), Vl.endNonterminal("PITest", Pl)); } function $s() { - xl(216), kl(22), xl(34), kl(252); + (xl(216), kl(22), xl(34), kl(252)); if (Hl != 37) switch (Hl) { case 11: @@ -50406,10 +50464,10 @@ default: qa(); } - kl(23), xl(37); + (kl(23), xl(37)); } function Js() { - Vl.startNonterminal("AttributeTest", Pl), + (Vl.startNonterminal("AttributeTest", Pl), Sl(82), kl(22), Sl(34), @@ -50421,17 +50479,17 @@ Hl == 41 && (Sl(41), kl(254), Nl(), go())), kl(23), Sl(37), - Vl.endNonterminal("AttributeTest", Pl); + Vl.endNonterminal("AttributeTest", Pl)); } function Ks() { - xl(82), + (xl(82), kl(22), xl(34), kl(260), Hl != 37 && (Gs(), kl(101), Hl == 41 && (xl(41), kl(254), yo())), kl(23), - xl(37); + xl(37)); } function Qs() { Vl.startNonterminal("AttribNameOrWildcard", Pl); @@ -50454,7 +50512,7 @@ } } function Ys() { - Vl.startNonterminal("SchemaAttributeTest", Pl), + (Vl.startNonterminal("SchemaAttributeTest", Pl), Sl(226), kl(22), Sl(34), @@ -50463,21 +50521,21 @@ eo(), kl(23), Sl(37), - Vl.endNonterminal("SchemaAttributeTest", Pl); + Vl.endNonterminal("SchemaAttributeTest", Pl)); } function Zs() { - xl(226), kl(22), xl(34), kl(254), to(), kl(23), xl(37); + (xl(226), kl(22), xl(34), kl(254), to(), kl(23), xl(37)); } function eo() { - Vl.startNonterminal("AttributeDeclaration", Pl), + (Vl.startNonterminal("AttributeDeclaration", Pl), lo(), - Vl.endNonterminal("AttributeDeclaration", Pl); + Vl.endNonterminal("AttributeDeclaration", Pl)); } function to() { co(); } function no() { - Vl.startNonterminal("ElementTest", Pl), + (Vl.startNonterminal("ElementTest", Pl), Sl(121), kl(22), Sl(34), @@ -50495,10 +50553,10 @@ Hl == 64 && Sl(64))), kl(23), Sl(37), - Vl.endNonterminal("ElementTest", Pl); + Vl.endNonterminal("ElementTest", Pl)); } function ro() { - xl(121), + (xl(121), kl(22), xl(34), kl(260), @@ -50508,7 +50566,7 @@ Hl == 41 && (xl(41), kl(254), yo(), kl(102), Hl == 64 && xl(64))), kl(23), - xl(37); + xl(37)); } function io() { Vl.startNonterminal("ElementNameOrWildcard", Pl); @@ -50531,7 +50589,7 @@ } } function oo() { - Vl.startNonterminal("SchemaElementTest", Pl), + (Vl.startNonterminal("SchemaElementTest", Pl), Sl(227), kl(22), Sl(34), @@ -50540,47 +50598,47 @@ ao(), kl(23), Sl(37), - Vl.endNonterminal("SchemaElementTest", Pl); + Vl.endNonterminal("SchemaElementTest", Pl)); } function uo() { - xl(227), kl(22), xl(34), kl(254), fo(), kl(23), xl(37); + (xl(227), kl(22), xl(34), kl(254), fo(), kl(23), xl(37)); } function ao() { - Vl.startNonterminal("ElementDeclaration", Pl), + (Vl.startNonterminal("ElementDeclaration", Pl), ho(), - Vl.endNonterminal("ElementDeclaration", Pl); + Vl.endNonterminal("ElementDeclaration", Pl)); } function fo() { po(); } function lo() { - Vl.startNonterminal("AttributeName", Pl), + (Vl.startNonterminal("AttributeName", Pl), Ha(), - Vl.endNonterminal("AttributeName", Pl); + Vl.endNonterminal("AttributeName", Pl)); } function co() { Ba(); } function ho() { - Vl.startNonterminal("ElementName", Pl), + (Vl.startNonterminal("ElementName", Pl), Ha(), - Vl.endNonterminal("ElementName", Pl); + Vl.endNonterminal("ElementName", Pl)); } function po() { Ba(); } function vo() { - Vl.startNonterminal("SimpleTypeName", Pl), + (Vl.startNonterminal("SimpleTypeName", Pl), go(), - Vl.endNonterminal("SimpleTypeName", Pl); + Vl.endNonterminal("SimpleTypeName", Pl)); } function mo() { yo(); } function go() { - Vl.startNonterminal("TypeName", Pl), + (Vl.startNonterminal("TypeName", Pl), Ha(), - Vl.endNonterminal("TypeName", Pl); + Vl.endNonterminal("TypeName", Pl)); } function yo() { Ba(); @@ -50590,7 +50648,7 @@ for (;;) { kl(97); if (Hl != 32) break; - Nl(), B(); + (Nl(), B()); } switch (Hl) { case 145: @@ -50610,11 +50668,11 @@ o = Il, u = ql; try { - So(), (_l = -1); + (So(), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -50623,14 +50681,14 @@ (jl = i), (Fl = s), Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(5, Pl, _l); + Jl(5, Pl, _l)); } switch (_l) { case -1: - Nl(), Eo(); + (Nl(), Eo()); break; default: - Nl(), xo(); + (Nl(), xo()); } Vl.endNonterminal("FunctionTest", Pl); } @@ -50658,9 +50716,9 @@ o = Il, u = ql; try { - So(), Jl(5, t, -1), (_l = -3); + (So(), Jl(5, t, -1), (_l = -3)); } catch (a) { - (_l = -2), + ((_l = -2), (Dl = e), (Pl = t), (Hl = n), @@ -50672,7 +50730,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(5, t, -2); + Jl(5, t, -2)); } } switch (_l) { @@ -50686,7 +50744,7 @@ } } function Eo() { - Vl.startNonterminal("AnyFunctionTest", Pl), + (Vl.startNonterminal("AnyFunctionTest", Pl), Sl(145), kl(22), Sl(34), @@ -50694,64 +50752,64 @@ Sl(38), kl(23), Sl(37), - Vl.endNonterminal("AnyFunctionTest", Pl); + Vl.endNonterminal("AnyFunctionTest", Pl)); } function So() { - xl(145), kl(22), xl(34), kl(24), xl(38), kl(23), xl(37); + (xl(145), kl(22), xl(34), kl(24), xl(38), kl(23), xl(37)); } function xo() { - Vl.startNonterminal("TypedFunctionTest", Pl), + (Vl.startNonterminal("TypedFunctionTest", Pl), Sl(145), kl(22), Sl(34), - kl(262); + kl(262)); if (Hl != 37) { - Nl(), ms(); + (Nl(), ms()); for (;;) { kl(101); if (Hl != 41) break; - Sl(41), kl(259), Nl(), ms(); + (Sl(41), kl(259), Nl(), ms()); } } - Sl(37), + (Sl(37), kl(30), Sl(79), kl(259), Nl(), ms(), - Vl.endNonterminal("TypedFunctionTest", Pl); + Vl.endNonterminal("TypedFunctionTest", Pl)); } function To() { - xl(145), kl(22), xl(34), kl(262); + (xl(145), kl(22), xl(34), kl(262)); if (Hl != 37) { gs(); for (;;) { kl(101); if (Hl != 41) break; - xl(41), kl(259), gs(); + (xl(41), kl(259), gs()); } } - xl(37), kl(30), xl(79), kl(259), gs(); + (xl(37), kl(30), xl(79), kl(259), gs()); } function No() { - Vl.startNonterminal("ParenthesizedItemType", Pl), + (Vl.startNonterminal("ParenthesizedItemType", Pl), Sl(34), kl(259), Nl(), ws(), kl(23), Sl(37), - Vl.endNonterminal("ParenthesizedItemType", Pl); + Vl.endNonterminal("ParenthesizedItemType", Pl)); } function Co() { - xl(34), kl(259), Es(), kl(23), xl(37); + (xl(34), kl(259), Es(), kl(23), xl(37)); } function ko() { - Vl.startNonterminal("RevalidationDecl", Pl), + (Vl.startNonterminal("RevalidationDecl", Pl), Sl(108), kl(72), Sl(222), - kl(152); + kl(152)); switch (Hl) { case 240: Sl(240); @@ -50775,7 +50833,7 @@ break; default: if (Hl == 79) { - Sl(79), kl(119); + (Sl(79), kl(119)); switch (Hl) { case 134: Sl(134); @@ -50784,7 +50842,7 @@ Sl(170); } } - kl(54), Sl(163); + (kl(54), Sl(163)); } Vl.endNonterminal("InsertExprTargetChoice", Pl); } @@ -50798,7 +50856,7 @@ break; default: if (Hl == 79) { - xl(79), kl(119); + (xl(79), kl(119)); switch (Hl) { case 134: xl(134); @@ -50807,11 +50865,11 @@ xl(170); } } - kl(54), xl(163); + (kl(54), xl(163)); } } function Oo() { - Vl.startNonterminal("InsertExpr", Pl), Sl(159), kl(129); + (Vl.startNonterminal("InsertExpr", Pl), Sl(159), kl(129)); switch (Hl) { case 191: Sl(191); @@ -50819,7 +50877,7 @@ default: Sl(192); } - kl(266), + (kl(266), Nl(), Fo(), Nl(), @@ -50827,10 +50885,10 @@ kl(266), Nl(), qo(), - Vl.endNonterminal("InsertExpr", Pl); + Vl.endNonterminal("InsertExpr", Pl)); } function Mo() { - xl(159), kl(129); + (xl(159), kl(129)); switch (Hl) { case 191: xl(191); @@ -50838,10 +50896,10 @@ default: xl(192); } - kl(266), Io(), Ao(), kl(266), Ro(); + (kl(266), Io(), Ao(), kl(266), Ro()); } function _o() { - Vl.startNonterminal("DeleteExpr", Pl), Sl(110), kl(129); + (Vl.startNonterminal("DeleteExpr", Pl), Sl(110), kl(129)); switch (Hl) { case 191: Sl(191); @@ -50849,10 +50907,10 @@ default: Sl(192); } - kl(266), Nl(), qo(), Vl.endNonterminal("DeleteExpr", Pl); + (kl(266), Nl(), qo(), Vl.endNonterminal("DeleteExpr", Pl)); } function Do() { - xl(110), kl(129); + (xl(110), kl(129)); switch (Hl) { case 191: xl(191); @@ -50860,10 +50918,10 @@ default: xl(192); } - kl(266), Ro(); + (kl(266), Ro()); } function Po() { - Vl.startNonterminal("ReplaceExpr", Pl), + (Vl.startNonterminal("ReplaceExpr", Pl), Sl(219), kl(130), Hl == 261 && (Sl(261), kl(64), Sl(196)), @@ -50876,10 +50934,10 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("ReplaceExpr", Pl); + Vl.endNonterminal("ReplaceExpr", Pl)); } function Ho() { - xl(219), + (xl(219), kl(130), Hl == 261 && (xl(261), kl(64), xl(196)), kl(62), @@ -50888,10 +50946,10 @@ Ro(), xl(270), kl(266), - Df(); + Df()); } function Bo() { - Vl.startNonterminal("RenameExpr", Pl), + (Vl.startNonterminal("RenameExpr", Pl), Sl(218), kl(62), Sl(191), @@ -50902,46 +50960,46 @@ kl(266), Nl(), Uo(), - Vl.endNonterminal("RenameExpr", Pl); + Vl.endNonterminal("RenameExpr", Pl)); } function jo() { - xl(218), kl(62), xl(191), kl(266), Ro(), xl(79), kl(266), zo(); + (xl(218), kl(62), xl(191), kl(266), Ro(), xl(79), kl(266), zo()); } function Fo() { - Vl.startNonterminal("SourceExpr", Pl), + (Vl.startNonterminal("SourceExpr", Pl), _f(), - Vl.endNonterminal("SourceExpr", Pl); + Vl.endNonterminal("SourceExpr", Pl)); } function Io() { Df(); } function qo() { - Vl.startNonterminal("TargetExpr", Pl), + (Vl.startNonterminal("TargetExpr", Pl), _f(), - Vl.endNonterminal("TargetExpr", Pl); + Vl.endNonterminal("TargetExpr", Pl)); } function Ro() { Df(); } function Uo() { - Vl.startNonterminal("NewNameExpr", Pl), + (Vl.startNonterminal("NewNameExpr", Pl), _f(), - Vl.endNonterminal("NewNameExpr", Pl); + Vl.endNonterminal("NewNameExpr", Pl)); } function zo() { Df(); } function Wo() { - Vl.startNonterminal("TransformExpr", Pl), + (Vl.startNonterminal("TransformExpr", Pl), Sl(103), kl(21), Nl(), - Vo(); + Vo()); for (;;) { if (Hl != 41) break; - Sl(41), kl(21), Nl(), Vo(); + (Sl(41), kl(21), Nl(), Vo()); } - Sl(181), + (Sl(181), kl(266), Nl(), _f(), @@ -50949,18 +51007,18 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("TransformExpr", Pl); + Vl.endNonterminal("TransformExpr", Pl)); } function Xo() { - xl(103), kl(21), $o(); + (xl(103), kl(21), $o()); for (;;) { if (Hl != 41) break; - xl(41), kl(21), $o(); + (xl(41), kl(21), $o()); } - xl(181), kl(266), Df(), xl(220), kl(266), Df(); + (xl(181), kl(266), Df(), xl(220), kl(266), Df()); } function Vo() { - Vl.startNonterminal("TransformSpec", Pl), + (Vl.startNonterminal("TransformSpec", Pl), Sl(31), kl(254), Nl(), @@ -50970,13 +51028,13 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("TransformSpec", Pl); + Vl.endNonterminal("TransformSpec", Pl)); } function $o() { - xl(31), kl(254), pi(), kl(27), xl(52), kl(266), Df(); + (xl(31), kl(254), pi(), kl(27), xl(52), kl(266), Df()); } function Jo() { - Vl.startNonterminal("FTSelection", Pl), Yo(); + (Vl.startNonterminal("FTSelection", Pl), Yo()); for (;;) { kl(211); switch (Hl) { @@ -50997,7 +51055,7 @@ _l != 121425 ) break; - Nl(), Su(); + (Nl(), Su()); } Vl.endNonterminal("FTSelection", Pl); } @@ -51027,7 +51085,7 @@ } } function Qo() { - Vl.startNonterminal("FTWeight", Pl), + (Vl.startNonterminal("FTWeight", Pl), Sl(264), kl(87), Sl(276), @@ -51035,16 +51093,16 @@ Nl(), G(), Sl(282), - Vl.endNonterminal("FTWeight", Pl); + Vl.endNonterminal("FTWeight", Pl)); } function Go() { - xl(264), kl(87), xl(276), kl(266), Y(), xl(282); + (xl(264), kl(87), xl(276), kl(266), Y(), xl(282)); } function Yo() { - Vl.startNonterminal("FTOr", Pl), eu(); + (Vl.startNonterminal("FTOr", Pl), eu()); for (;;) { if (Hl != 144) break; - Sl(144), kl(162), Nl(), eu(); + (Sl(144), kl(162), Nl(), eu()); } Vl.endNonterminal("FTOr", Pl); } @@ -51052,14 +51110,14 @@ tu(); for (;;) { if (Hl != 144) break; - xl(144), kl(162), tu(); + (xl(144), kl(162), tu()); } } function eu() { - Vl.startNonterminal("FTAnd", Pl), nu(); + (Vl.startNonterminal("FTAnd", Pl), nu()); for (;;) { if (Hl != 142) break; - Sl(142), kl(162), Nl(), nu(); + (Sl(142), kl(162), Nl(), nu()); } Vl.endNonterminal("FTAnd", Pl); } @@ -51067,15 +51125,15 @@ ru(); for (;;) { if (Hl != 142) break; - xl(142), kl(162), ru(); + (xl(142), kl(162), ru()); } } function nu() { - Vl.startNonterminal("FTMildNot", Pl), iu(); + (Vl.startNonterminal("FTMildNot", Pl), iu()); for (;;) { kl(212); if (Hl != 193) break; - Sl(193), kl(53), Sl(154), kl(162), Nl(), iu(); + (Sl(193), kl(53), Sl(154), kl(162), Nl(), iu()); } Vl.endNonterminal("FTMildNot", Pl); } @@ -51084,64 +51142,64 @@ for (;;) { kl(212); if (Hl != 193) break; - xl(193), kl(53), xl(154), kl(162), su(); + (xl(193), kl(53), xl(154), kl(162), su()); } } function iu() { - Vl.startNonterminal("FTUnaryNot", Pl), + (Vl.startNonterminal("FTUnaryNot", Pl), Hl == 143 && Sl(143), kl(155), Nl(), ou(), - Vl.endNonterminal("FTUnaryNot", Pl); + Vl.endNonterminal("FTUnaryNot", Pl)); } function su() { - Hl == 143 && xl(143), kl(155), uu(); + (Hl == 143 && xl(143), kl(155), uu()); } function ou() { - Vl.startNonterminal("FTPrimaryWithOptions", Pl), + (Vl.startNonterminal("FTPrimaryWithOptions", Pl), au(), kl(214), Hl == 259 && (Nl(), Fu()), Hl == 264 && (Nl(), Qo()), - Vl.endNonterminal("FTPrimaryWithOptions", Pl); + Vl.endNonterminal("FTPrimaryWithOptions", Pl)); } function uu() { - fu(), kl(214), Hl == 259 && Iu(), Hl == 264 && Go(); + (fu(), kl(214), Hl == 259 && Iu(), Hl == 264 && Go()); } function au() { Vl.startNonterminal("FTPrimary", Pl); switch (Hl) { case 34: - Sl(34), kl(162), Nl(), Jo(), Sl(37); + (Sl(34), kl(162), Nl(), Jo(), Sl(37)); break; case 35: du(); break; default: - lu(), kl(215), Hl == 195 && (Nl(), yu()); + (lu(), kl(215), Hl == 195 && (Nl(), yu())); } Vl.endNonterminal("FTPrimary", Pl); } function fu() { switch (Hl) { case 34: - xl(34), kl(162), Ko(), xl(37); + (xl(34), kl(162), Ko(), xl(37)); break; case 35: vu(); break; default: - cu(), kl(215), Hl == 195 && bu(); + (cu(), kl(215), Hl == 195 && bu()); } } function lu() { - Vl.startNonterminal("FTWords", Pl), hu(), kl(221); - if (Hl == 71 || Hl == 76 || Hl == 210) Nl(), mu(); + (Vl.startNonterminal("FTWords", Pl), hu(), kl(221)); + if (Hl == 71 || Hl == 76 || Hl == 210) (Nl(), mu()); Vl.endNonterminal("FTWords", Pl); } function cu() { - pu(), kl(221), (Hl == 71 || Hl == 76 || Hl == 210) && gu(); + (pu(), kl(221), (Hl == 71 || Hl == 76 || Hl == 210) && gu()); } function hu() { Vl.startNonterminal("FTWordsValue", Pl); @@ -51150,7 +51208,7 @@ Sl(11); break; default: - Sl(276), kl(266), Nl(), G(), Sl(282); + (Sl(276), kl(266), Nl(), G(), Sl(282)); } Vl.endNonterminal("FTWordsValue", Pl); } @@ -51160,36 +51218,36 @@ xl(11); break; default: - xl(276), kl(266), Y(), xl(282); + (xl(276), kl(266), Y(), xl(282)); } } function du() { Vl.startNonterminal("FTExtensionSelection", Pl); for (;;) { - Nl(), Cr(), kl(100); + (Nl(), Cr(), kl(100)); if (Hl != 35) break; } - Sl(276), + (Sl(276), kl(166), Hl != 282 && (Nl(), Jo()), Sl(282), - Vl.endNonterminal("FTExtensionSelection", Pl); + Vl.endNonterminal("FTExtensionSelection", Pl)); } function vu() { for (;;) { - kr(), kl(100); + (kr(), kl(100)); if (Hl != 35) break; } - xl(276), kl(166), Hl != 282 && Ko(), xl(282); + (xl(276), kl(166), Hl != 282 && Ko(), xl(282)); } function mu() { Vl.startNonterminal("FTAnyallOption", Pl); switch (Hl) { case 76: - Sl(76), kl(218), Hl == 272 && Sl(272); + (Sl(76), kl(218), Hl == 272 && Sl(272)); break; case 71: - Sl(71), kl(219), Hl == 273 && Sl(273); + (Sl(71), kl(219), Hl == 273 && Sl(273)); break; default: Sl(210); @@ -51199,65 +51257,72 @@ function gu() { switch (Hl) { case 76: - xl(76), kl(218), Hl == 272 && xl(272); + (xl(76), kl(218), Hl == 272 && xl(272)); break; case 71: - xl(71), kl(219), Hl == 273 && xl(273); + (xl(71), kl(219), Hl == 273 && xl(273)); break; default: xl(210); } } function yu() { - Vl.startNonterminal("FTTimes", Pl), + (Vl.startNonterminal("FTTimes", Pl), Sl(195), kl(149), Nl(), wu(), Sl(247), - Vl.endNonterminal("FTTimes", Pl); + Vl.endNonterminal("FTTimes", Pl)); } function bu() { - xl(195), kl(149), Eu(), xl(247); + (xl(195), kl(149), Eu(), xl(247)); } function wu() { Vl.startNonterminal("FTRange", Pl); switch (Hl) { case 130: - Sl(130), kl(266), Nl(), Vn(); + (Sl(130), kl(266), Nl(), Vn()); break; case 81: - Sl(81), kl(125); + (Sl(81), kl(125)); switch (Hl) { case 173: - Sl(173), kl(266), Nl(), Vn(); + (Sl(173), kl(266), Nl(), Vn()); break; default: - Sl(183), kl(266), Nl(), Vn(); + (Sl(183), kl(266), Nl(), Vn()); } break; default: - Sl(140), kl(266), Nl(), Vn(), Sl(248), kl(266), Nl(), Vn(); + (Sl(140), + kl(266), + Nl(), + Vn(), + Sl(248), + kl(266), + Nl(), + Vn()); } Vl.endNonterminal("FTRange", Pl); } function Eu() { switch (Hl) { case 130: - xl(130), kl(266), $n(); + (xl(130), kl(266), $n()); break; case 81: - xl(81), kl(125); + (xl(81), kl(125)); switch (Hl) { case 173: - xl(173), kl(266), $n(); + (xl(173), kl(266), $n()); break; default: - xl(183), kl(266), $n(); + (xl(183), kl(266), $n()); } break; default: - xl(140), kl(266), $n(), xl(248), kl(266), $n(); + (xl(140), kl(266), $n(), xl(248), kl(266), $n()); } } function Su() { @@ -51301,38 +51366,38 @@ } } function Tu() { - Vl.startNonterminal("FTOrder", Pl), + (Vl.startNonterminal("FTOrder", Pl), Sl(202), - Vl.endNonterminal("FTOrder", Pl); + Vl.endNonterminal("FTOrder", Pl)); } function Nu() { xl(202); } function Cu() { - Vl.startNonterminal("FTWindow", Pl), + (Vl.startNonterminal("FTWindow", Pl), Sl(269), kl(266), Nl(), Vn(), Nl(), Ou(), - Vl.endNonterminal("FTWindow", Pl); + Vl.endNonterminal("FTWindow", Pl)); } function ku() { - xl(269), kl(266), $n(), Mu(); + (xl(269), kl(266), $n(), Mu()); } function Lu() { - Vl.startNonterminal("FTDistance", Pl), + (Vl.startNonterminal("FTDistance", Pl), Sl(117), kl(149), Nl(), wu(), Nl(), Ou(), - Vl.endNonterminal("FTDistance", Pl); + Vl.endNonterminal("FTDistance", Pl)); } function Au() { - xl(117), kl(149), Eu(), Mu(); + (xl(117), kl(149), Eu(), Mu()); } function Ou() { Vl.startNonterminal("FTUnit", Pl); @@ -51369,7 +51434,7 @@ default: Sl(115); } - kl(132), Nl(), Pu(), Vl.endNonterminal("FTScope", Pl); + (kl(132), Nl(), Pu(), Vl.endNonterminal("FTScope", Pl)); } function Du() { switch (Hl) { @@ -51379,7 +51444,7 @@ default: xl(115); } - kl(132), Hu(); + (kl(132), Hu()); } function Pu() { Vl.startNonterminal("FTBigUnit", Pl); @@ -51405,7 +51470,7 @@ Vl.startNonterminal("FTContent", Pl); switch (Hl) { case 81: - Sl(81), kl(117); + (Sl(81), kl(117)); switch (Hl) { case 237: Sl(237); @@ -51415,14 +51480,14 @@ } break; default: - Sl(127), kl(42), Sl(100); + (Sl(127), kl(42), Sl(100)); } Vl.endNonterminal("FTContent", Pl); } function ju() { switch (Hl) { case 81: - xl(81), kl(117); + (xl(81), kl(117)); switch (Hl) { case 237: xl(237); @@ -51432,20 +51497,20 @@ } break; default: - xl(127), kl(42), xl(100); + (xl(127), kl(42), xl(100)); } } function Fu() { Vl.startNonterminal("FTMatchOptions", Pl); for (;;) { - Sl(259), kl(181), Nl(), qu(), kl(214); + (Sl(259), kl(181), Nl(), qu(), kl(214)); if (Hl != 259) break; } Vl.endNonterminal("FTMatchOptions", Pl); } function Iu() { for (;;) { - xl(259), kl(181), Ru(), kl(214); + (xl(259), kl(181), Ru(), kl(214)); if (Hl != 259) break; } } @@ -51531,7 +51596,7 @@ Vl.startNonterminal("FTCaseOption", Pl); switch (Hl) { case 88: - Sl(88), kl(124); + (Sl(88), kl(124)); switch (Hl) { case 158: Sl(158); @@ -51551,7 +51616,7 @@ function zu() { switch (Hl) { case 88: - xl(88), kl(124); + (xl(88), kl(124)); switch (Hl) { case 158: xl(158); @@ -51568,7 +51633,7 @@ } } function Wu() { - Vl.startNonterminal("FTDiacriticsOption", Pl), Sl(114), kl(124); + (Vl.startNonterminal("FTDiacriticsOption", Pl), Sl(114), kl(124)); switch (Hl) { case 158: Sl(158); @@ -51579,7 +51644,7 @@ Vl.endNonterminal("FTDiacriticsOption", Pl); } function Xu() { - xl(114), kl(124); + (xl(114), kl(124)); switch (Hl) { case 158: xl(158); @@ -51595,7 +51660,7 @@ Sl(238); break; default: - Sl(188), kl(74), Sl(238); + (Sl(188), kl(74), Sl(238)); } Vl.endNonterminal("FTStemOption", Pl); } @@ -51605,26 +51670,26 @@ xl(238); break; default: - xl(188), kl(74), xl(238); + (xl(188), kl(74), xl(238)); } } function Ju() { Vl.startNonterminal("FTThesaurusOption", Pl); switch (Hl) { case 246: - Sl(246), kl(142); + (Sl(246), kl(142)); switch (Hl) { case 81: - Nl(), Qu(); + (Nl(), Qu()); break; case 109: Sl(109); break; default: - Sl(34), kl(112); + (Sl(34), kl(112)); switch (Hl) { case 81: - Nl(), Qu(); + (Nl(), Qu()); break; default: Sl(109); @@ -51632,20 +51697,20 @@ for (;;) { kl(101); if (Hl != 41) break; - Sl(41), kl(31), Nl(), Qu(); + (Sl(41), kl(31), Nl(), Qu()); } Sl(37); } break; default: - Sl(188), kl(78), Sl(246); + (Sl(188), kl(78), Sl(246)); } Vl.endNonterminal("FTThesaurusOption", Pl); } function Ku() { switch (Hl) { case 246: - xl(246), kl(142); + (xl(246), kl(142)); switch (Hl) { case 81: Gu(); @@ -51654,7 +51719,7 @@ xl(109); break; default: - xl(34), kl(112); + (xl(34), kl(112)); switch (Hl) { case 81: Gu(); @@ -51665,23 +51730,23 @@ for (;;) { kl(101); if (Hl != 41) break; - xl(41), kl(31), Gu(); + (xl(41), kl(31), Gu()); } xl(37); } break; default: - xl(188), kl(78), xl(246); + (xl(188), kl(78), xl(246)); } } function Qu() { - Vl.startNonterminal("FTThesaurusID", Pl), + (Vl.startNonterminal("FTThesaurusID", Pl), Sl(81), kl(15), Sl(7), kl(220), Hl == 217 && (Sl(217), kl(17), Sl(11)), - kl(216); + kl(216)); switch (Hl) { case 81: Ll(165); @@ -51690,16 +51755,16 @@ _l = Hl; } if (_l == 130 || _l == 140 || _l == 88657 || _l == 93777) - Nl(), Yu(), kl(58), Sl(175); + (Nl(), Yu(), kl(58), Sl(175)); Vl.endNonterminal("FTThesaurusID", Pl); } function Gu() { - xl(81), + (xl(81), kl(15), xl(7), kl(220), Hl == 217 && (xl(217), kl(17), xl(11)), - kl(216); + kl(216)); switch (Hl) { case 81: Ll(165); @@ -51708,80 +51773,80 @@ _l = Hl; } if (_l == 130 || _l == 140 || _l == 88657 || _l == 93777) - Zu(), kl(58), xl(175); + (Zu(), kl(58), xl(175)); } function Yu() { Vl.startNonterminal("FTLiteralRange", Pl); switch (Hl) { case 130: - Sl(130), kl(16), Sl(8); + (Sl(130), kl(16), Sl(8)); break; case 81: - Sl(81), kl(125); + (Sl(81), kl(125)); switch (Hl) { case 173: - Sl(173), kl(16), Sl(8); + (Sl(173), kl(16), Sl(8)); break; default: - Sl(183), kl(16), Sl(8); + (Sl(183), kl(16), Sl(8)); } break; default: - Sl(140), kl(16), Sl(8), kl(79), Sl(248), kl(16), Sl(8); + (Sl(140), kl(16), Sl(8), kl(79), Sl(248), kl(16), Sl(8)); } Vl.endNonterminal("FTLiteralRange", Pl); } function Zu() { switch (Hl) { case 130: - xl(130), kl(16), xl(8); + (xl(130), kl(16), xl(8)); break; case 81: - xl(81), kl(125); + (xl(81), kl(125)); switch (Hl) { case 173: - xl(173), kl(16), xl(8); + (xl(173), kl(16), xl(8)); break; default: - xl(183), kl(16), xl(8); + (xl(183), kl(16), xl(8)); } break; default: - xl(140), kl(16), xl(8), kl(79), xl(248), kl(16), xl(8); + (xl(140), kl(16), xl(8), kl(79), xl(248), kl(16), xl(8)); } } function ea() { Vl.startNonterminal("FTStopWordOption", Pl); switch (Hl) { case 239: - Sl(239), kl(86), Sl(273), kl(142); + (Sl(239), kl(86), Sl(273), kl(142)); switch (Hl) { case 109: Sl(109); for (;;) { kl(217); if (Hl != 131 && Hl != 254) break; - Nl(), ia(); + (Nl(), ia()); } break; default: - Nl(), na(); + (Nl(), na()); for (;;) { kl(217); if (Hl != 131 && Hl != 254) break; - Nl(), ia(); + (Nl(), ia()); } } break; default: - Sl(188), kl(75), Sl(239), kl(86), Sl(273); + (Sl(188), kl(75), Sl(239), kl(86), Sl(273)); } Vl.endNonterminal("FTStopWordOption", Pl); } function ta() { switch (Hl) { case 239: - xl(239), kl(86), xl(273), kl(142); + (xl(239), kl(86), xl(273), kl(142)); switch (Hl) { case 109: xl(109); @@ -51801,21 +51866,21 @@ } break; default: - xl(188), kl(75), xl(239), kl(86), xl(273); + (xl(188), kl(75), xl(239), kl(86), xl(273)); } } function na() { Vl.startNonterminal("FTStopWords", Pl); switch (Hl) { case 81: - Sl(81), kl(15), Sl(7); + (Sl(81), kl(15), Sl(7)); break; default: - Sl(34), kl(17), Sl(11); + (Sl(34), kl(17), Sl(11)); for (;;) { kl(101); if (Hl != 41) break; - Sl(41), kl(17), Sl(11); + (Sl(41), kl(17), Sl(11)); } Sl(37); } @@ -51824,14 +51889,14 @@ function ra() { switch (Hl) { case 81: - xl(81), kl(15), xl(7); + (xl(81), kl(15), xl(7)); break; default: - xl(34), kl(17), xl(11); + (xl(34), kl(17), xl(11)); for (;;) { kl(101); if (Hl != 41) break; - xl(41), kl(17), xl(11); + (xl(41), kl(17), xl(11)); } xl(37); } @@ -51845,7 +51910,7 @@ default: Sl(131); } - kl(99), Nl(), na(), Vl.endNonterminal("FTStopWordsInclExcl", Pl); + (kl(99), Nl(), na(), Vl.endNonterminal("FTStopWordsInclExcl", Pl)); } function sa() { switch (Hl) { @@ -51855,17 +51920,17 @@ default: xl(131); } - kl(99), ra(); + (kl(99), ra()); } function oa() { - Vl.startNonterminal("FTLanguageOption", Pl), + (Vl.startNonterminal("FTLanguageOption", Pl), Sl(169), kl(17), Sl(11), - Vl.endNonterminal("FTLanguageOption", Pl); + Vl.endNonterminal("FTLanguageOption", Pl)); } function ua() { - xl(169), kl(17), xl(11); + (xl(169), kl(17), xl(11)); } function aa() { Vl.startNonterminal("FTWildCardOption", Pl); @@ -51874,7 +51939,7 @@ Sl(268); break; default: - Sl(188), kl(84), Sl(268); + (Sl(188), kl(84), Sl(268)); } Vl.endNonterminal("FTWildCardOption", Pl); } @@ -51884,102 +51949,102 @@ xl(268); break; default: - xl(188), kl(84), xl(268); + (xl(188), kl(84), xl(268)); } } function la() { - Vl.startNonterminal("FTExtensionOption", Pl), + (Vl.startNonterminal("FTExtensionOption", Pl), Sl(199), kl(254), Nl(), Ha(), kl(17), Sl(11), - Vl.endNonterminal("FTExtensionOption", Pl); + Vl.endNonterminal("FTExtensionOption", Pl)); } function ca() { - xl(199), kl(254), Ba(), kl(17), xl(11); + (xl(199), kl(254), Ba(), kl(17), xl(11)); } function ha() { - Vl.startNonterminal("FTIgnoreOption", Pl), + (Vl.startNonterminal("FTIgnoreOption", Pl), Sl(271), kl(42), Sl(100), kl(266), Nl(), Qn(), - Vl.endNonterminal("FTIgnoreOption", Pl); + Vl.endNonterminal("FTIgnoreOption", Pl)); } function pa() { - xl(271), kl(42), xl(100), kl(266), Gn(); + (xl(271), kl(42), xl(100), kl(266), Gn()); } function da() { - Vl.startNonterminal("CollectionDecl", Pl), + (Vl.startNonterminal("CollectionDecl", Pl), Sl(95), kl(254), Nl(), Ha(), kl(107), Hl == 79 && (Nl(), va()), - Vl.endNonterminal("CollectionDecl", Pl); + Vl.endNonterminal("CollectionDecl", Pl)); } function va() { - Vl.startNonterminal("CollectionTypeDecl", Pl), + (Vl.startNonterminal("CollectionTypeDecl", Pl), Sl(79), kl(259), Nl(), ws(), kl(156), Hl != 53 && (Nl(), ys()), - Vl.endNonterminal("CollectionTypeDecl", Pl); + Vl.endNonterminal("CollectionTypeDecl", Pl)); } function ma() { - Vl.startNonterminal("IndexName", Pl), + (Vl.startNonterminal("IndexName", Pl), Ha(), - Vl.endNonterminal("IndexName", Pl); + Vl.endNonterminal("IndexName", Pl)); } function ga() { - Vl.startNonterminal("IndexDomainExpr", Pl), + (Vl.startNonterminal("IndexDomainExpr", Pl), Lr(), - Vl.endNonterminal("IndexDomainExpr", Pl); + Vl.endNonterminal("IndexDomainExpr", Pl)); } function ya() { - Vl.startNonterminal("IndexKeySpec", Pl), + (Vl.startNonterminal("IndexKeySpec", Pl), ba(), Hl == 79 && (Nl(), wa()), kl(146), Hl == 94 && (Nl(), Sa()), - Vl.endNonterminal("IndexKeySpec", Pl); + Vl.endNonterminal("IndexKeySpec", Pl)); } function ba() { - Vl.startNonterminal("IndexKeyExpr", Pl), + (Vl.startNonterminal("IndexKeyExpr", Pl), Lr(), - Vl.endNonterminal("IndexKeyExpr", Pl); + Vl.endNonterminal("IndexKeyExpr", Pl)); } function wa() { - Vl.startNonterminal("IndexKeyTypeDecl", Pl), + (Vl.startNonterminal("IndexKeyTypeDecl", Pl), Sl(79), kl(254), Nl(), Ea(), - kl(169); - if (Hl == 39 || Hl == 40 || Hl == 64) Nl(), ys(); + kl(169)); + if (Hl == 39 || Hl == 40 || Hl == 64) (Nl(), ys()); Vl.endNonterminal("IndexKeyTypeDecl", Pl); } function Ea() { - Vl.startNonterminal("AtomicType", Pl), + (Vl.startNonterminal("AtomicType", Pl), Ha(), - Vl.endNonterminal("AtomicType", Pl); + Vl.endNonterminal("AtomicType", Pl)); } function Sa() { - Vl.startNonterminal("IndexKeyCollation", Pl), + (Vl.startNonterminal("IndexKeyCollation", Pl), Sl(94), kl(15), Sl(7), - Vl.endNonterminal("IndexKeyCollation", Pl); + Vl.endNonterminal("IndexKeyCollation", Pl)); } function xa() { - Vl.startNonterminal("IndexDecl", Pl), + (Vl.startNonterminal("IndexDecl", Pl), Sl(155), kl(254), Nl(), @@ -51994,65 +52059,65 @@ Sl(87), kl(265), Nl(), - ya(); + ya()); for (;;) { kl(103); if (Hl != 41) break; - Sl(41), kl(265), Nl(), ya(); + (Sl(41), kl(265), Nl(), ya()); } Vl.endNonterminal("IndexDecl", Pl); } function Ta() { - Vl.startNonterminal("ICDecl", Pl), + (Vl.startNonterminal("ICDecl", Pl), Sl(161), kl(40), Sl(97), kl(254), Nl(), Ha(), - kl(120); + kl(120)); switch (Hl) { case 197: - Nl(), Na(); + (Nl(), Na()); break; default: - Nl(), Aa(); + (Nl(), Aa()); } Vl.endNonterminal("ICDecl", Pl); } function Na() { - Vl.startNonterminal("ICCollection", Pl), + (Vl.startNonterminal("ICCollection", Pl), Sl(197), kl(39), Sl(95), kl(254), Nl(), Ha(), - kl(140); + kl(140)); switch (Hl) { case 31: - Nl(), Ca(); + (Nl(), Ca()); break; case 191: - Nl(), ka(); + (Nl(), ka()); break; default: - Nl(), La(); + (Nl(), La()); } Vl.endNonterminal("ICCollection", Pl); } function Ca() { - Vl.startNonterminal("ICCollSequence", Pl), + (Vl.startNonterminal("ICCollSequence", Pl), li(), kl(37), Sl(92), kl(266), Nl(), _f(), - Vl.endNonterminal("ICCollSequence", Pl); + Vl.endNonterminal("ICCollSequence", Pl)); } function ka() { - Vl.startNonterminal("ICCollSequenceUnique", Pl), + (Vl.startNonterminal("ICCollSequenceUnique", Pl), Sl(191), kl(21), Nl(), @@ -52066,10 +52131,10 @@ kl(265), Nl(), Lr(), - Vl.endNonterminal("ICCollSequenceUnique", Pl); + Vl.endNonterminal("ICCollSequenceUnique", Pl)); } function La() { - Vl.startNonterminal("ICCollNode", Pl), + (Vl.startNonterminal("ICCollNode", Pl), Sl(138), kl(62), Sl(191), @@ -52081,10 +52146,10 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("ICCollNode", Pl); + Vl.endNonterminal("ICCollNode", Pl)); } function Aa() { - Vl.startNonterminal("ICForeignKey", Pl), + (Vl.startNonterminal("ICForeignKey", Pl), Sl(139), kl(57), Sl(168), @@ -52093,26 +52158,26 @@ Oa(), Nl(), Ma(), - Vl.endNonterminal("ICForeignKey", Pl); + Vl.endNonterminal("ICForeignKey", Pl)); } function Oa() { - Vl.startNonterminal("ICForeignKeySource", Pl), + (Vl.startNonterminal("ICForeignKeySource", Pl), Sl(140), kl(39), Nl(), _a(), - Vl.endNonterminal("ICForeignKeySource", Pl); + Vl.endNonterminal("ICForeignKeySource", Pl)); } function Ma() { - Vl.startNonterminal("ICForeignKeyTarget", Pl), + (Vl.startNonterminal("ICForeignKeyTarget", Pl), Sl(248), kl(39), Nl(), _a(), - Vl.endNonterminal("ICForeignKeyTarget", Pl); + Vl.endNonterminal("ICForeignKeyTarget", Pl)); } function _a() { - Vl.startNonterminal("ICForeignKeyValues", Pl), + (Vl.startNonterminal("ICForeignKeyValues", Pl), Sl(95), kl(254), Nl(), @@ -52127,7 +52192,7 @@ kl(265), Nl(), Lr(), - Vl.endNonterminal("ICForeignKeyValues", Pl); + Vl.endNonterminal("ICForeignKeyValues", Pl)); } function Da() { xl(36); @@ -52154,7 +52219,7 @@ } } function Ha() { - Vl.startNonterminal("EQName", Pl), Al(249); + (Vl.startNonterminal("EQName", Pl), Al(249)); switch (Hl) { case 82: Sl(82); @@ -53787,16 +53852,16 @@ } } function Ra() { - Vl.startNonterminal("MainModule", Pl), + (Vl.startNonterminal("MainModule", Pl), l(), Nl(), Ua(), - Vl.endNonterminal("MainModule", Pl); + Vl.endNonterminal("MainModule", Pl)); } function Ua() { - Vl.startNonterminal("Program", Pl), + (Vl.startNonterminal("Program", Pl), $a(), - Vl.endNonterminal("Program", Pl); + Vl.endNonterminal("Program", Pl)); } function za() { Vl.startNonterminal("Statements", Pl); @@ -54619,11 +54684,11 @@ o = Il, u = ql; try { - Qa(), (_l = -1); + (Qa(), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -54634,7 +54699,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(6, Pl, _l); + Jl(6, Pl, _l)); } } if ( @@ -54789,7 +54854,7 @@ _l != 113284 ) break; - Nl(), Ka(); + (Nl(), Ka()); } Vl.endNonterminal("Statements", Pl); } @@ -55613,10 +55678,10 @@ o = Il, u = ql; try { - Qa(), Jl(6, t, -1); + (Qa(), Jl(6, t, -1)); continue; } catch (a) { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -55627,7 +55692,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(6, t, -2); + Jl(6, t, -2)); break; } } @@ -55788,23 +55853,23 @@ } } function Xa() { - Vl.startNonterminal("StatementsAndExpr", Pl), + (Vl.startNonterminal("StatementsAndExpr", Pl), za(), Nl(), G(), - Vl.endNonterminal("StatementsAndExpr", Pl); + Vl.endNonterminal("StatementsAndExpr", Pl)); } function Va() { - Wa(), Y(); + (Wa(), Y()); } function $a() { - Vl.startNonterminal("StatementsAndOptionalExpr", Pl), + (Vl.startNonterminal("StatementsAndOptionalExpr", Pl), za(), Hl != 25 && Hl != 282 && (Nl(), G()), - Vl.endNonterminal("StatementsAndOptionalExpr", Pl); + Vl.endNonterminal("StatementsAndOptionalExpr", Pl)); } function Ja() { - Wa(), Hl != 25 && Hl != 282 && Y(); + (Wa(), Hl != 25 && Hl != 282 && Y()); } function Ka() { Vl.startNonterminal("Statement", Pl); @@ -56287,10 +56352,10 @@ o = Il, u = ql; try { - Ya(), (_l = -1); + (Ya(), (_l = -1)); } catch (a) { try { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -56302,10 +56367,10 @@ ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), ef(), - (_l = -2); + (_l = -2)); } catch (f) { try { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -56317,10 +56382,10 @@ ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), nf(), - (_l = -3); + (_l = -3)); } catch (l) { try { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -56334,14 +56399,14 @@ (ql = u), (Zl = u))), kf(), - (_l = -12); + (_l = -12)); } catch (c) { _l = -13; } } } } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -56352,7 +56417,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(7, Pl, _l); + Jl(7, Pl, _l)); } } switch (_l) { @@ -56885,10 +56950,10 @@ o = Il, u = ql; try { - Ya(), Jl(7, t, -1), (_l = -15); + (Ya(), Jl(7, t, -1), (_l = -15)); } catch (a) { try { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -56901,10 +56966,10 @@ : ((Il = o), (ql = u), (Zl = u))), ef(), Jl(7, t, -2), - (_l = -15); + (_l = -15)); } catch (f) { try { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -56917,10 +56982,10 @@ : ((Il = o), (ql = u), (Zl = u))), nf(), Jl(7, t, -3), - (_l = -15); + (_l = -15)); } catch (l) { try { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -56935,9 +57000,9 @@ (Zl = u))), kf(), Jl(7, t, -12), - (_l = -15); + (_l = -15)); } catch (c) { - (_l = -13), + ((_l = -13), (Dl = e), (Pl = t), (Hl = n), @@ -56951,7 +57016,7 @@ : ((Il = o), (ql = u), (Zl = u))), - Jl(7, t, -13); + Jl(7, t, -13)); } } } @@ -57010,16 +57075,16 @@ } } function Ga() { - Vl.startNonterminal("ApplyStatement", Pl), + (Vl.startNonterminal("ApplyStatement", Pl), Pf(), Sl(53), - Vl.endNonterminal("ApplyStatement", Pl); + Vl.endNonterminal("ApplyStatement", Pl)); } function Ya() { - Hf(), xl(53); + (Hf(), xl(53)); } function Za() { - Vl.startNonterminal("AssignStatement", Pl), + (Vl.startNonterminal("AssignStatement", Pl), Sl(31), kl(254), Nl(), @@ -57030,49 +57095,49 @@ Nl(), _f(), Sl(53), - Vl.endNonterminal("AssignStatement", Pl); + Vl.endNonterminal("AssignStatement", Pl)); } function ef() { - xl(31), kl(254), pi(), kl(27), xl(52), kl(266), Df(), xl(53); + (xl(31), kl(254), pi(), kl(27), xl(52), kl(266), Df(), xl(53)); } function tf() { - Vl.startNonterminal("BlockStatement", Pl), + (Vl.startNonterminal("BlockStatement", Pl), Sl(276), kl(276), Nl(), za(), Sl(282), - Vl.endNonterminal("BlockStatement", Pl); + Vl.endNonterminal("BlockStatement", Pl)); } function nf() { - xl(276), kl(276), Wa(), xl(282); + (xl(276), kl(276), Wa(), xl(282)); } function rf() { - Vl.startNonterminal("BreakStatement", Pl), + (Vl.startNonterminal("BreakStatement", Pl), Sl(86), kl(59), Sl(176), kl(28), Sl(53), - Vl.endNonterminal("BreakStatement", Pl); + Vl.endNonterminal("BreakStatement", Pl)); } function sf() { - xl(86), kl(59), xl(176), kl(28), xl(53); + (xl(86), kl(59), xl(176), kl(28), xl(53)); } function of() { - Vl.startNonterminal("ContinueStatement", Pl), + (Vl.startNonterminal("ContinueStatement", Pl), Sl(102), kl(59), Sl(176), kl(28), Sl(53), - Vl.endNonterminal("ContinueStatement", Pl); + Vl.endNonterminal("ContinueStatement", Pl)); } function uf() { - xl(102), kl(59), xl(176), kl(28), xl(53); + (xl(102), kl(59), xl(176), kl(28), xl(53)); } function af() { - Vl.startNonterminal("ExitStatement", Pl), + (Vl.startNonterminal("ExitStatement", Pl), Sl(132), kl(71), Sl(221), @@ -57080,19 +57145,19 @@ Nl(), _f(), Sl(53), - Vl.endNonterminal("ExitStatement", Pl); + Vl.endNonterminal("ExitStatement", Pl)); } function ff() { - xl(132), kl(71), xl(221), kl(266), Df(), xl(53); + (xl(132), kl(71), xl(221), kl(266), Df(), xl(53)); } function lf() { - Vl.startNonterminal("FLWORStatement", Pl), tt(); + (Vl.startNonterminal("FLWORStatement", Pl), tt()); for (;;) { kl(173); if (Hl == 220) break; - Nl(), rt(); + (Nl(), rt()); } - Nl(), hf(), Vl.endNonterminal("FLWORStatement", Pl); + (Nl(), hf(), Vl.endNonterminal("FLWORStatement", Pl)); } function cf() { nt(); @@ -57104,18 +57169,18 @@ pf(); } function hf() { - Vl.startNonterminal("ReturnStatement", Pl), + (Vl.startNonterminal("ReturnStatement", Pl), Sl(220), kl(269), Nl(), Ka(), - Vl.endNonterminal("ReturnStatement", Pl); + Vl.endNonterminal("ReturnStatement", Pl)); } function pf() { - xl(220), kl(269), Qa(); + (xl(220), kl(269), Qa()); } function df() { - Vl.startNonterminal("IfStatement", Pl), + (Vl.startNonterminal("IfStatement", Pl), Sl(152), kl(22), Sl(34), @@ -57133,10 +57198,10 @@ kl(269), Nl(), Ka(), - Vl.endNonterminal("IfStatement", Pl); + Vl.endNonterminal("IfStatement", Pl)); } function vf() { - xl(152), + (xl(152), kl(22), xl(34), kl(266), @@ -57149,64 +57214,64 @@ kl(48), xl(122), kl(269), - Qa(); + Qa()); } function mf() { - Vl.startNonterminal("SwitchStatement", Pl), + (Vl.startNonterminal("SwitchStatement", Pl), Sl(243), kl(22), Sl(34), kl(266), Nl(), G(), - Sl(37); + Sl(37)); for (;;) { - kl(35), Nl(), yf(), kl(113); + (kl(35), Nl(), yf(), kl(113)); if (Hl != 88) break; } - Sl(109), + (Sl(109), kl(70), Sl(220), kl(269), Nl(), Ka(), - Vl.endNonterminal("SwitchStatement", Pl); + Vl.endNonterminal("SwitchStatement", Pl)); } function gf() { - xl(243), kl(22), xl(34), kl(266), Y(), xl(37); + (xl(243), kl(22), xl(34), kl(266), Y(), xl(37)); for (;;) { - kl(35), bf(), kl(113); + (kl(35), bf(), kl(113)); if (Hl != 88) break; } - xl(109), kl(70), xl(220), kl(269), Qa(); + (xl(109), kl(70), xl(220), kl(269), Qa()); } function yf() { Vl.startNonterminal("SwitchCaseStatement", Pl); for (;;) { - Sl(88), kl(266), Nl(), dn(); + (Sl(88), kl(266), Nl(), dn()); if (Hl != 88) break; } - Sl(220), + (Sl(220), kl(269), Nl(), Ka(), - Vl.endNonterminal("SwitchCaseStatement", Pl); + Vl.endNonterminal("SwitchCaseStatement", Pl)); } function bf() { for (;;) { - xl(88), kl(266), vn(); + (xl(88), kl(266), vn()); if (Hl != 88) break; } - xl(220), kl(269), Qa(); + (xl(220), kl(269), Qa()); } function wf() { - Vl.startNonterminal("TryCatchStatement", Pl), + (Vl.startNonterminal("TryCatchStatement", Pl), Sl(250), kl(87), Nl(), - tf(); + tf()); for (;;) { - kl(36), Sl(91), kl(256), Nl(), _n(), Nl(), tf(), kl(277); + (kl(36), Sl(91), kl(256), Nl(), _n(), Nl(), tf(), kl(277)); switch (Hl) { case 91: Ll(278); @@ -57247,11 +57312,11 @@ o = Il, u = ql; try { - kl(36), xl(91), kl(256), Dn(), nf(), (_l = -1); + (kl(36), xl(91), kl(256), Dn(), nf(), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -57262,7 +57327,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(8, Pl, _l); + Jl(8, Pl, _l)); } } if ( @@ -57389,7 +57454,7 @@ Vl.endNonterminal("TryCatchStatement", Pl); } function Ef() { - xl(250), kl(87), nf(), kl(36), xl(91), kl(256), Dn(), nf(); + (xl(250), kl(87), nf(), kl(36), xl(91), kl(256), Dn(), nf()); for (;;) { kl(277); switch (Hl) { @@ -57432,10 +57497,10 @@ o = Il, u = ql; try { - kl(36), xl(91), kl(256), Dn(), nf(), Jl(8, t, -1); + (kl(36), xl(91), kl(256), Dn(), nf(), Jl(8, t, -1)); continue; } catch (a) { - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -57446,7 +57511,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(8, t, -2); + Jl(8, t, -2)); break; } } @@ -57571,23 +57636,23 @@ _l != 140379 ) break; - kl(36), xl(91), kl(256), Dn(), nf(); + (kl(36), xl(91), kl(256), Dn(), nf()); } } function Sf() { - Vl.startNonterminal("TypeswitchStatement", Pl), + (Vl.startNonterminal("TypeswitchStatement", Pl), Sl(253), kl(22), Sl(34), kl(266), Nl(), G(), - Sl(37); + Sl(37)); for (;;) { - kl(35), Nl(), Tf(), kl(113); + (kl(35), Nl(), Tf(), kl(113)); if (Hl != 88) break; } - Sl(109), + (Sl(109), kl(95), Hl == 31 && (Sl(31), kl(254), Nl(), hi()), kl(70), @@ -57595,24 +57660,24 @@ kl(269), Nl(), Ka(), - Vl.endNonterminal("TypeswitchStatement", Pl); + Vl.endNonterminal("TypeswitchStatement", Pl)); } function xf() { - xl(253), kl(22), xl(34), kl(266), Y(), xl(37); + (xl(253), kl(22), xl(34), kl(266), Y(), xl(37)); for (;;) { - kl(35), Nf(), kl(113); + (kl(35), Nf(), kl(113)); if (Hl != 88) break; } - xl(109), + (xl(109), kl(95), Hl == 31 && (xl(31), kl(254), pi()), kl(70), xl(220), kl(269), - Qa(); + Qa()); } function Tf() { - Vl.startNonterminal("CaseStatement", Pl), + (Vl.startNonterminal("CaseStatement", Pl), Sl(88), kl(261), Hl == 31 && (Sl(31), kl(254), Nl(), hi(), kl(30), Sl(79)), @@ -57624,10 +57689,10 @@ kl(269), Nl(), Ka(), - Vl.endNonterminal("CaseStatement", Pl); + Vl.endNonterminal("CaseStatement", Pl)); } function Nf() { - xl(88), + (xl(88), kl(261), Hl == 31 && (xl(31), kl(254), pi(), kl(30), xl(79)), kl(259), @@ -57635,16 +57700,16 @@ kl(70), xl(220), kl(269), - Qa(); + Qa()); } function Cf() { Vl.startNonterminal("VarDeclStatement", Pl); for (;;) { kl(98); if (Hl != 32) break; - Nl(), B(); + (Nl(), B()); } - Sl(262), + (Sl(262), kl(21), Sl(31), kl(254), @@ -57653,10 +57718,10 @@ kl(157), Hl == 79 && (Nl(), ds()), kl(145), - Hl == 52 && (Sl(52), kl(266), Nl(), _f()); + Hl == 52 && (Sl(52), kl(266), Nl(), _f())); for (;;) { if (Hl != 41) break; - Sl(41), + (Sl(41), kl(21), Sl(31), kl(254), @@ -57665,9 +57730,9 @@ kl(157), Hl == 79 && (Nl(), ds()), kl(145), - Hl == 52 && (Sl(52), kl(266), Nl(), _f()); + Hl == 52 && (Sl(52), kl(266), Nl(), _f())); } - Sl(53), Vl.endNonterminal("VarDeclStatement", Pl); + (Sl(53), Vl.endNonterminal("VarDeclStatement", Pl)); } function kf() { for (;;) { @@ -57675,7 +57740,7 @@ if (Hl != 32) break; j(); } - xl(262), + (xl(262), kl(21), xl(31), kl(254), @@ -57683,10 +57748,10 @@ kl(157), Hl == 79 && vs(), kl(145), - Hl == 52 && (xl(52), kl(266), Df()); + Hl == 52 && (xl(52), kl(266), Df())); for (;;) { if (Hl != 41) break; - xl(41), + (xl(41), kl(21), xl(31), kl(254), @@ -57694,12 +57759,12 @@ kl(157), Hl == 79 && vs(), kl(145), - Hl == 52 && (xl(52), kl(266), Df()); + Hl == 52 && (xl(52), kl(266), Df())); } xl(53); } function Lf() { - Vl.startNonterminal("WhileStatement", Pl), + (Vl.startNonterminal("WhileStatement", Pl), Sl(267), kl(22), Sl(34), @@ -57710,15 +57775,15 @@ kl(269), Nl(), Ka(), - Vl.endNonterminal("WhileStatement", Pl); + Vl.endNonterminal("WhileStatement", Pl)); } function Af() { - xl(267), kl(22), xl(34), kl(266), Y(), xl(37), kl(269), Qa(); + (xl(267), kl(22), xl(34), kl(266), Y(), xl(37), kl(269), Qa()); } function Of() { - Vl.startNonterminal("VoidStatement", Pl), + (Vl.startNonterminal("VoidStatement", Pl), Sl(53), - Vl.endNonterminal("VoidStatement", Pl); + Vl.endNonterminal("VoidStatement", Pl)); } function Mf() { xl(53); @@ -57847,11 +57912,11 @@ o = Il, u = ql; try { - Ho(), (_l = -6); + (Ho(), (_l = -6)); } catch (a) { _l = -11; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -57862,7 +57927,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(9, Pl, _l); + Jl(9, Pl, _l)); } } switch (_l) { @@ -57943,9 +58008,9 @@ o = Il, u = ql; try { - Ho(), Jl(9, t, -6), (_l = -13); + (Ho(), Jl(9, t, -6), (_l = -13)); } catch (a) { - (_l = -11), + ((_l = -11), (Dl = e), (Pl = t), (Hl = n), @@ -57957,7 +58022,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(9, t, -11); + Jl(9, t, -11)); } } } @@ -58006,17 +58071,17 @@ } } function Bf() { - Vl.startNonterminal("JSONDeleteExpr", Pl), + (Vl.startNonterminal("JSONDeleteExpr", Pl), Sl(110), kl(56), Sl(166), kl(263), Nl(), Yr(), - Vl.endNonterminal("JSONDeleteExpr", Pl); + Vl.endNonterminal("JSONDeleteExpr", Pl)); } function jf() { - xl(110), kl(56), xl(166), kl(263), Zr(); + (xl(110), kl(56), xl(166), kl(263), Zr()); } function Ff() { Vl.startNonterminal("JSONInsertExpr", Pl); @@ -58038,14 +58103,14 @@ o = Il, u = ql; try { - xl(159), + (xl(159), kl(56), xl(166), kl(266), Df(), xl(163), kl(266), - Df(); + Df()); switch (Hl) { case 81: Ll(69); @@ -58065,14 +58130,14 @@ d = Il, v = ql; try { - xl(81), + (xl(81), kl(69), xl(211), kl(266), Df(), - Jl(11, f, -1); + Jl(11, f, -1)); } catch (m) { - (Dl = a), + ((Dl = a), (Pl = f), (Hl = l), Hl == 0 @@ -58083,17 +58148,17 @@ Fl == 0 ? (Zl = h) : ((Il = d), (ql = v), (Zl = v))), - Jl(11, f, -2); + Jl(11, f, -2)); } _l = -2; } } - _l == -1 && (xl(81), kl(69), xl(211), kl(266), Df()), - (_l = -1); + (_l == -1 && (xl(81), kl(69), xl(211), kl(266), Df()), + (_l = -1)); } catch (g) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -58102,11 +58167,11 @@ (jl = i), (Fl = s), Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(10, Pl, _l); + Jl(10, Pl, _l)); } switch (_l) { case -1: - Sl(159), + (Sl(159), kl(56), Sl(166), kl(266), @@ -58115,7 +58180,7 @@ Sl(163), kl(266), Nl(), - _f(); + _f()); switch (Hl) { case 81: Ll(69); @@ -58135,16 +58200,16 @@ d = Il, v = ql; try { - xl(81), + (xl(81), kl(69), xl(211), kl(266), Df(), - (_l = -1); + (_l = -1)); } catch (m) { _l = -2; } - (Dl = a), + ((Dl = a), (Pl = f), (Hl = l), Hl == 0 @@ -58155,13 +58220,13 @@ Fl == 0 ? (Zl = h) : ((Il = d), (ql = v), (Zl = v))), - Jl(11, Pl, _l); + Jl(11, Pl, _l)); } } _l == -1 && (Sl(81), kl(69), Sl(211), kl(266), Nl(), _f()); break; default: - Sl(159), + (Sl(159), kl(56), Sl(166), kl(266), @@ -58170,7 +58235,7 @@ Sl(163), kl(266), Nl(), - _f(); + _f()); } Vl.endNonterminal("JSONInsertExpr", Pl); } @@ -58193,14 +58258,14 @@ o = Il, u = ql; try { - xl(159), + (xl(159), kl(56), xl(166), kl(266), Df(), xl(163), kl(266), - Df(); + Df()); switch (Hl) { case 81: Ll(69); @@ -58220,14 +58285,14 @@ d = Il, v = ql; try { - xl(81), + (xl(81), kl(69), xl(211), kl(266), Df(), - Jl(11, f, -1); + Jl(11, f, -1)); } catch (m) { - (Dl = a), + ((Dl = a), (Pl = f), (Hl = l), Hl == 0 @@ -58238,16 +58303,16 @@ Fl == 0 ? (Zl = h) : ((Il = d), (ql = v), (Zl = v))), - Jl(11, f, -2); + Jl(11, f, -2)); } _l = -2; } } - _l == -1 && (xl(81), kl(69), xl(211), kl(266), Df()), + (_l == -1 && (xl(81), kl(69), xl(211), kl(266), Df()), Jl(10, t, -1), - (_l = -3); + (_l = -3)); } catch (g) { - (_l = -2), + ((_l = -2), (Dl = e), (Pl = t), (Hl = n), @@ -58259,19 +58324,19 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(10, t, -2); + Jl(10, t, -2)); } } switch (_l) { case -1: - xl(159), + (xl(159), kl(56), xl(166), kl(266), Df(), xl(163), kl(266), - Df(); + Df()); switch (Hl) { case 81: Ll(69); @@ -58291,14 +58356,14 @@ d = Il, v = ql; try { - xl(81), + (xl(81), kl(69), xl(211), kl(266), Df(), - Jl(11, f, -1); + Jl(11, f, -1)); } catch (m) { - (Dl = a), + ((Dl = a), (Pl = f), (Hl = l), Hl == 0 @@ -58309,7 +58374,7 @@ Fl == 0 ? (Zl = h) : ((Il = d), (ql = v), (Zl = v))), - Jl(11, f, -2); + Jl(11, f, -2)); } _l = -2; } @@ -58319,18 +58384,18 @@ case -3: break; default: - xl(159), + (xl(159), kl(56), xl(166), kl(266), pl(), xl(163), kl(266), - Df(); + Df()); } } function qf() { - Vl.startNonterminal("JSONRenameExpr", Pl), + (Vl.startNonterminal("JSONRenameExpr", Pl), Sl(218), kl(56), Sl(166), @@ -58341,13 +58406,13 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("JSONRenameExpr", Pl); + Vl.endNonterminal("JSONRenameExpr", Pl)); } function Rf() { - xl(218), kl(56), xl(166), kl(263), Zr(), xl(79), kl(266), Df(); + (xl(218), kl(56), xl(166), kl(263), Zr(), xl(79), kl(266), Df()); } function Uf() { - Vl.startNonterminal("JSONReplaceExpr", Pl), + (Vl.startNonterminal("JSONReplaceExpr", Pl), Sl(219), kl(82), Sl(261), @@ -58362,10 +58427,10 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("JSONReplaceExpr", Pl); + Vl.endNonterminal("JSONReplaceExpr", Pl)); } function zf() { - xl(219), + (xl(219), kl(82), xl(261), kl(64), @@ -58376,10 +58441,10 @@ Zr(), xl(270), kl(266), - Df(); + Df()); } function Wf() { - Vl.startNonterminal("JSONAppendExpr", Pl), + (Vl.startNonterminal("JSONAppendExpr", Pl), Sl(77), kl(56), Sl(166), @@ -58390,10 +58455,10 @@ kl(266), Nl(), _f(), - Vl.endNonterminal("JSONAppendExpr", Pl); + Vl.endNonterminal("JSONAppendExpr", Pl)); } function Xf() { - xl(77), kl(56), xl(166), kl(266), Df(), xl(163), kl(266), Df(); + (xl(77), kl(56), xl(166), kl(266), Df(), xl(163), kl(266), Df()); } function Vf() { Vl.startNonterminal("CommonContent", Pl); @@ -58434,32 +58499,32 @@ } } function Jf() { - Vl.startNonterminal("ContentExpr", Pl), + (Vl.startNonterminal("ContentExpr", Pl), Xa(), - Vl.endNonterminal("ContentExpr", Pl); + Vl.endNonterminal("ContentExpr", Pl)); } function Kf() { Va(); } function Qf() { - Vl.startNonterminal("CompDocConstructor", Pl), + (Vl.startNonterminal("CompDocConstructor", Pl), Sl(119), kl(87), Nl(), yl(), - Vl.endNonterminal("CompDocConstructor", Pl); + Vl.endNonterminal("CompDocConstructor", Pl)); } function Gf() { - xl(119), kl(87), bl(); + (xl(119), kl(87), bl()); } function Yf() { - Vl.startNonterminal("CompAttrConstructor", Pl), Sl(82), kl(257); + (Vl.startNonterminal("CompAttrConstructor", Pl), Sl(82), kl(257)); switch (Hl) { case 276: - Sl(276), kl(266), Nl(), G(), Sl(282); + (Sl(276), kl(266), Nl(), G(), Sl(282)); break; default: - Nl(), Ha(); + (Nl(), Ha()); } kl(87); switch (Hl) { @@ -58481,11 +58546,11 @@ o = Il, u = ql; try { - xl(276), kl(88), xl(282), (_l = -1); + (xl(276), kl(88), xl(282), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -58496,23 +58561,23 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(12, Pl, _l); + Jl(12, Pl, _l)); } } switch (_l) { case -1: - Sl(276), kl(88), Sl(282); + (Sl(276), kl(88), Sl(282)); break; default: - Nl(), yl(); + (Nl(), yl()); } Vl.endNonterminal("CompAttrConstructor", Pl); } function Zf() { - xl(82), kl(257); + (xl(82), kl(257)); switch (Hl) { case 276: - xl(276), kl(266), Y(), xl(282); + (xl(276), kl(266), Y(), xl(282)); break; default: Ba(); @@ -58537,9 +58602,9 @@ o = Il, u = ql; try { - xl(276), kl(88), xl(282), Jl(12, t, -1), (_l = -3); + (xl(276), kl(88), xl(282), Jl(12, t, -1), (_l = -3)); } catch (a) { - (_l = -2), + ((_l = -2), (Dl = e), (Pl = t), (Hl = n), @@ -58551,13 +58616,13 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(12, t, -2); + Jl(12, t, -2)); } } } switch (_l) { case -1: - xl(276), kl(88), xl(282); + (xl(276), kl(88), xl(282)); break; case -3: break; @@ -58566,13 +58631,13 @@ } } function el() { - Vl.startNonterminal("CompPIConstructor", Pl), Sl(216), kl(250); + (Vl.startNonterminal("CompPIConstructor", Pl), Sl(216), kl(250)); switch (Hl) { case 276: - Sl(276), kl(266), Nl(), G(), Sl(282); + (Sl(276), kl(266), Nl(), G(), Sl(282)); break; default: - Nl(), Ia(); + (Nl(), Ia()); } kl(87); switch (Hl) { @@ -58594,11 +58659,11 @@ o = Il, u = ql; try { - xl(276), kl(88), xl(282), (_l = -1); + (xl(276), kl(88), xl(282), (_l = -1)); } catch (a) { _l = -2; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -58609,23 +58674,23 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(13, Pl, _l); + Jl(13, Pl, _l)); } } switch (_l) { case -1: - Sl(276), kl(88), Sl(282); + (Sl(276), kl(88), Sl(282)); break; default: - Nl(), yl(); + (Nl(), yl()); } Vl.endNonterminal("CompPIConstructor", Pl); } function tl() { - xl(216), kl(250); + (xl(216), kl(250)); switch (Hl) { case 276: - xl(276), kl(266), Y(), xl(282); + (xl(276), kl(266), Y(), xl(282)); break; default: qa(); @@ -58650,9 +58715,9 @@ o = Il, u = ql; try { - xl(276), kl(88), xl(282), Jl(13, t, -1), (_l = -3); + (xl(276), kl(88), xl(282), Jl(13, t, -1), (_l = -3)); } catch (a) { - (_l = -2), + ((_l = -2), (Dl = e), (Pl = t), (Hl = n), @@ -58664,13 +58729,13 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(13, t, -2); + Jl(13, t, -2)); } } } switch (_l) { case -1: - xl(276), kl(88), xl(282); + (xl(276), kl(88), xl(282)); break; case -3: break; @@ -58679,26 +58744,26 @@ } } function nl() { - Vl.startNonterminal("CompCommentConstructor", Pl), + (Vl.startNonterminal("CompCommentConstructor", Pl), Sl(96), kl(87), Nl(), yl(), - Vl.endNonterminal("CompCommentConstructor", Pl); + Vl.endNonterminal("CompCommentConstructor", Pl)); } function rl() { - xl(96), kl(87), bl(); + (xl(96), kl(87), bl()); } function il() { - Vl.startNonterminal("CompTextConstructor", Pl), + (Vl.startNonterminal("CompTextConstructor", Pl), Sl(244), kl(87), Nl(), yl(), - Vl.endNonterminal("CompTextConstructor", Pl); + Vl.endNonterminal("CompTextConstructor", Pl)); } function sl() { - xl(244), kl(87), bl(); + (xl(244), kl(87), bl()); } function ol() { Vl.startNonterminal("PrimaryExpr", Pl); @@ -59013,11 +59078,11 @@ o = Il, u = ql; try { - bl(), (_l = -10); + (bl(), (_l = -10)); } catch (a) { _l = -11; } - (Dl = e), + ((Dl = e), (Pl = t), (Hl = n), Hl == 0 @@ -59028,7 +59093,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(14, Pl, _l); + Jl(14, Pl, _l)); } } switch (_l) { @@ -59639,9 +59704,9 @@ o = Il, u = ql; try { - bl(), Jl(14, t, -10), (_l = -14); + (bl(), Jl(14, t, -10), (_l = -14)); } catch (a) { - (_l = -11), + ((_l = -11), (Dl = e), (Pl = t), (Hl = n), @@ -59653,7 +59718,7 @@ Fl == 0 ? (Zl = i) : ((Il = o), (ql = u), (Zl = u))), - Jl(14, t, -11); + Jl(14, t, -11)); } } } @@ -59955,32 +60020,32 @@ } } function al() { - Vl.startNonterminal("JSONSimpleObjectUnion", Pl), + (Vl.startNonterminal("JSONSimpleObjectUnion", Pl), Sl(278), kl(272), Hl != 281 && (Nl(), G()), Sl(281), - Vl.endNonterminal("JSONSimpleObjectUnion", Pl); + Vl.endNonterminal("JSONSimpleObjectUnion", Pl)); } function fl() { - xl(278), kl(272), Hl != 281 && Y(), xl(281); + (xl(278), kl(272), Hl != 281 && Y(), xl(281)); } function ll() { - Vl.startNonterminal("ObjectConstructor", Pl), + (Vl.startNonterminal("ObjectConstructor", Pl), Sl(276), kl(273), Hl != 282 && (Nl(), hl()), Sl(282), - Vl.endNonterminal("ObjectConstructor", Pl); + Vl.endNonterminal("ObjectConstructor", Pl)); } function cl() { - xl(276), kl(273), Hl != 282 && pl(), xl(282); + (xl(276), kl(273), Hl != 282 && pl(), xl(282)); } function hl() { - Vl.startNonterminal("PairConstructorList", Pl), dl(); + (Vl.startNonterminal("PairConstructorList", Pl), dl()); for (;;) { if (Hl != 41) break; - Sl(41), kl(266), Nl(), dl(); + (Sl(41), kl(266), Nl(), dl()); } Vl.endNonterminal("PairConstructorList", Pl); } @@ -59988,46 +60053,46 @@ vl(); for (;;) { if (Hl != 41) break; - xl(41), kl(266), vl(); + (xl(41), kl(266), vl()); } } function dl() { - Vl.startNonterminal("PairConstructor", Pl), + (Vl.startNonterminal("PairConstructor", Pl), _f(), Sl(49), kl(266), Nl(), _f(), - Vl.endNonterminal("PairConstructor", Pl); + Vl.endNonterminal("PairConstructor", Pl)); } function vl() { - Df(), xl(49), kl(266), Df(); + (Df(), xl(49), kl(266), Df()); } function ml() { - Vl.startNonterminal("ArrayConstructor", Pl), + (Vl.startNonterminal("ArrayConstructor", Pl), Sl(68), kl(271), Hl != 69 && (Nl(), G()), Sl(69), - Vl.endNonterminal("ArrayConstructor", Pl); + Vl.endNonterminal("ArrayConstructor", Pl)); } function gl() { - xl(68), kl(271), Hl != 69 && Y(), xl(69); + (xl(68), kl(271), Hl != 69 && Y(), xl(69)); } function yl() { - Vl.startNonterminal("BlockExpr", Pl), + (Vl.startNonterminal("BlockExpr", Pl), Sl(276), kl(276), Nl(), $a(), Sl(282), - Vl.endNonterminal("BlockExpr", Pl); + Vl.endNonterminal("BlockExpr", Pl)); } function bl() { - xl(276), kl(276), Ja(), xl(282); + (xl(276), kl(276), Ja(), xl(282)); } function wl() { - Vl.startNonterminal("FunctionDecl", Pl), + (Vl.startNonterminal("FunctionDecl", Pl), Sl(145), kl(254), Nl(), @@ -60039,10 +60104,10 @@ Sl(37), kl(148), Hl == 79 && (Nl(), El()), - kl(118); + kl(118)); switch (Hl) { case 276: - Sl(276), kl(276), Nl(), $a(), Sl(282); + (Sl(276), kl(276), Nl(), $a(), Sl(282)); break; default: Sl(133); @@ -60050,12 +60115,12 @@ Vl.endNonterminal("FunctionDecl", Pl); } function El() { - Vl.startNonterminal("ReturnType", Pl), + (Vl.startNonterminal("ReturnType", Pl), Sl(79), kl(259), Nl(), ms(), - Vl.endNonterminal("ReturnType", Pl); + Vl.endNonterminal("ReturnType", Pl)); } function Sl(e) { Hl == e @@ -60081,7 +60146,7 @@ r = Hl, i = Bl, s = jl; - (Hl = e), + ((Hl = e), (Bl = Yl), (jl = Zl), (Fl = 0), @@ -60089,7 +60154,7 @@ (Dl = t), (Pl = n), (Hl = r), - Hl != 0 && ((Bl = i), (jl = s)); + Hl != 0 && ((Bl = i), (jl = s))); } function Nl() { Pl != Bl && (Vl.whitespace(Pl, Bl), (Pl = Bl)); @@ -60109,20 +60174,20 @@ Hl == 0 && ((Hl = Cl(e)), (Bl = Yl), (jl = Zl)); } function Ll(e) { - Fl == 0 && ((Fl = Cl(e)), (Il = Yl), (ql = Zl)), - (_l = (Fl << 9) | Hl); + (Fl == 0 && ((Fl = Cl(e)), (Il = Yl), (ql = Zl)), + (_l = (Fl << 9) | Hl)); } function Al(e) { Hl == 0 && ((Hl = ec(e)), (Bl = Yl), (jl = Zl)); } function Ol(e) { - Fl == 0 && ((Fl = ec(e)), (Il = Yl), (ql = Zl)), - (_l = (Fl << 9) | Hl); + (Fl == 0 && ((Fl = ec(e)), (Il = Yl), (ql = Zl)), + (_l = (Fl << 9) | Hl)); } function Ml(e, t, r, i, s) { throw ( - (t >= Ul && ((Rl = e), (Ul = t), (zl = r), (Wl = i), (Xl = s)), - new n.ParseException(Rl, Ul, zl, Wl, Xl)) + t >= Ul && ((Rl = e), (Ul = t), (zl = r), (Wl = i), (Xl = s)), + new n.ParseException(Rl, Ul, zl, Wl, Xl) ); } function Jl(e, t, n) { @@ -60174,14 +60239,14 @@ } s = o; var p = (u << 12) + o - 1; - (o = i.TRANSITION[(p & 15) + i.TRANSITION[p >> 4]]), - o > 4095 && ((r = o), (o &= 4095), (Zl = n)); + ((o = i.TRANSITION[(p & 15) + i.TRANSITION[p >> 4]]), + o > 4095 && ((r = o), (o &= 4095), (Zl = n))); } r >>= 12; if (r == 0) { Zl = n - 1; var f = Zl < Gl ? Ql.charCodeAt(Zl) : 0; - return f >= 56320 && f < 57344 && --Zl, Ml(Yl, Zl, s, -1, -1); + return (f >= 56320 && f < 57344 && --Zl, Ml(Yl, Zl, s, -1, -1)); } if (t) for (var d = r >> 9; d > 0; --d) { @@ -60194,13 +60259,13 @@ } r(e, t); var n = this; - (this.ParseException = function (e, t, n, r, i) { + ((this.ParseException = function (e, t, n, r, i) { var s = e, o = t, u = n, a = r, f = i; - (this.getBegin = function () { + ((this.getBegin = function () { return s; }), (this.getEnd = function () { @@ -60217,7 +60282,7 @@ }), (this.getMessage = function () { return a < 0 ? "lexical analysis failed" : "syntax error"; - }); + })); }), (this.getInput = function () { return Ql; @@ -60267,13 +60332,13 @@ ); }), (this.parse_XQuery = function () { - Vl.startNonterminal("XQuery", Pl), + (Vl.startNonterminal("XQuery", Pl), kl(274), Nl(), o(), Sl(25), - Vl.endNonterminal("XQuery", Pl); - }); + Vl.endNonterminal("XQuery", Pl)); + })); var _l, Dl, Pl, @@ -60295,7 +60360,7 @@ Yl, Zl; }); - (r.getTokenSet = function (e) { + ((r.getTokenSet = function (e) { var t = [], n = e < 0 ? -e : r.INITIAL[e] & 4095; for (var i = 0; i < 284; i += 32) { @@ -65756,7 +65821,7 @@ "'|}'", "'}'", "'}}'", - ]); + ])); }, {}, ], @@ -65823,7 +65888,7 @@ }, astAsXML: function (e, t) { var n = ""; - (t = t ? t : ""), + ((t = t ? t : ""), e.value && (n += t + @@ -65834,7 +65899,7 @@ "\n"), - (n += t + "<" + e.name + ">\n"); + (n += t + "<" + e.name + ">\n")); var r = this; return ( e.children.forEach(function (e) { @@ -65859,11 +65924,11 @@ r = { description: "" }; return ( n.forEach(function (e, t) { - t === 0 && (e = e.substring(3)), + (t === 0 && (e = e.substring(3)), (e = e.trim()), e[0] === ":" && (e = e.substring(1)), (e = e.trim()), - (r.description += " " + e); + (r.description += " " + e)); }), (r.description = r.description.trim()), (r.description = r.description @@ -65883,7 +65948,7 @@ n.XQDoc = function (e) { "use strict"; var t = {}; - (this.getDoc = function () { + ((this.getDoc = function () { return t; }), (this.WS = function (e) { @@ -65891,9 +65956,9 @@ (e.getParent.comment = i(e.value)); }), (this.AnnotatedDecl = function (e) { - this.visitChildren(e), + (this.visitChildren(e), (e.comment = e.getParent.comment), - (e.getParent.comment = undefined); + (e.getParent.comment = undefined)); }), (this.XQuery = function (e) { this.visitChildren(e); @@ -65908,11 +65973,11 @@ return ( r.forEach(e.variables, function (e) { var n = r.cloneDeep(e.qname); - (n.annotations = e.annotations), + ((n.annotations = e.annotations), (n.description = e.description), (n.type = e.type), (n.occurrence = e.occurrence), - t.variables.push(n); + t.variables.push(n)); }), r.forEach(e.functions, function (e, n) { if ( @@ -65935,8 +66000,8 @@ (this.visit = function (e) { var t = e.name, n = !1; - typeof this[t] == "function" && (n = this[t](e) === !0), - n || this.visitChildren(e); + (typeof this[t] == "function" && (n = this[t](e) === !0), + n || this.visitChildren(e)); }), (this.visitChildren = function (e, t) { for (var n = 0; n < e.children.length; n++) { @@ -65946,7 +66011,7 @@ : this.visit(r); } }), - this.visit(e); + this.visit(e)); }; }, { @@ -65980,14 +66045,14 @@ f = { sl: s - 1, sc: o - 1, el: u - 1, ec: a - 1 }; return f; }; - (n.JSONiqLexer = e("./lexers/jsoniq_lexer").JSONiqLexer), + ((n.JSONiqLexer = e("./lexers/jsoniq_lexer").JSONiqLexer), (n.XQueryLexer = e("./lexers/xquery_lexer").XQueryLexer), (n.XQLint = function (e, t) { r.defaults && (t = r.defaults(t ? t : {}, { styleCheck: !1 })); var n, d, v = t.staticContext ? t.staticContext : h(); - (this.getAST = function () { + ((this.getAST = function () { return n; }), (this.printAST = function () { @@ -65995,9 +66060,9 @@ }), (this.getXQDoc = function () { return d.getXQDoc(v); - }); + })); var m = []; - (this.getMarkers = function () { + ((this.getMarkers = function () { return m; }), (this.getMarkers = function (e) { @@ -66017,7 +66082,7 @@ }), (this.getCompletions = function (t) { return l.complete(e, n, v, t); - }); + })); var g = !1; this.hasSyntaxError = function () { return g; @@ -66034,23 +66099,23 @@ E.parse_XQuery(); } catch (S) { if (!(S instanceof E.ParseException)) throw S; - (g = !0), w.closeParseTree(); + ((g = !0), w.closeParseTree()); var x = p(e, S.getBegin(), S.getEnd()), T = E.getErrorMessage(S); - x.sc === x.ec && x.ec++, + (x.sc === x.ec && x.ec++, m.push({ pos: x, type: "error", level: "error", message: T, - }); + })); } - (n = w.getParseTree()), + ((n = w.getParseTree()), t.styleCheck && (m = m.concat(new a(n, e).getMarkers())), - (d = new f(n)); + (d = new f(n))); var N = new u(v, n); m = m.concat(N.getMarkers()); - }); + })); }, { "../lib/completion/completer": @@ -66148,7 +66213,7 @@ return xt[e]; } function Vt(e, t, n) { - return t ? (e = Ct[e]) : n && (e = kt[e]), "\\" + e; + return (t ? (e = Ct[e]) : n && (e = kt[e]), "\\" + e); } function $t(e) { return "\\" + kt[e]; @@ -66199,7 +66264,7 @@ while (++r < i) { var u = e[r], a = t ? t(u, r, e) : u; - if (!r || n !== a) (n = a), (o[++s] = u); + if (!r || n !== a) ((n = a), (o[++s] = u)); } return o; } @@ -66231,18 +66296,18 @@ } function Bn() {} function jn(e, t, n) { - (this.__wrapped__ = e), + ((this.__wrapped__ = e), (this.__actions__ = n || []), - (this.__chain__ = !!t); + (this.__chain__ = !!t)); } function In(e) { - (this.__wrapped__ = e), + ((this.__wrapped__ = e), (this.__actions__ = []), (this.__dir__ = 1), (this.__filtered__ = !1), (this.__iteratees__ = []), (this.__takeCount__ = Ln), - (this.__views__ = []); + (this.__views__ = [])); } function qn() { var e = new In(this.__wrapped__); @@ -66259,8 +66324,8 @@ function Rn() { if (this.__filtered__) { var e = new In(this); - (e.__dir__ = -1), (e.__filtered__ = !0); - } else (e = this.clone()), (e.__dir__ *= -1); + ((e.__dir__ = -1), (e.__filtered__ = !0)); + } else ((e = this.clone()), (e.__dir__ *= -1)); return e; } function Un() { @@ -66313,7 +66378,7 @@ return e != "__proto__" && Mt.call(this.__data__, e); } function $n(e, t) { - return e != "__proto__" && (this.__data__[e] = t), this; + return (e != "__proto__" && (this.__data__[e] = t), this); } function Jn(e) { var t = e ? e.length : 0; @@ -66511,7 +66576,7 @@ a = Gi(c ? {} : e); if (!t) return pr(a, e); } - o || (o = []), u || (u = []); + (o || (o = []), u || (u = [])); var h = o.length; while (h--) if (o[h] == e) return u[h]; return ( @@ -66553,7 +66618,7 @@ var n = !0; return ( Er(e, function (e, r, i) { - return (n = !!t(e, r, i)), n; + return ((n = !!t(e, r, i)), n); }), n ); @@ -66565,19 +66630,19 @@ Er(e, function (e, o, u) { var a = +t(e, o, u); if (n(a, i) || (a === r && a === s)) - (i = a), (s = e); + ((i = a), (s = e)); }), s ); } function Nr(e, t, n, i) { var s = e.length; - (n = n == null ? 0 : +n || 0), + ((n = n == null ? 0 : +n || 0), n < 0 && (n = -n > s ? 0 : s + n), (i = i === r || i > s ? s : +i || 0), i < 0 && (i += s), (s = n > i ? 0 : i >>> 0), - (n >>>= 0); + (n >>>= 0)); while (n < s) e[n++] = t; return e; } @@ -66594,7 +66659,7 @@ var i; return ( n(e, function (e, n, s) { - if (t(e, n, s)) return (i = r ? n : e), !1; + if (t(e, n, s)) return ((i = r ? n : e), !1); }), i ); @@ -66653,12 +66718,12 @@ a = mu(t), f = T, l = T; - u || + (u || ((f = Dt.call(e)), f == x ? (f = M) : f != M && (u = Pu(e))), a || ((l = Dt.call(t)), - l == x ? (l = M) : l != M && (a = Pu(t))); + l == x ? (l = M) : l != M && (a = Pu(t)))); var c = f == M, h = l == M, p = f == l; @@ -66677,12 +66742,12 @@ ); } if (!p) return !1; - s || (s = []), o || (o = []); + (s || (s = []), o || (o = [])); var m = s.length; while (m--) if (s[m] == e) return o[m] == t; - s.push(e), o.push(t); + (s.push(e), o.push(t)); var g = (u ? Ii : Ri)(e, t, n, r, i, s, o); - return s.pop(), o.pop(), g; + return (s.pop(), o.pop(), g); } function Fr(e, t, n) { var i = t.length, @@ -66747,7 +66812,7 @@ if ((n || !i) && !(u in o)) { o = e.length == 1 ? o : Hr(o, Qr(e, 0, -1)); if (o == null) return !1; - (u = Ps(e)), (o = vs(o)); + ((u = Ps(e)), (o = vs(o))); } return o[u] === t ? t !== r || u in o @@ -66763,17 +66828,17 @@ Zn(u || t, function (a, f) { u && ((f = a), (a = t[f])); if (Kt(a)) - i || (i = []), + (i || (i = []), s || (s = []), - zr(e, t, f, Ur, n, i, s); + zr(e, t, f, Ur, n, i, s)); else { var l = e[f], c = n ? n(l, a, f, e, t) : r, h = c === r; - h && (c = a), + (h && (c = a), (c !== r || (o && !(f in e))) && (h || (c === c ? c !== l : l === l)) && - (e[f] = c); + (e[f] = c)); } }), e @@ -66790,7 +66855,7 @@ var l = e[n], c = s ? s(l, f, n, e, t) : r, h = c === r; - h && + (h && ((c = f), es(f) && (mu(f) || Pu(f)) ? (c = mu(l) ? l : es(l) ? Yn(l) : []) @@ -66798,7 +66863,7 @@ ? (c = vu(l) ? Iu(l) : Mu(l) ? l : {}) : (h = !1)), o.push(f), - u.push(c); + u.push(c)); if (h) e[n] = i(c, f, s, o, u); else if (c === c ? c !== l : l === l) e[n] = c; } @@ -66841,12 +66906,12 @@ function Qr(e, n, i) { var s = -1, o = e.length; - (n = n == null ? 0 : +n || 0), + ((n = n == null ? 0 : +n || 0), n < 0 && (n = -n > o ? 0 : o + n), (i = i === r || i > o ? o : +i || 0), i < 0 && (i += o), (o = n > i ? 0 : (i - n) >>> 0), - (n >>>= 0); + (n >>>= 0)); var u = t(o); while (++s < o) u[s] = e[s + n]; return u; @@ -66855,7 +66920,7 @@ var n; return ( Er(e, function (e, r, i) { - return (n = t(e, r, i)), !n; + return ((n = t(e, r, i)), !n); }), !!n ); @@ -66906,7 +66971,7 @@ if (s && f === f) { var c = u.length; while (c--) if (u[c] === l) continue e; - t && u.push(l), a.push(f); + (t && u.push(l), a.push(f)); } else r(u, l, 0) < 0 && ((t || o) && u.push(l), a.push(f)); @@ -67007,7 +67072,7 @@ function ai(e) { var t = new on(e.byteLength), n = new dn(t); - return n.set(new dn(e)), t; + return (n.set(new dn(e)), t); } function fi(e, n, r) { var i = r.length, @@ -67060,13 +67125,13 @@ o = s > 2 ? n[s - 2] : r, u = s > 2 ? n[2] : r, a = s > 1 ? n[s - 1] : r; - typeof o == "function" + (typeof o == "function" ? ((o = ui(o, a, 5)), (s -= 2)) : ((o = typeof a == "function" ? a : r), (s -= o ? 1 : 0)), u && ns(n[0], n[1], u) && - ((o = s < 3 ? r : o), (s = 1)); + ((o = s < 3 ? r : o), (s = 1))); while (++i < s) { var f = n[i]; f && e(t, f, o); @@ -67165,7 +67230,7 @@ function t(n, i, s) { s && ns(n, i, s) && (i = r); var o = Fi(n, e, r, r, r, r, r, i); - return (o.placeholder = t.placeholder), o; + return ((o.placeholder = t.placeholder), o); } return t; } @@ -67177,7 +67242,7 @@ } function Ei(e, t) { return function (n, i, s) { - s && ns(n, i, s) && (i = r), (i = Ui(i, s, 3)); + (s && ns(n, i, s) && (i = r), (i = Ui(i, s, 3))); if (i.length == 1) { n = mu(n) ? n : ds(n); var o = nr(n, i, e, t); @@ -67205,7 +67270,7 @@ } function Ti(e) { return function (t, n, r) { - return (n = Ui(n, r, 3)), kr(t, n, e, !0); + return ((n = Ui(n, r, 3)), kr(t, n, e, !0)); }; } function Ni(e) { @@ -67277,7 +67342,7 @@ (n = Ui(n, r, 3)), _r(t, function (t, r, s) { var o = n(t, r, s); - (r = e ? o : r), (t = e ? t : o), (i[r] = t); + ((r = e ? o : r), (t = e ? t : o), (i[r] = t)); }), i ); @@ -67312,7 +67377,7 @@ a = u, f = t(u); while (a--) f[a] = arguments[a]; - p && (f = fi(f, p, d)), v && (f = li(f, v, m)); + (p && (f = fi(f, p, d)), v && (f = li(f, v, m))); if (x || N) { var h = k.placeholder, L = Gt(f, h); @@ -67324,13 +67389,15 @@ _ = x ? r : L, D = x ? f : r, P = x ? r : f; - (n |= x ? l : c), + ((n |= x ? l : c), (n &= ~(x ? c : l)), - T || (n &= ~(s | o)); + T || (n &= ~(s | o))); var H = [e, n, i, D, M, P, _, A, y, O], B = Di.apply(r, H); return ( - is(e) && hs(B, H), (B.placeholder = h), B + is(e) && hs(B, H), + (B.placeholder = h), + B ); } } @@ -67403,8 +67470,8 @@ var p = t & o; if (!p && typeof e != "function") throw new Ct(E); var d = i ? i.length : 0; - d || ((t &= ~(l | c)), (i = u = r)), - (d -= u ? u.length : 0); + (d || ((t &= ~(l | c)), (i = u = r)), + (d -= u ? u.length : 0)); if (t & c) { var v = i, m = u; @@ -67412,9 +67479,13 @@ } var g = p ? r : zi(e), y = [e, t, n, i, u, v, m, a, f, h]; - g && (us(y, g), (t = y[1]), (h = y[9])), + (g && (us(y, g), (t = y[1]), (h = y[9])), (y[9] = - h == null ? (p ? 0 : e.length) : Sn(h - d, 0) || 0); + h == null + ? p + ? 0 + : e.length + : Sn(h - d, 0) || 0)); if (t == s) var b = vi(y[0], y[2]); else (t != l && t != (s | l)) || !!y[4].length @@ -67502,7 +67573,7 @@ } function Ui(e, t, n) { var r = Hn.callback || Fa; - return (r = r === Fa ? mr : r), n ? r(e, t, n) : r; + return ((r = r === Fa ? mr : r), n ? r(e, t, n) : r); } function Wi(e) { var t = e.name, @@ -67517,7 +67588,7 @@ } function Xi(e, t, n) { var r = Hn.indexOf || Ms; - return (r = r === Ms ? jt : r), e ? r(e, t, n) : r; + return ((r = r === Ms ? jt : r), e ? r(e, t, n) : r); } function $i(e) { var t = oa(e), @@ -67669,8 +67740,8 @@ var l = t[3]; if (l) { var c = e[3]; - (e[3] = c ? fi(c, l, t[4]) : Yn(l)), - (e[4] = c ? Gt(e[3], S) : Yn(t[4])); + ((e[3] = c ? fi(c, l, t[4]) : Yn(l)), + (e[4] = c ? Gt(e[3], S) : Yn(t[4]))); } return ( (l = t[5]), @@ -67786,7 +67857,7 @@ var r = e ? e.length : 0; if (!r) return []; if (n ? ns(e, t, n) : t == null) t = 1; - return (t = r - (+t || 0)), Qr(e, 0, t < 0 ? 0 : t); + return ((t = r - (+t || 0)), Qr(e, 0, t < 0 ? 0 : t)); } function xs(e, t, n) { return e && e.length ? ri(e, Ui(t, n, 3), !0, !0) : []; @@ -67809,7 +67880,7 @@ } function As(e, t, n) { var r = e ? e.length : 0; - return n && ns(e, t, n) && (t = !1), r ? Lr(e, t) : []; + return (n && ns(e, t, n) && (t = !1), r ? Lr(e, t) : []); } function Os(e) { var t = e ? e.length : 0; @@ -67874,7 +67945,7 @@ var u = e[i]; t(u, i, e) && (r.push(u), s.push(i)); } - return Vr(e, s), r; + return (Vr(e, s), r); } function Is(e) { return Es(e, 1); @@ -67899,7 +67970,7 @@ var r = e ? e.length : 0; if (!r) return []; if (n ? ns(e, t, n) : t == null) t = 1; - return (t = r - (+t || 0)), Qr(e, t < 0 ? 0 : t); + return ((t = r - (+t || 0)), Qr(e, t < 0 ? 0 : t)); } function Xs(e, t, n) { return e && e.length ? ri(e, Ui(t, n, 3), !1, !0) : []; @@ -67922,7 +67993,7 @@ var n = -1, r = 0; e = rr(e, function (e) { - if (es(e)) return (r = Sn(e.length, r)), !0; + if (es(e)) return ((r = Sn(e.length, r)), !0); }); var i = t(r); while (++n < r) i[n] = ir(e, Wr(n)); @@ -67961,10 +68032,10 @@ } function no(e) { var t = Hn(e); - return (t.__chain__ = !0), t; + return ((t.__chain__ = !0), t); } function ro(e, t, n) { - return t.call(n, e), e; + return (t.call(n, e), e); } function io(e, t, n) { return t.call(n, e); @@ -67984,7 +68055,7 @@ var i = r; n = n.__wrapped__; } - return (i.__wrapped__ = e), t; + return ((i.__wrapped__ = e), t); } function fo() { var e = this.__wrapped__, @@ -68020,7 +68091,7 @@ } function mo(e, t, n) { var r = mu(e) ? rr : Cr; - return (t = Ui(t, n, 3)), r(e, t); + return ((t = Ui(t, n, 3)), r(e, t)); } function bo(e, t) { return go(e, qr(t)); @@ -68039,7 +68110,7 @@ } function Co(e, t, n) { var r = mu(e) ? ir : Ir; - return (t = Ui(t, n, 3)), r(e, t); + return ((t = Ui(t, n, 3)), r(e, t)); } function Lo(e, t) { return Co(e, Ja(t)); @@ -68067,9 +68138,9 @@ while (++s < t) { var a = $r(s, u), f = o[a]; - (o[a] = o[s]), (o[s] = f); + ((o[a] = o[s]), (o[s] = f)); } - return (o.length = t), o; + return ((o.length = t), o); } function Do(e) { return _o(e, Ln); @@ -68109,7 +68180,7 @@ if (typeof t != "function") { if (typeof e != "function") throw new Ct(E); var n = e; - (e = t), (t = n); + ((e = t), (t = n)); } return ( (e = wn((e = +e)) ? e : 0), @@ -68130,7 +68201,7 @@ if (typeof t != "function") { if (typeof e != "function") throw new Ct(E); var i = e; - (e = t), (t = i); + ((e = t), (t = i)); } return function () { return ( @@ -68142,15 +68213,15 @@ } function Ko(e, t, n) { function v() { - f && un(f), s && un(s), (c = 0), (s = f = l = r); + (f && un(f), s && un(s), (c = 0), (s = f = l = r)); } function m(t, n) { - n && un(n), + (n && un(n), (s = f = l = r), t && ((c = qo()), (o = e.apply(a, i)), - !f && !s && (i = a = r)); + !f && !s && (i = a = r))); } function g() { var e = t - (qo() - u); @@ -68160,10 +68231,10 @@ m(p, f); } function b() { - (i = arguments), + ((i = arguments), (u = qo()), (a = this), - (l = p && (f || !d)); + (l = p && (f || !d))); if (h === !1) var n = d && !f; else { !s && !d && (c = u); @@ -68204,7 +68275,7 @@ ((d = !!n.leading), (h = "maxWait" in n && Sn(+n.maxWait || 0, t)), (p = "trailing" in n ? !!n.trailing : p)); - return (b.cancel = v), b; + return ((b.cancel = v), b); } function eu(e, t) { if (typeof e != "function" || (t && typeof t != "function")) @@ -68215,9 +68286,9 @@ s = n.cache; if (s.has(i)) return s.get(i); var o = e.apply(this, r); - return (n.cache = s.set(i, o)), o; + return ((n.cache = s.set(i, o)), o); }; - return (n.cache = new eu.Cache()), n; + return ((n.cache = new eu.Cache()), n); } function nu(e) { if (typeof e != "function") throw new Ct(E); @@ -68249,7 +68320,7 @@ var u = t(n + 1); i = -1; while (++i < n) u[i] = r[i]; - return (u[n] = o), e.apply(this, u); + return ((u[n] = o), e.apply(this, u)); } ); } @@ -68273,7 +68344,7 @@ ); } function lu(e, t) { - return (t = t == null ? qa : t), Fi(t, l, r, [e], []); + return ((t = t == null ? qa : t), Fi(t, l, r, [e], [])); } function cu(e, t, n, r) { return ( @@ -68410,7 +68481,7 @@ } function Uu(e, t, n) { var i = yr(e); - return n && ns(e, t, n) && (t = r), t ? pr(i, t) : i; + return (n && ns(e, t, n) && (t = r), t ? pr(i, t) : i); } function Gu(e) { return Pr(e, na(e)); @@ -68423,10 +68494,10 @@ if (e == null) return !1; var n = Mt.call(e, t); if (!n && !rs(t)) { - (t = ms(t)), - (e = t.length == 1 ? e : Hr(e, Qr(t, 0, -1))); + ((t = ms(t)), + (e = t.length == 1 ? e : Hr(e, Qr(t, 0, -1)))); if (e == null) return !1; - (t = Ps(t)), (n = Mt.call(e, t)); + ((t = Ps(t)), (n = Mt.call(e, t))); } return ( n || @@ -68502,12 +68573,12 @@ u = e; while (u != null && ++i < s) { var a = t[i]; - Nu(u) && + (Nu(u) && (i == o ? (u[a] = n) : u[a] == null && (u[a] = ts(t[i + 1]) ? [] : {})), - (u = u[a]); + (u = u[a])); } return e; } @@ -68545,13 +68616,13 @@ n && ns(e, t, n) && (t = n = r); var i = e == null, s = t == null; - n == null && + (n == null && (s && typeof e == "boolean" ? ((n = e), (e = 1)) : typeof t == "boolean" && ((n = t), (s = !0))), i && s && ((t = 1), (s = !1)), (e = +e || 0), - s ? ((t = e), (e = 0)) : (t = +t || 0); + s ? ((t = e), (e = 0)) : (t = +t || 0)); if (n || e % 1 || t % 1) { var o = Cn(); return xn( @@ -68563,14 +68634,18 @@ } function ma(e) { return ( - (e = It(e)), e && e.charAt(0).toUpperCase() + e.slice(1) + (e = It(e)), + e && e.charAt(0).toUpperCase() + e.slice(1) ); } function ga(e) { - return (e = It(e)), e && e.replace(dt, Wt).replace(ut, ""); + return ( + (e = It(e)), + e && e.replace(dt, Wt).replace(ut, "") + ); } function ya(e, t, n) { - (e = It(e)), (t += ""); + ((e = It(e)), (t += "")); var i = e.length; return ( (n = n === r ? i : xn(n < 0 ? 0 : +n || 0, i)), @@ -68579,7 +68654,7 @@ ); } function ba(e) { - return (e = It(e)), e && Y.test(e) ? e.replace(Q, Xt) : e; + return ((e = It(e)), e && Y.test(e) ? e.replace(Q, Xt) : e); } function wa(e) { return ( @@ -68588,13 +68663,13 @@ ); } function Sa(e, t, n) { - (e = It(e)), (t = +t); + ((e = It(e)), (t = +t)); var r = e.length; if (r >= t || !wn(t)) return e; var i = (t - r) / 2, s = yn(i), o = mn(i); - return (n = Pi("", o, n)), n.slice(0, s) + e + n; + return ((n = Pi("", o, n)), n.slice(0, s) + e + n); } function Na(e, t, n) { return ( @@ -68605,9 +68680,9 @@ } function Ca(e, t) { var n = ""; - (e = It(e)), (t = +t); + ((e = It(e)), (t = +t)); if (t < 1 || !e || !wn(t)) return n; - do t % 2 && (n += e), (t = yn(t / 2)), (e += e); + do (t % 2 && (n += e), (t = yn(t / 2)), (e += e)); while (t); return n; } @@ -68620,9 +68695,9 @@ } function Oa(e, t, n) { var i = Hn.templateSettings; - n && ns(e, t, n) && (t = n = r), + (n && ns(e, t, n) && (t = n = r), (e = It(e)), - (t = hr(pr({}, n || t), i, cr)); + (t = hr(pr({}, n || t), i, cr))); var s = hr(pr({}, t.imports), i.imports, cr), o = ta(s), u = ni(s, o), @@ -68648,7 +68723,7 @@ ? t.sourceURL : "lodash.templateSources[" + ++bt + "]") + "\n"; - e.replace(p, function (t, n, r, i, s, o) { + (e.replace(p, function (t, n, r, i, s, o) { return ( r || (r = i), (h += e.slice(l, o).replace(mt, $t)), @@ -68663,9 +68738,9 @@ t ); }), - (h += "';\n"); + (h += "';\n")); var v = t.variable; - v || (h = "with (obj) {\n" + h + "\n}\n"), + (v || (h = "with (obj) {\n" + h + "\n}\n"), (h = (f ? h.replace(V, "") : h) .replace($, "$1") .replace(J, "$1;")), @@ -68680,7 +68755,7 @@ ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + h + - "return __p\n}"); + "return __p\n}")); var m = ja(function () { return D(o, d + "return " + h).apply(r, u); }); @@ -68728,8 +68803,8 @@ if (t != null) if (Nu(t)) { var o = "separator" in t ? t.separator : o; - (i = "length" in t ? +t.length || 0 : i), - (s = "omission" in t ? It(t.omission) : s); + ((i = "length" in t ? +t.length || 0 : i), + (s = "omission" in t ? It(t.omission) : s)); } else i = +t || 0; e = It(e); if (i >= e.length) return e; @@ -68742,9 +68817,9 @@ var f, l, c = e.slice(0, u); - o.global || + (o.global || (o = Tt(o.source, (lt.exec(o) || "") + "g")), - (o.lastIndex = 0); + (o.lastIndex = 0)); while ((f = o.exec(c))) l = f.index; a = a.slice(0, l == null ? u : l); } @@ -68755,7 +68830,7 @@ return a + s; } function Ha(e) { - return (e = It(e)), e && G.test(e) ? e.replace(K, tn) : e; + return ((e = It(e)), e && G.test(e) ? e.replace(K, tn) : e); } function Ba(e, t, n) { return ( @@ -68766,7 +68841,8 @@ } function Fa(e, t, n) { return ( - n && ns(e, t, n) && (t = r), Kt(e) ? Ra(e) : mr(e, t) + n && ns(e, t, n) && (t = r), + Kt(e) ? Ra(e) : mr(e, t) ); } function Ia(e) { @@ -68789,7 +68865,7 @@ s = i ? ta(t) : r, o = s && s.length ? Pr(t, s) : r; if (o ? !o.length : !i) - (o = !1), (n = t), (t = e), (e = this); + ((o = !1), (n = t), (t = e), (e = this)); } o || (o = Pr(t, ta(t))); var u = !0, @@ -68802,7 +68878,7 @@ while (++a < l) { var c = o[a], h = t[c]; - (e[c] = h), + ((e[c] = h), f && (e.prototype[c] = (function (t) { return function () { @@ -68827,12 +68903,12 @@ sr([this.value()], arguments), ); }; - })(h)); + })(h))); } return e; } function Va() { - return (Pt._ = Qt), this; + return ((Pt._ = Qt), this); } function $a() {} function Ja(e) { @@ -68844,14 +68920,14 @@ }; } function Qa(e, n, i) { - i && ns(e, n, i) && (n = i = r), + (i && ns(e, n, i) && (n = i = r), (e = +e || 0), (i = i == null ? 1 : +i || 0), - n == null ? ((n = e), (e = 0)) : (n = +n || 0); + n == null ? ((n = e), (e = 0)) : (n = +n || 0)); var s = -1, o = Sn(mn((n - e) / (i || 1)), 0), u = t(o); - while (++s < o) (u[s] = e), (e += i); + while (++s < o) ((u[s] = e), (e += i)); return u; } function Ga(e, n, r) { @@ -68960,7 +69036,7 @@ Or = di(!0), Kr = Dn ? function (e, t) { - return Dn.set(e, t), e; + return (Dn.set(e, t), e); } : qa, zi = Dn @@ -69011,7 +69087,7 @@ if ((p ? Kn(p, a) : s(e[r], a, 0)) < 0) continue e; } - h && h.push(a), u.push(a); + (h && h.push(a), u.push(a)); } } return u; @@ -69019,7 +69095,7 @@ js = uu(function (e, t) { t = Lr(t); var n = dr(e, t); - return Vr(e, t.sort(Ht)), n; + return (Vr(e, t.sort(Ht)), n); }), Rs = ji(), Us = ji(!0), @@ -69517,7 +69593,7 @@ }, ), Zn(["drop", "take"], function (e, t) { - (In.prototype[e] = function (n) { + ((In.prototype[e] = function (n) { var r = this.__filtered__; if (r && !t) return new In(this); n = n == null ? 1 : Sn(yn(n) || 0, 0); @@ -69536,7 +69612,7 @@ }), (In.prototype[e + "Right"] = function (t) { return this.reverse()[e](t).reverse(); - }); + })); }), Zn(["filter", "map", "takeWhile"], function (e, t) { var n = t + 1, @@ -69644,7 +69720,7 @@ if (!i && c) { u = d ? u : new In(this); var v = e.apply(u, t); - return v.__actions__.push(p), new jn(v, o); + return (v.__actions__.push(p), new jn(v, o)); } return this.thru(h); }; @@ -69829,7 +69905,7 @@ ], bt = -1, wt = {}; - (wt[j] = + ((wt[j] = wt[F] = wt[I] = wt[q] = @@ -69853,9 +69929,9 @@ wt[D] = wt[P] = wt[H] = - !1); + !1)); var Et = {}; - (Et[x] = + ((Et[x] = Et[T] = Et[B] = Et[N] = @@ -69874,7 +69950,7 @@ Et[W] = Et[X] = !0), - (Et[k] = Et[L] = Et[A] = Et[D] = Et[H] = !1); + (Et[k] = Et[L] = Et[A] = Et[D] = Et[H] = !1)); var St = { "\u00c0": "A", "\u00c1": "A", @@ -70047,10 +70123,10 @@ s = {}; return ( r.functions.forEach(function (e) { - (s[t + "#" + e.name + "#" + e.arity] = { params: [] }), + ((s[t + "#" + e.name + "#" + e.arity] = { params: [] }), e.parameters.forEach(function (n) { s[t + "#" + e.name + "#" + e.arity].params.push("$" + n.name); - }); + })); }), r.variables.forEach(function (e) { var n = e.name.substring(e.name.indexOf(":") + 1); @@ -70061,9 +70137,9 @@ }; }, a = (t.XQueryWorker = function (e) { - i.call(this, e), this.setTimeout(200); + (i.call(this, e), this.setTimeout(200)); var t = this; - this.sender.on("complete", function (e) { + (this.sender.on("complete", function (e) { if (t.xqlint) { var n = { line: e.data.pos.row, col: e.data.pos.column }, r = t.xqlint.getCompletions(n); @@ -70078,32 +70154,32 @@ }), this.sender.on("setModuleResolver", function (e) { t.moduleResolver = u(e.data); - }); + })); }); - r.inherits(a, i), + (r.inherits(a, i), function () { this.onUpdate = function () { this.sender.emit("start"); var e = this.doc.getValue(), t = s.createStaticContext(); - this.moduleResolver && t.setModuleResolver(this.moduleResolver), + (this.moduleResolver && t.setModuleResolver(this.moduleResolver), this.availableModuleNamespaces && - (t.availableModuleNamespaces = this.availableModuleNamespaces); + (t.availableModuleNamespaces = this.availableModuleNamespaces)); var n = { styleCheck: this.styleCheck, staticContext: t, fileName: this.fileName, }; - (this.xqlint = new o(e, n)), - this.sender.emit("markers", this.xqlint.getMarkers()); + ((this.xqlint = new o(e, n)), + this.sender.emit("markers", this.xqlint.getMarkers())); }; - }.call(a.prototype); + }.call(a.prototype)); }), define("ace/lib/es5-shim", [], function (e, t, n) { function r() {} function w(e) { try { - return Object.defineProperty(e, "sentinel", {}), "sentinel" in e; + return (Object.defineProperty(e, "sentinel", {}), "sentinel" in e); } catch (t) {} } function H(e) { @@ -70176,35 +70252,35 @@ p, d; if ((d = f(o, "__defineGetter__"))) - (l = i.bind(o.__defineGetter__)), + ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), - (p = i.bind(o.__lookupSetter__)); + (p = i.bind(o.__lookupSetter__))); if ([1, 2].splice(0).length != 2) if ( !(function () { function e(e) { var t = new Array(e + 2); - return (t[0] = t[1] = 0), t; + return ((t[0] = t[1] = 0), t); } var t = [], n; - t.splice.apply(t, e(20)), + (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, "XXX"), - n + 1 == t.length; + n + 1 == t.length); if (n + 1 == t.length) return !0; })() ) Array.prototype.splice = function (e, t) { var n = this.length; - e > 0 + (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), - e + t < n || (t = n - e); + e + t < n || (t = n - e)); var r = this.slice(e, e + t), i = u.call(arguments, 2), s = i.length; @@ -70217,7 +70293,7 @@ c = n - o; if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h]; else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h]; - if (s && e === c) (this.length = c), this.push.apply(this, i); + if (s && e === c) ((this.length = c), this.push.apply(this, i)); else { this.length = c + s; for (h = 0; h < s; ++h) this[e + h] = i[h]; @@ -70244,7 +70320,7 @@ }); var m = Object("a"), g = m[0] != "a" || !(0 in m); - Array.prototype.forEach || + (Array.prototype.forEach || (Array.prototype.forEach = function (t) { var n = F(this), r = g && a(this) == "[object String]" ? this.split("") : n, @@ -70346,15 +70422,15 @@ do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--); return s; - }); + })); if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function (t) { var n = g && a(this) == "[object String]" ? this.split("") : F(this), r = n.length >>> 0; if (!r) return -1; var i = 0; - arguments.length > 1 && (i = H(arguments[1])), - (i = i >= 0 ? i : Math.max(0, r + i)); + (arguments.length > 1 && (i = H(arguments[1])), + (i = i >= 0 ? i : Math.max(0, r + i))); for (; i < r; i++) if (i in n && n[i] === t) return i; return -1; }; @@ -70364,8 +70440,8 @@ r = n.length >>> 0; if (!r) return -1; var i = r - 1; - arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), - (i = i >= 0 ? i : r - Math.abs(i)); + (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), + (i = i >= 0 ? i : r - Math.abs(i))); for (; i >= 0; i--) if (i in n && t === n[i]) return i; return -1; }; @@ -70387,9 +70463,9 @@ var i = h(t, n), s = p(t, n); t.__proto__ = u; - if (i || s) return i && (r.get = i), s && (r.set = s), r; + if (i || s) return (i && (r.get = i), s && (r.set = s), r); } - return (r.value = t[n]), r; + return ((r.value = t[n]), r); }; } Object.getOwnPropertyNames || @@ -70398,7 +70474,7 @@ }); if (!Object.create) { var b; - Object.prototype.__proto__ === null + (Object.prototype.__proto__ === null ? (b = function () { return { __proto__: null }; }) @@ -70425,10 +70501,10 @@ if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'"); var i = function () {}; - (i.prototype = t), (r = new i()), (r.__proto__ = t); + ((i.prototype = t), (r = new i()), (r.__proto__ = t)); } - return n !== void 0 && Object.defineProperties(r, n), r; - }); + return (n !== void 0 && Object.defineProperties(r, n), r); + })); } if (Object.defineProperty) { var E = w({}), @@ -70451,16 +70527,16 @@ if (f(r, "value")) if (d && (h(t, n) || p(t, n))) { var s = t.__proto__; - (t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s); + ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s)); } else t[n] = r.value; else { if (!d) throw new TypeError(C); - f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set); + (f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)); } return t; }; } - Object.defineProperties || + (Object.defineProperties || (Object.defineProperties = function (t, n) { for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]); return t; @@ -70472,7 +70548,7 @@ Object.freeze || (Object.freeze = function (t) { return t; - }); + })); try { Object.freeze(function () {}); } catch (k) { @@ -70482,7 +70558,7 @@ }; })(Object.freeze); } - Object.preventExtensions || + (Object.preventExtensions || (Object.preventExtensions = function (t) { return t; }), @@ -70501,8 +70577,8 @@ while (f(t, n)) n += "?"; t[n] = !0; var r = f(t, n); - return delete t[n], r; - }); + return (delete t[n], r); + })); if (!Object.keys) { var L = !0, A = [ @@ -70547,4 +70623,4 @@ if (e == null) throw new TypeError("can't convert " + e + " to object"); return Object(e); }; - }); + })); diff --git a/web/static/jquery/jquery.ui-contextmenu.min.js b/web/static/jquery/jquery.ui-contextmenu.min.js index 5514631c6..f749cdb49 100644 --- a/web/static/jquery/jquery.ui-contextmenu.min.js +++ b/web/static/jquery/jquery.ui-contextmenu.min.js @@ -12,7 +12,7 @@ d = { major: parseInt(c[1], 10), minor: parseInt(c[2], 10) }, e = d.major < 2 && d.minor <= 10, f = d.major < 2 && d.minor <= 11; - a.widget("moogle.contextmenu", { + (a.widget("moogle.contextmenu", { version: "@VERSION", options: { addClass: "ui-contextmenu", @@ -55,7 +55,7 @@ a.error("ui-contextmenu: Missing required option `delegate`."), f.preventSelect) ) { - (e = (a(this.element).is(document) ? a("body") : this.element) + ((e = (a(this.element).is(document) ? a("body") : this.element) .uniqueId() .attr("id")), (c = @@ -66,7 +66,7 @@ " { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }"), (this.$headStyle = a("